}
ea_buf->flag = EA_EXTENT;
ea_buf->mp = read_metapage(inode, addressDXD(&ji->ea),
- lengthDXD(&ji->ea), 1);
+ lengthDXD(&ji->ea) << sb->s_blocksize_bits,
+ 1);
if (ea_buf->mp == NULL)
return -EIO;
ea_buf->xattr = ea_buf->mp->data;
}
inode->i_mode = mode;
mark_inode_dirty(inode);
- if (rc == 0)
- value = NULL;
}
/*
* We're changing the ACL. Get rid of the cached one
*/
acl =JFS_IP(inode)->i_acl;
- if (acl && (acl != JFS_ACL_NOT_CACHED))
+ if (acl != JFS_ACL_NOT_CACHED)
posix_acl_release(acl);
JFS_IP(inode)->i_acl = JFS_ACL_NOT_CACHED;
+
+ return 0;
} else if (strcmp(name, XATTR_NAME_ACL_DEFAULT) == 0) {
+ acl = posix_acl_from_xattr(value, value_len);
+ if (IS_ERR(acl)) {
+ rc = PTR_ERR(acl);
+ printk(KERN_ERR "posix_acl_from_xattr returned %d\n",
+ rc);
+ return rc;
+ }
+ posix_acl_release(acl);
+
/*
* We're changing the default ACL. Get rid of the cached one
*/
if (acl && (acl != JFS_ACL_NOT_CACHED))
posix_acl_release(acl);
JFS_IP(inode)->i_default_acl = JFS_ACL_NOT_CACHED;
- } else
- /* Invalid xattr name */
- return -EINVAL;
- return 0;
-#else /* CONFIG_JFS_POSIX_ACL */
- return -EOPNOTSUPP;
+
+ return 0;
+ }
#endif /* CONFIG_JFS_POSIX_ACL */
+ return -EOPNOTSUPP;
}
static int can_set_xattr(struct inode *inode, const char *name,
(!S_ISDIR(inode->i_mode) || inode->i_mode &S_ISVTX))
return -EPERM;
-#ifdef CONFIG_JFS_POSIX_ACL
- return jfs_permission(inode, MAY_WRITE, NULL);
-#else
return permission(inode, MAY_WRITE, NULL);
-#endif
}
int __jfs_setxattr(struct inode *inode, const char *name, const void *value,
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;
- return jfs_permission(inode, MAY_READ, NULL);
-#else
return permission(inode, MAY_READ, NULL);
-#endif
}
ssize_t __jfs_getxattr(struct inode *inode, const char *name, void *data,