Changes: * Minimize the calls to mark_inode_dirty() and ext3_mark_inode_dirty() by removing extra calls from ext[23]_init_acl() * ext3_acl_chmod() cleanup: Don't pass in transaction handle anymore * Remove 2.4 locking leftover in fs/ext3/inode.c:ext3_setattr() * Remove the [gs]et_posix_acl inode operations diff -Nur linux-2.5.43-mm1/fs/ext2/acl.c linux-2.5.43-mm1+/fs/ext2/acl.c --- linux-2.5.43-mm1/fs/ext2/acl.c 2002-10-16 19:15:56.000000000 +0200 +++ linux-2.5.43-mm1+/fs/ext2/acl.c 2002-10-16 20:19:09.000000000 +0200 @@ -124,13 +124,7 @@ return ERR_PTR(-EINVAL); } -/* - * Inode operation get_posix_acl(). - * - * inode->i_sem: down - * BKL held [before 2.5.x] - */ -struct posix_acl * +static struct posix_acl * ext2_get_acl(struct inode *inode, int type) { int name_index; @@ -177,13 +171,7 @@ return acl; } -/* - * Inode operation set_posix_acl(). - * - * inode->i_sem: down - * BKL held [before 2.5.x] - */ -int +static int ext2_set_acl(struct inode *inode, int type, struct posix_acl *acl) { int name_index; @@ -348,10 +336,8 @@ if (IS_ERR(acl)) return PTR_ERR(acl); } - if (!acl) { + if (!acl) inode->i_mode &= ~current->fs->umask; - mark_inode_dirty(inode); - } } if (test_opt(inode->i_sb, POSIX_ACL) && acl) { struct posix_acl *clone; @@ -370,7 +356,6 @@ error = posix_acl_create_masq(clone, &mode); if (error >= 0) { inode->i_mode = mode; - mark_inode_dirty(inode); if (error > 0) { /* This is an extended ACL */ error = ext2_set_acl(inode, diff -Nur linux-2.5.43-mm1/fs/ext2/acl.h linux-2.5.43-mm1+/fs/ext2/acl.h --- linux-2.5.43-mm1/fs/ext2/acl.h 2002-10-16 19:15:56.000000000 +0200 +++ linux-2.5.43-mm1+/fs/ext2/acl.h 2002-10-16 20:25:05.000000000 +0200 @@ -62,8 +62,6 @@ /* acl.c */ extern int ext2_permission (struct inode *, int); extern int ext2_permission_locked (struct inode *, int); -extern struct posix_acl *ext2_get_acl (struct inode *, int); -extern int ext2_set_acl (struct inode *, int, struct posix_acl *); extern int ext2_acl_chmod (struct inode *); extern int ext2_init_acl (struct inode *, struct inode *); @@ -73,8 +71,6 @@ #else #include #define ext2_permission NULL -#define ext2_get_acl NULL -#define ext2_set_acl NULL static inline int ext2_acl_chmod (struct inode *inode) diff -Nur linux-2.5.43-mm1/fs/ext2/file.c linux-2.5.43-mm1+/fs/ext2/file.c --- linux-2.5.43-mm1/fs/ext2/file.c 2002-10-16 19:15:56.000000000 +0200 +++ linux-2.5.43-mm1+/fs/ext2/file.c 2002-10-16 20:20:05.000000000 +0200 @@ -63,6 +63,4 @@ .removexattr = ext2_removexattr, .setattr = ext2_setattr, .permission = ext2_permission, - .get_posix_acl = ext2_get_acl, - .set_posix_acl = ext2_set_acl, }; diff -Nur linux-2.5.43-mm1/fs/ext2/namei.c linux-2.5.43-mm1+/fs/ext2/namei.c --- linux-2.5.43-mm1/fs/ext2/namei.c 2002-10-16 19:15:56.000000000 +0200 +++ linux-2.5.43-mm1+/fs/ext2/namei.c 2002-10-16 20:20:00.000000000 +0200 @@ -379,8 +379,6 @@ .removexattr = ext2_removexattr, .setattr = ext2_setattr, .permission = ext2_permission, - .get_posix_acl = ext2_get_acl, - .set_posix_acl = ext2_set_acl, }; struct inode_operations ext2_special_inode_operations = { @@ -390,6 +388,4 @@ .removexattr = ext2_removexattr, .setattr = ext2_setattr, .permission = ext2_permission, - .get_posix_acl = ext2_get_acl, - .set_posix_acl = ext2_set_acl, }; diff -Nur linux-2.5.43-mm1/fs/ext3/acl.c linux-2.5.43-mm1+/fs/ext3/acl.c --- linux-2.5.43-mm1/fs/ext3/acl.c 2002-10-16 19:15:56.000000000 +0200 +++ linux-2.5.43-mm1+/fs/ext3/acl.c 2002-10-16 20:40:32.000000000 +0200 @@ -125,12 +125,7 @@ return ERR_PTR(-EINVAL); } -/* - * Inode operation get_posix_acl(). - * - * inode->i_sem: down - */ -struct posix_acl * +static struct posix_acl * ext3_get_acl(struct inode *inode, int type) { int name_index; @@ -183,7 +178,7 @@ * inode->i_sem: down unless called from ext3_new_inode */ static int -ext3_do_set_acl(handle_t *handle, struct inode *inode, int type, +ext3_set_acl(handle_t *handle, struct inode *inode, int type, struct posix_acl *acl) { int name_index; @@ -243,30 +238,6 @@ return error; } -/* - * Inode operation set_posix_acl(). - * - * inode->i_sem: down - */ - -int -ext3_set_acl(struct inode *inode, int type, struct posix_acl *acl) -{ - handle_t *handle; - int error; - - if (!test_opt(inode->i_sb, POSIX_ACL)) - return 0; - - handle = ext3_journal_start(inode, EXT3_XATTR_TRANS_BLOCKS); - if (IS_ERR(handle)) - return PTR_ERR(handle); - error = ext3_do_set_acl(handle, inode, type, acl); - ext3_journal_stop(handle, inode); - - return error; -} - static int __ext3_permission(struct inode *inode, int mask, int lock) { @@ -368,18 +339,16 @@ if (IS_ERR(acl)) return PTR_ERR(acl); } - if (!acl) { + if (!acl) inode->i_mode &= ~current->fs->umask; - ext3_mark_inode_dirty(handle, inode); - } } if (test_opt(inode->i_sb, POSIX_ACL) && acl) { struct posix_acl *clone; mode_t mode; if (S_ISDIR(inode->i_mode)) { - error = ext3_do_set_acl(handle, inode, - ACL_TYPE_DEFAULT, acl); + error = ext3_set_acl(handle, inode, + ACL_TYPE_DEFAULT, acl); if (error) goto cleanup; } @@ -392,11 +361,10 @@ error = posix_acl_create_masq(clone, &mode); if (error >= 0) { inode->i_mode = mode; - ext3_mark_inode_dirty(handle, inode); if (error > 0) { /* This is an extended ACL */ - error = ext3_do_set_acl(handle, inode, - ACL_TYPE_ACCESS, clone); + error = ext3_set_acl(handle, inode, + ACL_TYPE_ACCESS, clone); } } posix_acl_release(clone); @@ -421,7 +389,7 @@ * inode->i_sem: down */ int -ext3_acl_chmod(handle_t *handle, struct inode *inode) +ext3_acl_chmod(struct inode *inode) { struct posix_acl *acl, *clone; int error; @@ -438,8 +406,17 @@ if (!clone) return -ENOMEM; error = posix_acl_chmod_masq(clone, inode->i_mode); - if (!error) - error = ext3_do_set_acl(handle, inode, ACL_TYPE_ACCESS, clone); + if (!error) { + handle_t *handle; + + handle = ext3_journal_start(inode, EXT3_XATTR_TRANS_BLOCKS); + if (IS_ERR(handle)) { + ext3_std_error(inode->i_sb, error); + return PTR_ERR(handle); + } + error = ext3_set_acl(handle, inode, ACL_TYPE_ACCESS, clone); + ext3_journal_stop(handle, inode); + } posix_acl_release(clone); return error; } @@ -538,7 +515,7 @@ handle = ext3_journal_start(inode, EXT3_XATTR_TRANS_BLOCKS); if (IS_ERR(handle)) return PTR_ERR(handle); - error = ext3_do_set_acl(handle, inode, type, acl); + error = ext3_set_acl(handle, inode, type, acl); ext3_journal_stop(handle, inode); release_and_out: diff -Nur linux-2.5.43-mm1/fs/ext3/acl.h linux-2.5.43-mm1+/fs/ext3/acl.h --- linux-2.5.43-mm1/fs/ext3/acl.h 2002-10-16 19:15:56.000000000 +0200 +++ linux-2.5.43-mm1+/fs/ext3/acl.h 2002-10-16 20:24:43.000000000 +0200 @@ -62,12 +62,8 @@ /* acl.c */ extern int ext3_permission (struct inode *, int); extern int ext3_permission_locked (struct inode *, int); -extern struct posix_acl *ext3_get_acl (struct inode *, int); -extern int ext3_set_acl (struct inode *, int, struct posix_acl *); -extern int ext3_acl_chmod (handle_t *, struct inode *); +extern int ext3_acl_chmod (struct inode *); extern int ext3_init_acl (handle_t *, struct inode *, struct inode *); -extern int ext3_get_acl_xattr (struct inode *, int, void *, size_t); -extern int ext3_set_acl_xattr (struct inode *, int, void *, size_t); extern int init_ext3_acl(void); extern void exit_ext3_acl(void); @@ -75,11 +71,9 @@ #else /* CONFIG_EXT3_FS_POSIX_ACL */ #include #define ext3_permission NULL -#define ext3_get_acl NULL -#define ext3_set_acl NULL static inline int -ext3_acl_chmod(handle_t *handle, struct inode *inode) +ext3_acl_chmod(struct inode *inode) { return 0; } diff -Nur linux-2.5.43-mm1/fs/ext3/file.c linux-2.5.43-mm1+/fs/ext3/file.c --- linux-2.5.43-mm1/fs/ext3/file.c 2002-10-16 19:15:56.000000000 +0200 +++ linux-2.5.43-mm1+/fs/ext3/file.c 2002-10-16 20:20:47.000000000 +0200 @@ -104,7 +104,5 @@ .listxattr = ext3_listxattr, .removexattr = ext3_removexattr, .permission = ext3_permission, - .get_posix_acl = ext3_get_acl, - .set_posix_acl = ext3_set_acl, }; diff -Nur linux-2.5.43-mm1/fs/ext3/inode.c linux-2.5.43-mm1+/fs/ext3/inode.c --- linux-2.5.43-mm1/fs/ext3/inode.c 2002-10-16 19:15:56.000000000 +0200 +++ linux-2.5.43-mm1+/fs/ext3/inode.c 2002-10-16 20:06:13.000000000 +0200 @@ -2559,23 +2559,8 @@ if (S_ISREG(inode->i_mode) && inode->i_nlink) ext3_orphan_del(NULL, inode); -#ifdef CONFIG_EXT3_FS_POSIX_ACL - if (!rc && test_opt(inode->i_sb, POSIX_ACL) && (ia_valid & ATTR_MODE)) { - handle_t *handle; - - handle = ext3_journal_start(inode, EXT3_XATTR_TRANS_BLOCKS); - if (IS_ERR(handle)) { - error = PTR_ERR(handle); - goto err_out; - } - if (!(ia_valid & ATTR_SIZE)) - down(&inode->i_sem); - rc = ext3_acl_chmod(handle, inode); - if (!(ia_valid & ATTR_SIZE)) - up(&inode->i_sem); - ext3_journal_stop(handle, inode); - } -#endif + if (!rc && (ia_valid & ATTR_MODE)) + rc = ext3_acl_chmod(inode); err_out: ext3_std_error(inode->i_sb, error); diff -Nur linux-2.5.43-mm1/fs/ext3/namei.c linux-2.5.43-mm1+/fs/ext3/namei.c --- linux-2.5.43-mm1/fs/ext3/namei.c 2002-10-16 19:15:56.000000000 +0200 +++ linux-2.5.43-mm1+/fs/ext3/namei.c 2002-10-16 20:20:42.000000000 +0200 @@ -2290,8 +2290,6 @@ .listxattr = ext3_listxattr, .removexattr = ext3_removexattr, .permission = ext3_permission, - .get_posix_acl = ext3_get_acl, - .set_posix_acl = ext3_set_acl, }; struct inode_operations ext3_special_inode_operations = { @@ -2301,8 +2299,6 @@ .listxattr = ext3_listxattr, .removexattr = ext3_removexattr, .permission = ext3_permission, - .get_posix_acl = ext3_get_acl, - .set_posix_acl = ext3_set_acl, }; diff -Nur linux-2.5.43-mm1/fs/posix_acl.c linux-2.5.43-mm1+/fs/posix_acl.c --- linux-2.5.43-mm1/fs/posix_acl.c 2002-10-16 19:15:56.000000000 +0200 +++ linux-2.5.43-mm1+/fs/posix_acl.c 2002-10-16 20:38:47.000000000 +0200 @@ -410,37 +410,3 @@ return 0; } - -/* - * Get the POSIX ACL of an inode. - */ -struct posix_acl * -get_posix_acl(struct inode *inode, int type) -{ - struct posix_acl *acl; - - if (!inode->i_op->get_posix_acl) - return ERR_PTR(-EOPNOTSUPP); - down(&inode->i_sem); - acl = inode->i_op->get_posix_acl(inode, type); - up(&inode->i_sem); - - return acl; -} - -/* - * Set the POSIX ACL of an inode. - */ -int -set_posix_acl(struct inode *inode, int type, struct posix_acl *acl) -{ - int error; - - if (!inode->i_op->set_posix_acl) - return -EOPNOTSUPP; - down(&inode->i_sem); - error = inode->i_op->set_posix_acl(inode, type, acl); - up(&inode->i_sem); - - return error; -} diff -Nur linux-2.5.43-mm1/include/linux/fs.h linux-2.5.43-mm1+/include/linux/fs.h --- linux-2.5.43-mm1/include/linux/fs.h 2002-10-16 19:15:56.000000000 +0200 +++ linux-2.5.43-mm1+/include/linux/fs.h 2002-10-16 20:20:27.000000000 +0200 @@ -792,8 +792,6 @@ ssize_t (*getxattr) (struct dentry *, const char *, void *, size_t); ssize_t (*listxattr) (struct dentry *, char *, size_t); int (*removexattr) (struct dentry *, const char *); - struct posix_acl *(*get_posix_acl) (struct inode *, int); - int (*set_posix_acl) (struct inode *, int, struct posix_acl *); }; struct seq_file; diff -Nur linux-2.5.43-mm1/include/linux/posix_acl.h linux-2.5.43-mm1+/include/linux/posix_acl.h --- linux-2.5.43-mm1/include/linux/posix_acl.h 2002-10-16 19:15:56.000000000 +0200 +++ linux-2.5.43-mm1+/include/linux/posix_acl.h 2002-10-16 20:38:38.000000000 +0200 @@ -81,7 +81,4 @@ extern int posix_acl_chmod_masq(struct posix_acl *, mode_t); extern int posix_acl_masq_nfs_mode(struct posix_acl *, mode_t *); -extern struct posix_acl *get_posix_acl(struct inode *, int); -extern int set_posix_acl(struct inode *, int, struct posix_acl *); - #endif /* __LINUX_POSIX_ACL_H */