]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
.32 quota patch
authorGreg Kroah-Hartman <gregkh@suse.de>
Mon, 19 Apr 2010 21:49:55 +0000 (14:49 -0700)
committerGreg Kroah-Hartman <gregkh@suse.de>
Mon, 19 Apr 2010 21:49:55 +0000 (14:49 -0700)
queue-2.6.32/quota-fix-possible-dq_flags-corruption.patch [new file with mode: 0644]
queue-2.6.32/series

diff --git a/queue-2.6.32/quota-fix-possible-dq_flags-corruption.patch b/queue-2.6.32/quota-fix-possible-dq_flags-corruption.patch
new file mode 100644 (file)
index 0000000..d6b526d
--- /dev/null
@@ -0,0 +1,65 @@
+From 08261673cb6dc638c39f44d69b76fffb57b92a8b Mon Sep 17 00:00:00 2001
+From: Andrew Perepechko <andrew.perepechko@sun.com>
+Date: Mon, 12 Apr 2010 22:16:50 +0400
+Subject: quota: Fix possible dq_flags corruption
+
+From: Andrew Perepechko <andrew.perepechko@sun.com>
+
+commit 08261673cb6dc638c39f44d69b76fffb57b92a8b upstream.
+
+dq_flags are modified non-atomically in do_set_dqblk via __set_bit calls and
+atomically for example in mark_dquot_dirty or clear_dquot_dirty.  Hence a
+change done by an atomic operation can be overwritten by a change done by a
+non-atomic one. Fix the problem by using atomic bitops even in do_set_dqblk.
+
+Signed-off-by: Andrew Perepechko <andrew.perepechko@sun.com>
+Signed-off-by: Jan Kara <jack@suse.cz>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ fs/quota/dquot.c |   12 ++++++------
+ 1 file changed, 6 insertions(+), 6 deletions(-)
+
+--- a/fs/quota/dquot.c
++++ b/fs/quota/dquot.c
+@@ -2389,34 +2389,34 @@ static int do_set_dqblk(struct dquot *dq
+       if (di->dqb_valid & QIF_SPACE) {
+               dm->dqb_curspace = di->dqb_curspace - dm->dqb_rsvspace;
+               check_blim = 1;
+-              __set_bit(DQ_LASTSET_B + QIF_SPACE_B, &dquot->dq_flags);
++              set_bit(DQ_LASTSET_B + QIF_SPACE_B, &dquot->dq_flags);
+       }
+       if (di->dqb_valid & QIF_BLIMITS) {
+               dm->dqb_bsoftlimit = qbtos(di->dqb_bsoftlimit);
+               dm->dqb_bhardlimit = qbtos(di->dqb_bhardlimit);
+               check_blim = 1;
+-              __set_bit(DQ_LASTSET_B + QIF_BLIMITS_B, &dquot->dq_flags);
++              set_bit(DQ_LASTSET_B + QIF_BLIMITS_B, &dquot->dq_flags);
+       }
+       if (di->dqb_valid & QIF_INODES) {
+               dm->dqb_curinodes = di->dqb_curinodes;
+               check_ilim = 1;
+-              __set_bit(DQ_LASTSET_B + QIF_INODES_B, &dquot->dq_flags);
++              set_bit(DQ_LASTSET_B + QIF_INODES_B, &dquot->dq_flags);
+       }
+       if (di->dqb_valid & QIF_ILIMITS) {
+               dm->dqb_isoftlimit = di->dqb_isoftlimit;
+               dm->dqb_ihardlimit = di->dqb_ihardlimit;
+               check_ilim = 1;
+-              __set_bit(DQ_LASTSET_B + QIF_ILIMITS_B, &dquot->dq_flags);
++              set_bit(DQ_LASTSET_B + QIF_ILIMITS_B, &dquot->dq_flags);
+       }
+       if (di->dqb_valid & QIF_BTIME) {
+               dm->dqb_btime = di->dqb_btime;
+               check_blim = 1;
+-              __set_bit(DQ_LASTSET_B + QIF_BTIME_B, &dquot->dq_flags);
++              set_bit(DQ_LASTSET_B + QIF_BTIME_B, &dquot->dq_flags);
+       }
+       if (di->dqb_valid & QIF_ITIME) {
+               dm->dqb_itime = di->dqb_itime;
+               check_ilim = 1;
+-              __set_bit(DQ_LASTSET_B + QIF_ITIME_B, &dquot->dq_flags);
++              set_bit(DQ_LASTSET_B + QIF_ITIME_B, &dquot->dq_flags);
+       }
+       if (check_blim) {
index 19a476b72ab8ff5ba2c71e95faeb82d55f15578c..7ed0555901458b31093e4e8e75afc5e759244c82 100644 (file)
@@ -124,3 +124,4 @@ x86-fix-breakage-of-uml-from-the-changes-in-the-rwsem-system.patch
 x86-64-rwsem-avoid-store-forwarding-hazard-in-__downgrade_write.patch
 fix-nfs4-handling-of-mountpoint-stat.patch
 dm-mpath-fix-stall-when-requeueing-io.patch
+quota-fix-possible-dq_flags-corruption.patch