From: Andrew Perepechko Subject: [PATCH 01/01] quota: atomic dq_flags operations in do_set_dqblk Date: Mon, 12 Apr 2010 22:16:50 +0400 Message-ID: <201004122216.50365.andrew.perepechko@sun.com> Mime-Version: 1.0 Content-Type: Text/Plain; CHARSET=US-ASCII Content-Transfer-Encoding: 7BIT Cc: Johann Lombardi , linux-fsdevel@vger.kernel.org To: jack@suse.cz Return-path: Received: from sca-es-mail-2.Sun.COM ([192.18.43.133]:52364 "EHLO sca-es-mail-2.sun.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753057Ab0DLSQM (ORCPT ); Mon, 12 Apr 2010 14:16:12 -0400 Received: from fe-sfbay-10.sun.com ([192.18.43.129]) by sca-es-mail-2.sun.com (8.13.7+Sun/8.12.9) with ESMTP id o3CIG8gI010343 for ; Mon, 12 Apr 2010 11:16:11 -0700 (PDT) Received: from conversion-daemon.fe-sfbay-10.sun.com by fe-sfbay-10.sun.com (Sun Java(tm) System Messaging Server 7u2-7.04 64bit (built Jul 2 2009)) id <0L0R00H00ZWG3Y00@fe-sfbay-10.sun.com> for linux-fsdevel@vger.kernel.org; Mon, 12 Apr 2010 11:16:08 -0700 (PDT) Sender: linux-fsdevel-owner@vger.kernel.org List-ID: From: Andrew Perepechko Non-atomic __set_bit calls are replaced with atomic set_bit calls in do_set_dqblk so that individual bits should not be lost in a possible race condition. Signed-off-by: Andrew Perepechko --- diff -puN fs/dquot.c fs/dquot.c --- a/fs/dquot.c +++ b/fs/dquot.c @@ -2065,32 +2065,32 @@ static int do_set_dqblk(struct dquot *dq if (di->dqb_valid & QIF_SPACE) { dm->dqb_curspace = di->dqb_curspace; 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; - __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; - __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) {