]> git.ipfire.org Git - people/pmueller/ipfire-2.x.git/blame - src/patches/suse-2.6.27.39/patches.suse/quota-Allow-negative-usage-of-space-and-inodes.patch
Fix oinkmaster patch.
[people/pmueller/ipfire-2.x.git] / src / patches / suse-2.6.27.39 / patches.suse / quota-Allow-negative-usage-of-space-and-inodes.patch
CommitLineData
2cb7cef9
BS
1From: Jan Kara <jack@suse.cz>
2References: fate#302681
3Subject: [PATCH 14/28] quota: Allow negative usage of space and inodes
4Patch-mainline: 2.6.29?
5
6For clustered filesystems, it can happen that space / inode usage goes
7negative temporarily (because some node is allocating another node
8is freeing and they are not completely in sync). So let quota code
9allow this and change qsize_t so a signed type so that we don't
10underflow the variables.
11
12Signed-off-by: Jan Kara <jack@suse.cz>
13---
14 fs/dquot.c | 6 ++++--
15 include/linux/quota.h | 3 ++-
16 2 files changed, 6 insertions(+), 3 deletions(-)
17
18diff --git a/fs/dquot.c b/fs/dquot.c
19index 904bd67..f4258fe 100644
20--- a/fs/dquot.c
21+++ b/fs/dquot.c
22@@ -845,7 +845,8 @@ static inline void dquot_incr_space(struct dquot *dquot, qsize_t number)
23
24 static inline void dquot_decr_inodes(struct dquot *dquot, qsize_t number)
25 {
26- if (dquot->dq_dqb.dqb_curinodes > number)
27+ if (sb_dqopt(dquot->dq_sb)->flags & DQUOT_NEGATIVE_USAGE ||
28+ dquot->dq_dqb.dqb_curinodes >= number)
29 dquot->dq_dqb.dqb_curinodes -= number;
30 else
31 dquot->dq_dqb.dqb_curinodes = 0;
32@@ -856,7 +857,8 @@ static inline void dquot_decr_inodes(struct dquot *dquot, qsize_t number)
33
34 static inline void dquot_decr_space(struct dquot *dquot, qsize_t number)
35 {
36- if (dquot->dq_dqb.dqb_curspace > number)
37+ if (sb_dqopt(dquot->dq_sb)->flags & DQUOT_NEGATIVE_USAGE ||
38+ dquot->dq_dqb.dqb_curspace >= number)
39 dquot->dq_dqb.dqb_curspace -= number;
40 else
41 dquot->dq_dqb.dqb_curspace = 0;
42diff --git a/include/linux/quota.h b/include/linux/quota.h
43index e05c30d..0ee2a55 100644
44--- a/include/linux/quota.h
45+++ b/include/linux/quota.h
46@@ -170,7 +170,7 @@ enum {
47 #include <asm/atomic.h>
48
49 typedef __kernel_uid32_t qid_t; /* Type in which we store ids in memory */
50-typedef __u64 qsize_t; /* Type in which we store sizes */
51+typedef __s64 qsize_t; /* Type in which we store sizes */
52
53 extern spinlock_t dq_data_lock;
54
55@@ -338,6 +338,7 @@ enum {
56 * responsible for setting
57 * S_NOQUOTA, S_NOATIME flags
58 */
59+#define DQUOT_NEGATIVE_USAGE (1 << 7) /* Allow negative quota usage */
60
61 static inline unsigned int dquot_state_flag(unsigned int flags, int type)
62 {
63--
641.5.2.4
65