commented early_printk patch because of rejects.
[linux-flexiantxendom0-3.2.10.git] / fs / jfs / xattr.c
index 37c17b3..ddcb7f7 100644 (file)
@@ -729,7 +729,7 @@ static int can_set_xattr(struct inode *inode, const char *name,
                return -EPERM;
 
 #ifdef CONFIG_JFS_POSIX_ACL
-       return jfs_permission_have_sem(inode, MAY_WRITE);
+       return jfs_permission(inode, MAY_WRITE, NULL);
 #else
        return permission(inode, MAY_WRITE, NULL);
 #endif
@@ -763,6 +763,8 @@ int __jfs_setxattr(struct inode *inode, const char *name, const void *value,
                namelen -= XATTR_OS2_PREFIX_LEN;
        }
 
+       down_write(&JFS_IP(inode)->xattr_sem);
+
        xattr_size = ea_get(inode, &ea_buf, 0);
        if (xattr_size < 0) {
                rc = xattr_size;
@@ -868,6 +870,8 @@ int __jfs_setxattr(struct inode *inode, const char *name, const void *value,
       release:
        ea_release(inode, &ea_buf);
       out:
+       up_write(&JFS_IP(inode)->xattr_sem);
+
        if (os2name)
                kfree(os2name);
 
@@ -890,8 +894,7 @@ static int can_get_xattr(struct inode *inode, const char *name)
 #ifdef CONFIG_JFS_POSIX_ACL
        if(strncmp(name, XATTR_SYSTEM_PREFIX, XATTR_SYSTEM_PREFIX_LEN) == 0)
                return 0;
-       else
-               return jfs_permission_have_sem(inode, MAY_READ);
+       return jfs_permission(inode, MAY_READ, NULL);
 #else
        return permission(inode, MAY_READ, NULL);
 #endif
@@ -923,7 +926,10 @@ ssize_t __jfs_getxattr(struct inode *inode, const char *name, void *data,
                namelen -= XATTR_OS2_PREFIX_LEN;
        }
 
+       down_read(&JFS_IP(inode)->xattr_sem);
+
        xattr_size = ea_get(inode, &ea_buf, 0);
+
        if (xattr_size < 0) {
                size = xattr_size;
                goto out;
@@ -955,6 +961,8 @@ ssize_t __jfs_getxattr(struct inode *inode, const char *name, void *data,
       release:
        ea_release(inode, &ea_buf);
       out:
+       up_read(&JFS_IP(inode)->xattr_sem);
+
        if (os2name)
                kfree(os2name);
 
@@ -966,15 +974,12 @@ ssize_t jfs_getxattr(struct dentry *dentry, const char *name, void *data,
 {
        int err;
 
-       down(&dentry->d_inode->i_sem);
        err = __jfs_getxattr(dentry->d_inode, name, data, buf_size);
-       up(&dentry->d_inode->i_sem);
 
        return err;
 }
 
-static ssize_t __jfs_listxattr(struct dentry * dentry, char *data,
-                              size_t buf_size)
+ssize_t jfs_listxattr(struct dentry * dentry, char *data, size_t buf_size)
 {
        struct inode *inode = dentry->d_inode;
        char *buffer;
@@ -984,6 +989,8 @@ static ssize_t __jfs_listxattr(struct dentry * dentry, char *data,
        struct jfs_ea *ea;
        struct ea_buffer ea_buf;
 
+       down_read(&JFS_IP(inode)->xattr_sem);
+
        xattr_size = ea_get(inode, &ea_buf, 0);
        if (xattr_size < 0) {
                size = xattr_size;
@@ -1017,20 +1024,10 @@ static ssize_t __jfs_listxattr(struct dentry * dentry, char *data,
       release:
        ea_release(inode, &ea_buf);
       out:
+       up_read(&JFS_IP(inode)->xattr_sem);
        return size;
 }
 
-ssize_t jfs_listxattr(struct dentry * dentry, char *data, size_t buf_size)
-{
-       int err;
-
-       down(&dentry->d_inode->i_sem);
-       err = __jfs_listxattr(dentry, data, buf_size);
-       up(&dentry->d_inode->i_sem);
-
-       return err;
-}
-
 int jfs_removexattr(struct dentry *dentry, const char *name)
 {
        return __jfs_setxattr(dentry->d_inode, name, 0, 0, XATTR_REPLACE);