diff options
author | Abhi Das <adas@redhat.com> | 2015-03-18 13:03:41 -0400 |
---|---|---|
committer | Bob Peterson <rpeterso@redhat.com> | 2015-03-18 13:46:54 -0400 |
commit | b8fbf471edb3dbf441716fd2a52a7ca76c381381 (patch) | |
tree | a5a2132cc29397dd1f1d8892497dbf18b2fb125f /fs/gfs2/quota.h | |
parent | f1ea6f4ec0a48d7b6bbf4d380a0ac14d69fadb44 (diff) |
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/quota.h')
-rw-r--r-- | fs/gfs2/quota.h | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/fs/gfs2/quota.h b/fs/gfs2/quota.h index 55d506eb3c4a..ad04b3acae2b 100644 --- a/fs/gfs2/quota.h +++ b/fs/gfs2/quota.h | |||
@@ -24,7 +24,8 @@ extern void gfs2_quota_unhold(struct gfs2_inode *ip); | |||
24 | extern int gfs2_quota_lock(struct gfs2_inode *ip, kuid_t uid, kgid_t gid); | 24 | extern int gfs2_quota_lock(struct gfs2_inode *ip, kuid_t uid, kgid_t gid); |
25 | extern void gfs2_quota_unlock(struct gfs2_inode *ip); | 25 | extern void gfs2_quota_unlock(struct gfs2_inode *ip); |
26 | 26 | ||
27 | extern int gfs2_quota_check(struct gfs2_inode *ip, kuid_t uid, kgid_t gid); | 27 | extern int gfs2_quota_check(struct gfs2_inode *ip, kuid_t uid, kgid_t gid, |
28 | struct gfs2_alloc_parms *ap); | ||
28 | extern void gfs2_quota_change(struct gfs2_inode *ip, s64 change, | 29 | extern void gfs2_quota_change(struct gfs2_inode *ip, s64 change, |
29 | kuid_t uid, kgid_t gid); | 30 | kuid_t uid, kgid_t gid); |
30 | 31 | ||
@@ -37,7 +38,8 @@ extern int gfs2_quotad(void *data); | |||
37 | 38 | ||
38 | extern void gfs2_wake_up_statfs(struct gfs2_sbd *sdp); | 39 | extern void gfs2_wake_up_statfs(struct gfs2_sbd *sdp); |
39 | 40 | ||
40 | static inline int gfs2_quota_lock_check(struct gfs2_inode *ip) | 41 | static inline int gfs2_quota_lock_check(struct gfs2_inode *ip, |
42 | struct gfs2_alloc_parms *ap) | ||
41 | { | 43 | { |
42 | struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode); | 44 | struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode); |
43 | int ret; | 45 | int ret; |
@@ -48,7 +50,7 @@ static inline int gfs2_quota_lock_check(struct gfs2_inode *ip) | |||
48 | return ret; | 50 | return ret; |
49 | if (sdp->sd_args.ar_quota != GFS2_QUOTA_ON) | 51 | if (sdp->sd_args.ar_quota != GFS2_QUOTA_ON) |
50 | return 0; | 52 | return 0; |
51 | ret = gfs2_quota_check(ip, ip->i_inode.i_uid, ip->i_inode.i_gid); | 53 | ret = gfs2_quota_check(ip, ip->i_inode.i_uid, ip->i_inode.i_gid, ap); |
52 | if (ret) | 54 | if (ret) |
53 | gfs2_quota_unlock(ip); | 55 | gfs2_quota_unlock(ip); |
54 | return ret; | 56 | return ret; |