From: Jan Kara Subject: Re: [PATCH] quota: clean up quota active checks Date: Fri, 4 Jun 2010 22:37:21 +0200 Message-ID: <20100604203720.GA17112@quack.suse.cz> References: <20100604085629.GB25074@lst.de> <20100604145627.GD3414@quack.suse.cz> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Cc: jack@suse.cz, linux-fsdevel@vger.kernel.org To: Christoph Hellwig Return-path: Received: from cantor2.suse.de ([195.135.220.15]:35443 "EHLO mx2.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750837Ab0FDUhl (ORCPT ); Fri, 4 Jun 2010 16:37:41 -0400 Content-Disposition: inline In-Reply-To: <20100604145627.GD3414@quack.suse.cz> Sender: linux-fsdevel-owner@vger.kernel.org List-ID: On Fri 04-06-10 16:56:27, Jan Kara wrote: > On Fri 04-06-10 10:56:29, Christoph Hellwig wrote: > > > > The various quota operations check for any quota beeing active on > > a superblock, and the inode not having the noquota flag. > > > > Merge these two checks into a dquot_active check and move that > > into dquot.c as that's the only place where it's needed. > Thanks. Merged. Except that IS_NOQUOTA check was reversed so no quota was actually ever accounted... Grumble... Fixed that. Honza > > > > Signed-off-by: Christoph Hellwig > > > > Index: linux-2.6/fs/quota/dquot.c > > =================================================================== > > --- linux-2.6.orig/fs/quota/dquot.c 2010-06-03 08:51:40.518253807 +0200 > > +++ linux-2.6/fs/quota/dquot.c 2010-06-03 09:07:33.795255831 +0200 > > @@ -1304,6 +1304,15 @@ static int info_bdq_free(struct dquot *d > > return QUOTA_NL_NOWARN; > > } > > > > +static int dquot_active(const struct inode *inode) > > +{ > > + struct super_block *sb = inode->i_sb; > > + > > + if (!IS_NOQUOTA(inode)) > > + return 0; > > + return sb_any_quota_loaded(sb) & ~sb_any_quota_suspended(sb); > > +} > > + > > /* > > * Initialize quota pointers in inode > > * > > @@ -1323,7 +1332,7 @@ static void __dquot_initialize(struct in > > > > /* First test before acquiring mutex - solves deadlocks when we > > * re-enter the quota code and are already holding the mutex */ > > - if (!sb_any_quota_active(inode->i_sb) || IS_NOQUOTA(inode)) > > + if (!dquot_active(inode)) > > return; > > > > /* First get references to structures we might need. */ > > @@ -1507,7 +1516,7 @@ int __dquot_alloc_space(struct inode *in > > * First test before acquiring mutex - solves deadlocks when we > > * re-enter the quota code and are already holding the mutex > > */ > > - if (!sb_any_quota_active(inode->i_sb) || IS_NOQUOTA(inode)) { > > + if (!dquot_active(inode)) { > > inode_incr_space(inode, number, reserve); > > goto out; > > } > > @@ -1559,7 +1568,7 @@ int dquot_alloc_inode(const struct inode > > > > /* First test before acquiring mutex - solves deadlocks when we > > * re-enter the quota code and are already holding the mutex */ > > - if (!sb_any_quota_active(inode->i_sb) || IS_NOQUOTA(inode)) > > + if (!dquot_active(inode)) > > return 0; > > for (cnt = 0; cnt < MAXQUOTAS; cnt++) > > warntype[cnt] = QUOTA_NL_NOWARN; > > @@ -1596,7 +1605,7 @@ int dquot_claim_space_nodirty(struct ino > > { > > int cnt; > > > > - if (!sb_any_quota_active(inode->i_sb) || IS_NOQUOTA(inode)) { > > + if (!dquot_active(inode)) { > > inode_claim_rsv_space(inode, number); > > return 0; > > } > > @@ -1629,7 +1638,7 @@ void __dquot_free_space(struct inode *in > > > > /* First test before acquiring mutex - solves deadlocks when we > > * re-enter the quota code and are already holding the mutex */ > > - if (!sb_any_quota_active(inode->i_sb) || IS_NOQUOTA(inode)) { > > + if (!dquot_active(inode)) { > > inode_decr_space(inode, number, reserve); > > return; > > } > > @@ -1667,7 +1676,7 @@ void dquot_free_inode(const struct inode > > > > /* First test before acquiring mutex - solves deadlocks when we > > * re-enter the quota code and are already holding the mutex */ > > - if (!sb_any_quota_active(inode->i_sb) || IS_NOQUOTA(inode)) > > + if (!dquot_active(inode)) > > return; > > > > down_read(&sb_dqopt(inode->i_sb)->dqptr_sem); > > @@ -1790,7 +1799,7 @@ int dquot_transfer(struct inode *inode, > > struct super_block *sb = inode->i_sb; > > int ret; > > > > - if (!sb_any_quota_active(sb) || IS_NOQUOTA(inode)) > > + if (!dquot_active(inode)) > > return 0; > > > > if (iattr->ia_valid & ATTR_UID && iattr->ia_uid != inode->i_uid) > > Index: linux-2.6/include/linux/quotaops.h > > =================================================================== > > --- linux-2.6.orig/include/linux/quotaops.h 2010-06-03 08:51:40.529254366 +0200 > > +++ linux-2.6/include/linux/quotaops.h 2010-06-03 08:51:48.320004051 +0200 > > @@ -145,11 +145,6 @@ static inline bool sb_has_quota_active(s > > !sb_has_quota_suspended(sb, type); > > } > > > > -static inline unsigned sb_any_quota_active(struct super_block *sb) > > -{ > > - return sb_any_quota_loaded(sb) & ~sb_any_quota_suspended(sb); > > -} > > - > > /* > > * Operations supported for diskquotas. > > */ > > @@ -193,11 +188,6 @@ static inline int sb_has_quota_active(st > > { > > return 0; > > } > > - > > -static inline int sb_any_quota_active(struct super_block *sb) > > -{ > > - return 0; > > -} > > > > static inline void dquot_initialize(struct inode *inode) > > { > -- > Jan Kara > SUSE Labs, CR