The per-inode locking can be made more fine-grained to surround just the interaction with the filesystem itself. This really only applies to protecting reads during a write, since concurrent writes are barred with inode->i_mutex at the vfs level.
fs/reiserfs/xattr.c | 32 ++++++++++++++++++-------------- fs/reiserfs/xattr_acl.c | 7 +------ include/linux/reiserfs_xattr.h | 21 --------------------- 3 files changed, 19 insertions(+), 41 deletions(-) Signed-off-by: Jeff Mahoney <[EMAIL PROTECTED]> diff -ruNpX ../dontdiff linux-2.6.15-staging1/fs/reiserfs/xattr_acl.c linux-2.6.15-staging2/fs/reiserfs/xattr_acl.c --- linux-2.6.15-staging1/fs/reiserfs/xattr_acl.c 2006-02-13 14:21:05.000000000 -0500 +++ linux-2.6.15-staging2/fs/reiserfs/xattr_acl.c 2006-02-13 14:21:05.000000000 -0500 @@ -418,9 +418,7 @@ int reiserfs_cache_default_acl(struct in int ret = 0; if (reiserfs_posixacl(inode->i_sb) && !is_reiserfs_priv_object(inode)) { struct posix_acl *acl; - reiserfs_read_lock_xattr_i(inode); acl = reiserfs_get_acl(inode, ACL_TYPE_DEFAULT); - reiserfs_read_unlock_xattr_i(inode); ret = acl ? 1 : 0; posix_acl_release(acl); } @@ -451,11 +449,8 @@ int reiserfs_acl_chmod(struct inode *ino if (!clone) return -ENOMEM; error = posix_acl_chmod_masq(clone, inode->i_mode); - if (!error) { - reiserfs_write_lock_xattr_i(inode); + if (!error) error = reiserfs_set_acl(inode, ACL_TYPE_ACCESS, clone); - reiserfs_write_unlock_xattr_i(inode); - } posix_acl_release(clone); return error; } diff -ruNpX ../dontdiff linux-2.6.15-staging1/fs/reiserfs/xattr.c linux-2.6.15-staging2/fs/reiserfs/xattr.c --- linux-2.6.15-staging1/fs/reiserfs/xattr.c 2006-02-13 14:21:05.000000000 -0500 +++ linux-2.6.15-staging2/fs/reiserfs/xattr.c 2006-02-13 14:21:05.000000000 -0500 @@ -390,6 +390,7 @@ reiserfs_xattr_set(struct inode *inode, if (get_inode_sd_version(inode) == STAT_DATA_V1) return -EOPNOTSUPP; + down_write(&REISERFS_I(inode)->xattr_sem); if (!buffer) { struct reiserfs_xattr_handler *xah = find_xattr_handler_prefix(name); @@ -399,7 +400,9 @@ reiserfs_xattr_set(struct inode *inode, if (err) goto out; } - return reiserfs_xattr_del(inode, name); + err = reiserfs_xattr_del(inode, name); + up_write(&REISERFS_I(inode)->xattr_sem); + return err; } open_file: @@ -482,6 +485,7 @@ reiserfs_xattr_set(struct inode *inode, fput(fp); out: + up_write(&REISERFS_I(inode)->xattr_sem); return err; } @@ -508,6 +512,8 @@ reiserfs_xattr_get(const struct inode *i if (get_inode_sd_version(inode) == STAT_DATA_V1) return -EOPNOTSUPP; + down_read(&REISERFS_I(inode)->xattr_sem); + fp = open_xattr_file(inode, name, XATTR_REPLACE); if (IS_ERR(fp)) { up_read(&REISERFS_I(inode)->xattr_sem); @@ -561,6 +567,7 @@ reiserfs_xattr_get(const struct inode *i } out_dput: + up_read(&REISERFS_I(inode)->xattr_sem); fput(fp); out: @@ -659,13 +666,15 @@ int reiserfs_delete_xattrs(struct inode !reiserfs_xattrs(inode->i_sb)) { return 0; } + down_write(&REISERFS_I(inode)->xattr_sem); dir = open_xa_dir(inode, XATTR_REPLACE); if (IS_ERR(dir)) { err = PTR_ERR(dir); goto out; } else if (!dir->d_inode) { dput(dir); - return 0; + err = 0; + goto out; } fp = dentry_open(dir, NULL, O_RDWR); @@ -699,6 +708,7 @@ int reiserfs_delete_xattrs(struct inode fput(fp); out: + up_write(&REISERFS_I(inode)->xattr_sem); if (!err) REISERFS_I(inode)->i_flags = REISERFS_I(inode)->i_flags & ~i_has_xattr_dir; @@ -750,6 +760,7 @@ int reiserfs_chown_xattrs(struct inode * !reiserfs_xattrs(inode->i_sb)) { return 0; } + down_write(&REISERFS_I(inode)->xattr_sem); dir = open_xa_dir(inode, XATTR_REPLACE); if (IS_ERR(dir)) { if (PTR_ERR(dir) != -ENODATA) @@ -788,6 +799,7 @@ int reiserfs_chown_xattrs(struct inode * out: attrs->ia_valid = ia_valid; + up_write(&REISERFS_I(inode)->xattr_sem); return err; } @@ -807,9 +819,7 @@ reiserfs_getxattr(struct dentry * dentry get_inode_sd_version(dentry->d_inode) == STAT_DATA_V1) return -EOPNOTSUPP; - reiserfs_read_lock_xattr_i(dentry->d_inode); err = xah->get(dentry->d_inode, name, buffer, size); - reiserfs_read_unlock_xattr_i(dentry->d_inode); return err; } @@ -829,9 +839,7 @@ reiserfs_setxattr(struct dentry *dentry, get_inode_sd_version(dentry->d_inode) == STAT_DATA_V1) return -EOPNOTSUPP; - reiserfs_write_lock_xattr_i(dentry->d_inode); err = xah->set(dentry->d_inode, name, value, size, flags); - reiserfs_write_unlock_xattr_i(dentry->d_inode); return err; } @@ -849,7 +857,7 @@ int reiserfs_removexattr(struct dentry * get_inode_sd_version(dentry->d_inode) == STAT_DATA_V1) return -EOPNOTSUPP; - reiserfs_write_lock_xattr_i(dentry->d_inode); + down_write(&REISERFS_I(dentry->d_inode)->xattr_sem); /* Deletion pre-operation */ if (xah->del) { err = xah->del(dentry->d_inode, name); @@ -863,7 +871,7 @@ int reiserfs_removexattr(struct dentry * mark_inode_dirty(dentry->d_inode); out: - reiserfs_write_unlock_xattr_i(dentry->d_inode); + up_write(&REISERFS_I(dentry->d_inode)->xattr_sem); return err; } @@ -926,7 +934,7 @@ ssize_t reiserfs_listxattr(struct dentry get_inode_sd_version(dentry->d_inode) == STAT_DATA_V1) return -EOPNOTSUPP; - reiserfs_read_lock_xattr_i(dentry->d_inode); + down_read(&REISERFS_I(dentry->d_inode)->xattr_sem); dir = open_xa_dir(dentry->d_inode, XATTR_REPLACE); if (IS_ERR(dir)) { err = PTR_ERR(dir); @@ -962,7 +970,7 @@ ssize_t reiserfs_listxattr(struct dentry fput(fp); out: - reiserfs_read_unlock_xattr_i(dentry->d_inode); + up_read(&REISERFS_I(dentry->d_inode)->xattr_sem); return err; } @@ -1164,12 +1172,8 @@ static int reiserfs_check_acl(struct ino struct posix_acl *acl; int error = -EAGAIN; /* do regular unix permission checks by default */ - reiserfs_read_lock_xattr_i(inode); - acl = reiserfs_get_acl(inode, ACL_TYPE_ACCESS); - reiserfs_read_unlock_xattr_i(inode); - if (acl) { if (!IS_ERR(acl)) { error = posix_acl_permission(inode, acl, mask); diff -ruNpX ../dontdiff linux-2.6.15-staging1/include/linux/reiserfs_xattr.h linux-2.6.15-staging2/include/linux/reiserfs_xattr.h --- linux-2.6.15-staging1/include/linux/reiserfs_xattr.h 2006-02-13 14:21:05.000000000 -0500 +++ linux-2.6.15-staging2/include/linux/reiserfs_xattr.h 2006-02-13 14:21:05.000000000 -0500 @@ -57,23 +57,6 @@ extern struct reiserfs_xattr_handler sec int reiserfs_xattr_register_handlers(void) __init; void reiserfs_xattr_unregister_handlers(void); -static inline void reiserfs_write_lock_xattr_i(struct inode *inode) -{ - down_write(&REISERFS_I(inode)->xattr_sem); -} -static inline void reiserfs_write_unlock_xattr_i(struct inode *inode) -{ - up_write(&REISERFS_I(inode)->xattr_sem); -} -static inline void reiserfs_read_lock_xattr_i(struct inode *inode) -{ - down_read(&REISERFS_I(inode)->xattr_sem); -} - -static inline void reiserfs_read_unlock_xattr_i(struct inode *inode) -{ - up_read(&REISERFS_I(inode)->xattr_sem); -} static inline void reiserfs_mark_inode_private(struct inode *inode) { @@ -88,10 +71,6 @@ static inline void reiserfs_mark_inode_p #define reiserfs_setxattr NULL #define reiserfs_listxattr NULL #define reiserfs_removexattr NULL -#define reiserfs_write_lock_xattrs(sb) -#define reiserfs_write_unlock_xattrs(sb) -#define reiserfs_read_lock_xattrs(sb) -#define reiserfs_read_unlock_xattrs(sb) #define reiserfs_permission NULL