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