From mboxrd@z Thu Jan 1 00:00:00 1970 From: Andrew Perepechko Subject: Re: [PATCH 01/01] quota: atomic dq_flags operations in do_set_dqblk Date: Mon, 12 Apr 2010 23:39:40 +0400 Message-ID: <201004122339.41556.andrew.perepechko@sun.com> References: <201004122216.50365.andrew.perepechko@sun.com> <20100412190914.GL3404@quack.suse.cz> Mime-Version: 1.0 Content-Type: Text/Plain; CHARSET=US-ASCII Content-Transfer-Encoding: 7BIT Cc: Johann Lombardi , linux-fsdevel@vger.kernel.org To: Jan Kara Return-path: Received: from sca-es-mail-1.Sun.COM ([192.18.43.132]:46806 "EHLO sca-es-mail-1.sun.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751009Ab0DLTjO (ORCPT ); Mon, 12 Apr 2010 15:39:14 -0400 Received: from fe-sfbay-10.sun.com ([192.18.43.129]) by sca-es-mail-1.sun.com (8.13.7+Sun/8.12.9) with ESMTP id o3CJd9Zx001775 for ; Mon, 12 Apr 2010 12:39:13 -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 <0L0S006003P9U100@fe-sfbay-10.sun.com> for linux-fsdevel@vger.kernel.org; Mon, 12 Apr 2010 12:39:09 -0700 (PDT) In-reply-to: <20100412190914.GL3404@quack.suse.cz> Sender: linux-fsdevel-owner@vger.kernel.org List-ID: Thanks a lot, Jan! Andrew. On Monday 12 April 2010 11:09:17 pm Jan Kara wrote: > On Mon 12-04-10 22:16:50, Andrew Perepechko wrote: > > 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. > > I took a liberty of modifying the changelog to be more descriptive: > > quota: Fix possible dq_flags corruption > > 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. > > Otherwise I've merged the patch. > > Honza > > > 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) {