diff options
author | Abhi Das <adas@redhat.com> | 2015-03-18 12:03:41 -0500 |
---|---|---|
committer | Bob Peterson <rpeterso@redhat.com> | 2015-03-18 12:46:54 -0500 |
commit | b8fbf471edb3dbf441716fd2a52a7ca76c381381 (patch) | |
tree | a5a2132cc29397dd1f1d8892497dbf18b2fb125f /fs/gfs2/aops.c | |
parent | f1ea6f4ec0a48d7b6bbf4d380a0ac14d69fadb44 (diff) | |
download | linux-b8fbf471edb3dbf441716fd2a52a7ca76c381381.tar.gz linux-b8fbf471edb3dbf441716fd2a52a7ca76c381381.tar.bz2 linux-b8fbf471edb3dbf441716fd2a52a7ca76c381381.zip |
gfs2: perform quota checks against allocation parameters
Use struct gfs2_alloc_parms as an argument to gfs2_quota_check()
and gfs2_quota_lock_check() to check for quota violations while
accounting for the new blocks requested by the current operation
in ap->target.
Previously, the number of new blocks requested during an operation
were not accounted for during quota_check and would allow these
operations to exceed quota. This was not very apparent since most
operations allocated only 1 block at a time and quotas would get
violated in the next operation. i.e. quota excess would only be by
1 block or so. With fallocate, (where we allocate a bunch of blocks
at once) the quota excess is non-trivial and is addressed by this
patch.
Signed-off-by: Abhi Das <adas@redhat.com>
Signed-off-by: Bob Peterson <rpeterso@redhat.com>
Acked-by: Steven Whitehouse <swhiteho@redhat.com>
Diffstat (limited to 'fs/gfs2/aops.c')
-rw-r--r-- | fs/gfs2/aops.c | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/fs/gfs2/aops.c b/fs/gfs2/aops.c index 4ad4f94edebe..7bc5c82423ea 100644 --- a/fs/gfs2/aops.c +++ b/fs/gfs2/aops.c @@ -671,12 +671,12 @@ static int gfs2_write_begin(struct file *file, struct address_space *mapping, if (alloc_required) { struct gfs2_alloc_parms ap = { .aflags = 0, }; - error = gfs2_quota_lock_check(ip); + requested = data_blocks + ind_blocks; + ap.target = requested; + error = gfs2_quota_lock_check(ip, &ap); if (error) goto out_unlock; - requested = data_blocks + ind_blocks; - ap.target = requested; error = gfs2_inplace_reserve(ip, &ap); if (error) goto out_qunlock; |