hfsplus: use xattr handlers for removexattr
authorChristoph Hellwig <hch@infradead.org>
Thu, 30 Jan 2014 07:59:19 +0000 (23:59 -0800)
committerAl Viro <viro@zeniv.linux.org.uk>
Fri, 31 Jan 2014 19:44:39 +0000 (14:44 -0500)
hfsplus was already using the handlers for get and set operations,
and with the removal of can_set_xattr we've now allow operations that
wouldn't otherwise be allowed.

With this we can also centralize the special-casing of the osx.
attrs that don't have prefixes on disk in the osx xattr handlers.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
fs/hfsplus/dir.c
fs/hfsplus/inode.c
fs/hfsplus/xattr.c
fs/hfsplus/xattr.h

index 9ee62985e739eba797e01318278712be6ee0dfac..bdec66522de3436ea270b92e4ce1c31938a2fa5c 100644 (file)
@@ -529,7 +529,7 @@ const struct inode_operations hfsplus_dir_inode_operations = {
        .setxattr               = generic_setxattr,
        .getxattr               = generic_getxattr,
        .listxattr              = hfsplus_listxattr,
-       .removexattr            = hfsplus_removexattr,
+       .removexattr            = generic_removexattr,
 #ifdef CONFIG_HFSPLUS_FS_POSIX_ACL
        .get_acl                = hfsplus_get_posix_acl,
        .set_acl                = hfsplus_set_posix_acl,
index 4551cbd6bd43aaaebbde666c22c726c76112ab6e..fa929f325f87502074d66e208c1a57feba089c82 100644 (file)
@@ -331,7 +331,7 @@ static const struct inode_operations hfsplus_file_inode_operations = {
        .setxattr       = generic_setxattr,
        .getxattr       = generic_getxattr,
        .listxattr      = hfsplus_listxattr,
-       .removexattr    = hfsplus_removexattr,
+       .removexattr    = generic_removexattr,
 #ifdef CONFIG_HFSPLUS_FS_POSIX_ACL
        .get_acl        = hfsplus_get_posix_acl,
        .set_acl        = hfsplus_set_posix_acl,
index 0b4a5c9b93c44ad415f9378c3ec1e3914761c6ef..4e27edc082a4805450f5fb91356b48f804ca7693 100644 (file)
@@ -11,6 +11,8 @@
 #include "xattr.h"
 #include "acl.h"
 
+static int hfsplus_removexattr(struct inode *inode, const char *name);
+
 const struct xattr_handler *hfsplus_xattr_handlers[] = {
        &hfsplus_xattr_osx_handler,
        &hfsplus_xattr_user_handler,
@@ -274,14 +276,8 @@ int __hfsplus_setxattr(struct inode *inode, const char *name,
                                HFSPLUS_IS_RSRC(inode))
                return -EOPNOTSUPP;
 
-       if (strncmp(name, XATTR_MAC_OSX_PREFIX,
-                               XATTR_MAC_OSX_PREFIX_LEN) == 0)
-               name += XATTR_MAC_OSX_PREFIX_LEN;
-
-       if (value == NULL) {
-               value = "";
-               size = 0;
-       }
+       if (value == NULL)
+               return hfsplus_removexattr(inode, name);
 
        err = hfs_find_init(HFSPLUS_SB(inode->i_sb)->cat_tree, &cat_fd);
        if (err) {
@@ -399,16 +395,11 @@ end_setxattr:
        return err;
 }
 
-static inline int is_osx_xattr(const char *xattr_name)
-{
-       return !is_known_namespace(xattr_name);
-}
-
 static int name_len(const char *xattr_name, int xattr_name_len)
 {
        int len = xattr_name_len + 1;
 
-       if (is_osx_xattr(xattr_name))
+       if (!is_known_namespace(xattr_name))
                len += XATTR_MAC_OSX_PREFIX_LEN;
 
        return len;
@@ -419,7 +410,7 @@ static int copy_name(char *buffer, const char *xattr_name, int name_len)
        int len = name_len;
        int offset = 0;
 
-       if (is_osx_xattr(xattr_name)) {
+       if (!is_known_namespace(xattr_name)) {
                strncpy(buffer, XATTR_MAC_OSX_PREFIX, XATTR_MAC_OSX_PREFIX_LEN);
                offset += XATTR_MAC_OSX_PREFIX_LEN;
                len += XATTR_MAC_OSX_PREFIX_LEN;
@@ -497,18 +488,6 @@ ssize_t __hfsplus_getxattr(struct inode *inode, const char *name,
                                HFSPLUS_IS_RSRC(inode))
                return -EOPNOTSUPP;
 
-       if (strncmp(name, XATTR_MAC_OSX_PREFIX,
-                               XATTR_MAC_OSX_PREFIX_LEN) == 0) {
-               /* skip "osx." prefix */
-               name += XATTR_MAC_OSX_PREFIX_LEN;
-               /*
-                * Don't allow retrieving properly prefixed attributes
-                * by prepending them with "osx."
-                */
-               if (is_known_namespace(name))
-                       return -EOPNOTSUPP;
-       }
-
        if (!strcmp_xattr_finder_info(name))
                return hfsplus_getxattr_finder_info(inode, value, size);
 
@@ -743,28 +722,18 @@ end_listxattr:
        return res;
 }
 
-int hfsplus_removexattr(struct dentry *dentry, const char *name)
+static int hfsplus_removexattr(struct inode *inode, const char *name)
 {
        int err = 0;
-       struct inode *inode = dentry->d_inode;
        struct hfs_find_data cat_fd;
        u16 flags;
        u16 cat_entry_type;
        int is_xattr_acl_deleted = 0;
        int is_all_xattrs_deleted = 0;
 
-       if ((!S_ISREG(inode->i_mode) &&
-                       !S_ISDIR(inode->i_mode)) ||
-                               HFSPLUS_IS_RSRC(inode))
-               return -EOPNOTSUPP;
-
        if (!HFSPLUS_SB(inode->i_sb)->attr_tree)
                return -EOPNOTSUPP;
 
-       if (strncmp(name, XATTR_MAC_OSX_PREFIX,
-                               XATTR_MAC_OSX_PREFIX_LEN) == 0)
-               name += XATTR_MAC_OSX_PREFIX_LEN;
-
        if (!strcmp_xattr_finder_info(name))
                return -EOPNOTSUPP;
 
@@ -838,8 +807,12 @@ static int hfsplus_osx_getxattr(struct dentry *dentry, const char *name,
        if (len > HFSPLUS_ATTR_MAX_STRLEN)
                return -EOPNOTSUPP;
 
-       strcpy(xattr_name, XATTR_MAC_OSX_PREFIX);
-       strcpy(xattr_name + XATTR_MAC_OSX_PREFIX_LEN, name);
+       /*
+        * Don't allow retrieving properly prefixed attributes
+        * by prepending them with "osx."
+        */
+       if (is_known_namespace(name))
+               return -EOPNOTSUPP;
 
        return hfsplus_getxattr(dentry, xattr_name, buffer, size);
 }
@@ -857,12 +830,13 @@ static int hfsplus_osx_setxattr(struct dentry *dentry, const char *name,
        if (len > HFSPLUS_ATTR_MAX_STRLEN)
                return -EOPNOTSUPP;
 
+       /*
+        * Don't allow setting properly prefixed attributes
+        * by prepending them with "osx."
+        */
        if (is_known_namespace(name))
                return -EOPNOTSUPP;
 
-       strcpy(xattr_name, XATTR_MAC_OSX_PREFIX);
-       strcpy(xattr_name + XATTR_MAC_OSX_PREFIX_LEN, name);
-
        return hfsplus_setxattr(dentry, xattr_name, buffer, size, flags);
 }
 
index 9e214490c313f6b61204db43e7317f2aac086e5c..288530cf80b5fe5555f05294d24710868ac3b46a 100644 (file)
@@ -40,8 +40,6 @@ static inline ssize_t hfsplus_getxattr(struct dentry *dentry,
 
 ssize_t hfsplus_listxattr(struct dentry *dentry, char *buffer, size_t size);
 
-int hfsplus_removexattr(struct dentry *dentry, const char *name);
-
 int hfsplus_init_security(struct inode *inode, struct inode *dir,
                                const struct qstr *qstr);