From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jan Kara Subject: Re: [PATCH 3/8] dquot: move dquot transfer responsibiliy into the filesystem Date: Thu, 25 Feb 2010 00:06:07 +0100 Message-ID: <20100224230607.GD3097@quack.suse.cz> References: <20100220115101.469826792@bombadil.infradead.org> <20100220115212.927441586@bombadil.infradead.org> 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]:34874 "EHLO mx2.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1757910Ab0BXXGA (ORCPT ); Wed, 24 Feb 2010 18:06:00 -0500 Content-Disposition: inline In-Reply-To: <20100220115212.927441586@bombadil.infradead.org> Sender: linux-fsdevel-owner@vger.kernel.org List-ID: On Sat 20-02-10 06:51:04, Christoph Hellwig wrote: > Currently notify_change calls vfs_dq_transfer directly. This means > we tie the quota code into the VFS. Get rid of that and make the > filesystem responsibly for the transfer. Most filesystems already > do this, only ufs needs the code added, and for jfs it needs to be > enabled unconditionally instead of only when ACLs are enabled. > > Signed-off-by: Christoph Hellwig Looks good. Merged. Honza > Index: linux-2.6/fs/attr.c > =================================================================== > --- linux-2.6.orig/fs/attr.c 2010-02-19 11:45:24.904272974 +0100 > +++ linux-2.6/fs/attr.c 2010-02-19 11:45:43.050005619 +0100 > @@ -12,7 +12,6 @@ > #include > #include > #include > -#include > #include > > /* Taken over from the old code... */ > @@ -212,14 +211,8 @@ int notify_change(struct dentry * dentry > error = inode->i_op->setattr(dentry, attr); > } else { > error = inode_change_ok(inode, attr); > - if (!error) { > - if ((ia_valid & ATTR_UID && attr->ia_uid != inode->i_uid) || > - (ia_valid & ATTR_GID && attr->ia_gid != inode->i_gid)) > - error = vfs_dq_transfer(inode, attr) ? > - -EDQUOT : 0; > - if (!error) > - error = inode_setattr(inode, attr); > - } > + if (!error) > + error = inode_setattr(inode, attr); > } > > if (ia_valid & ATTR_SIZE) > Index: linux-2.6/fs/ufs/truncate.c > =================================================================== > --- linux-2.6.orig/fs/ufs/truncate.c 2010-02-19 11:45:24.913004221 +0100 > +++ linux-2.6/fs/ufs/truncate.c 2010-02-19 15:08:15.042023986 +0100 > @@ -44,6 +44,7 @@ > #include > #include > #include > +#include > > #include "ufs_fs.h" > #include "ufs.h" > @@ -517,6 +518,12 @@ static int ufs_setattr(struct dentry *de > if (error) > return error; > > + if ((ia_valid & ATTR_UID && attr->ia_uid != inode->i_uid) || > + (ia_valid & ATTR_GID && attr->ia_gid != inode->i_gid)) { > + error = vfs_dq_transfer(inode, attr) ? -EDQUOT : 0; > + if (error) > + return error; > + } > if (ia_valid & ATTR_SIZE && > attr->ia_size != i_size_read(inode)) { > loff_t old_i_size = inode->i_size; > Index: linux-2.6/fs/jfs/acl.c > =================================================================== > --- linux-2.6.orig/fs/jfs/acl.c 2010-02-19 11:45:24.919010367 +0100 > +++ linux-2.6/fs/jfs/acl.c 2010-02-19 11:45:32.078271367 +0100 > @@ -20,7 +20,6 @@ > > #include > #include > -#include > #include > #include "jfs_incore.h" > #include "jfs_txnmgr.h" > @@ -174,7 +173,7 @@ cleanup: > return rc; > } > > -static int jfs_acl_chmod(struct inode *inode) > +int jfs_acl_chmod(struct inode *inode) > { > struct posix_acl *acl, *clone; > int rc; > @@ -205,26 +204,3 @@ static int jfs_acl_chmod(struct inode *i > posix_acl_release(clone); > return rc; > } > - > -int jfs_setattr(struct dentry *dentry, struct iattr *iattr) > -{ > - struct inode *inode = dentry->d_inode; > - int rc; > - > - rc = inode_change_ok(inode, iattr); > - if (rc) > - return rc; > - > - if ((iattr->ia_valid & ATTR_UID && iattr->ia_uid != inode->i_uid) || > - (iattr->ia_valid & ATTR_GID && iattr->ia_gid != inode->i_gid)) { > - if (vfs_dq_transfer(inode, iattr)) > - return -EDQUOT; > - } > - > - rc = inode_setattr(inode, iattr); > - > - if (!rc && (iattr->ia_valid & ATTR_MODE)) > - rc = jfs_acl_chmod(inode); > - > - return rc; > -} > Index: linux-2.6/fs/jfs/file.c > =================================================================== > --- linux-2.6.orig/fs/jfs/file.c 2010-02-19 11:45:24.929004081 +0100 > +++ linux-2.6/fs/jfs/file.c 2010-02-19 15:08:02.655004431 +0100 > @@ -18,6 +18,7 @@ > */ > > #include > +#include > #include "jfs_incore.h" > #include "jfs_inode.h" > #include "jfs_dmap.h" > @@ -88,14 +89,37 @@ static int jfs_release(struct inode *ino > return 0; > } > > +int jfs_setattr(struct dentry *dentry, struct iattr *iattr) > +{ > + struct inode *inode = dentry->d_inode; > + int rc; > + > + rc = inode_change_ok(inode, iattr); > + if (rc) > + return rc; > + > + if ((iattr->ia_valid & ATTR_UID && iattr->ia_uid != inode->i_uid) || > + (iattr->ia_valid & ATTR_GID && iattr->ia_gid != inode->i_gid)) { > + if (vfs_dq_transfer(inode, iattr)) > + return -EDQUOT; > + } > + > + rc = inode_setattr(inode, iattr); > + > + if (!rc && (iattr->ia_valid & ATTR_MODE)) > + rc = jfs_acl_chmod(inode); > + > + return rc; > +} > + > const struct inode_operations jfs_file_inode_operations = { > .truncate = jfs_truncate, > .setxattr = jfs_setxattr, > .getxattr = jfs_getxattr, > .listxattr = jfs_listxattr, > .removexattr = jfs_removexattr, > -#ifdef CONFIG_JFS_POSIX_ACL > .setattr = jfs_setattr, > +#ifdef CONFIG_JFS_POSIX_ACL > .check_acl = jfs_check_acl, > #endif > }; > Index: linux-2.6/fs/jfs/jfs_acl.h > =================================================================== > --- linux-2.6.orig/fs/jfs/jfs_acl.h 2010-02-19 11:45:24.936025523 +0100 > +++ linux-2.6/fs/jfs/jfs_acl.h 2010-02-19 11:45:32.085271437 +0100 > @@ -22,7 +22,7 @@ > > int jfs_check_acl(struct inode *, int); > int jfs_init_acl(tid_t, struct inode *, struct inode *); > -int jfs_setattr(struct dentry *, struct iattr *); > +int jfs_acl_chmod(struct inode *inode); > > #else > > @@ -32,5 +32,10 @@ static inline int jfs_init_acl(tid_t tid > return 0; > } > > +static inline int jfs_acl_chmod(struct inode *inode) > +{ > + return 0; > +} > + > #endif > #endif /* _H_JFS_ACL */ > Index: linux-2.6/fs/jfs/jfs_inode.h > =================================================================== > --- linux-2.6.orig/fs/jfs/jfs_inode.h 2010-02-19 11:45:24.944024894 +0100 > +++ linux-2.6/fs/jfs/jfs_inode.h 2010-02-19 11:45:32.090281355 +0100 > @@ -40,6 +40,7 @@ extern struct dentry *jfs_fh_to_parent(s > int fh_len, int fh_type); > extern void jfs_set_inode_flags(struct inode *); > extern int jfs_get_block(struct inode *, sector_t, struct buffer_head *, int); > +extern int jfs_setattr(struct dentry *, struct iattr *); > > extern const struct address_space_operations jfs_aops; > extern const struct inode_operations jfs_dir_inode_operations; > Index: linux-2.6/fs/jfs/namei.c > =================================================================== > --- linux-2.6.orig/fs/jfs/namei.c 2010-02-19 11:45:24.955254046 +0100 > +++ linux-2.6/fs/jfs/namei.c 2010-02-19 14:53:30.838004431 +0100 > @@ -1541,8 +1541,8 @@ const struct inode_operations jfs_dir_in > .getxattr = jfs_getxattr, > .listxattr = jfs_listxattr, > .removexattr = jfs_removexattr, > -#ifdef CONFIG_JFS_POSIX_ACL > .setattr = jfs_setattr, > +#ifdef CONFIG_JFS_POSIX_ACL > .check_acl = jfs_check_acl, > #endif > }; > -- Jan Kara SUSE Labs, CR