hfsplus: use xattr handlers for removexattr
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>
This commit is contained in:
parent
e5fbf67dab
commit
b168fff721
|
@ -529,7 +529,7 @@ const struct inode_operations hfsplus_dir_inode_operations = {
|
||||||
.setxattr = generic_setxattr,
|
.setxattr = generic_setxattr,
|
||||||
.getxattr = generic_getxattr,
|
.getxattr = generic_getxattr,
|
||||||
.listxattr = hfsplus_listxattr,
|
.listxattr = hfsplus_listxattr,
|
||||||
.removexattr = hfsplus_removexattr,
|
.removexattr = generic_removexattr,
|
||||||
#ifdef CONFIG_HFSPLUS_FS_POSIX_ACL
|
#ifdef CONFIG_HFSPLUS_FS_POSIX_ACL
|
||||||
.get_acl = hfsplus_get_posix_acl,
|
.get_acl = hfsplus_get_posix_acl,
|
||||||
.set_acl = hfsplus_set_posix_acl,
|
.set_acl = hfsplus_set_posix_acl,
|
||||||
|
|
|
@ -331,7 +331,7 @@ static const struct inode_operations hfsplus_file_inode_operations = {
|
||||||
.setxattr = generic_setxattr,
|
.setxattr = generic_setxattr,
|
||||||
.getxattr = generic_getxattr,
|
.getxattr = generic_getxattr,
|
||||||
.listxattr = hfsplus_listxattr,
|
.listxattr = hfsplus_listxattr,
|
||||||
.removexattr = hfsplus_removexattr,
|
.removexattr = generic_removexattr,
|
||||||
#ifdef CONFIG_HFSPLUS_FS_POSIX_ACL
|
#ifdef CONFIG_HFSPLUS_FS_POSIX_ACL
|
||||||
.get_acl = hfsplus_get_posix_acl,
|
.get_acl = hfsplus_get_posix_acl,
|
||||||
.set_acl = hfsplus_set_posix_acl,
|
.set_acl = hfsplus_set_posix_acl,
|
||||||
|
|
|
@ -11,6 +11,8 @@
|
||||||
#include "xattr.h"
|
#include "xattr.h"
|
||||||
#include "acl.h"
|
#include "acl.h"
|
||||||
|
|
||||||
|
static int hfsplus_removexattr(struct inode *inode, const char *name);
|
||||||
|
|
||||||
const struct xattr_handler *hfsplus_xattr_handlers[] = {
|
const struct xattr_handler *hfsplus_xattr_handlers[] = {
|
||||||
&hfsplus_xattr_osx_handler,
|
&hfsplus_xattr_osx_handler,
|
||||||
&hfsplus_xattr_user_handler,
|
&hfsplus_xattr_user_handler,
|
||||||
|
@ -274,14 +276,8 @@ int __hfsplus_setxattr(struct inode *inode, const char *name,
|
||||||
HFSPLUS_IS_RSRC(inode))
|
HFSPLUS_IS_RSRC(inode))
|
||||||
return -EOPNOTSUPP;
|
return -EOPNOTSUPP;
|
||||||
|
|
||||||
if (strncmp(name, XATTR_MAC_OSX_PREFIX,
|
if (value == NULL)
|
||||||
XATTR_MAC_OSX_PREFIX_LEN) == 0)
|
return hfsplus_removexattr(inode, name);
|
||||||
name += XATTR_MAC_OSX_PREFIX_LEN;
|
|
||||||
|
|
||||||
if (value == NULL) {
|
|
||||||
value = "";
|
|
||||||
size = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
err = hfs_find_init(HFSPLUS_SB(inode->i_sb)->cat_tree, &cat_fd);
|
err = hfs_find_init(HFSPLUS_SB(inode->i_sb)->cat_tree, &cat_fd);
|
||||||
if (err) {
|
if (err) {
|
||||||
|
@ -399,16 +395,11 @@ end_setxattr:
|
||||||
return err;
|
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)
|
static int name_len(const char *xattr_name, int xattr_name_len)
|
||||||
{
|
{
|
||||||
int len = xattr_name_len + 1;
|
int len = xattr_name_len + 1;
|
||||||
|
|
||||||
if (is_osx_xattr(xattr_name))
|
if (!is_known_namespace(xattr_name))
|
||||||
len += XATTR_MAC_OSX_PREFIX_LEN;
|
len += XATTR_MAC_OSX_PREFIX_LEN;
|
||||||
|
|
||||||
return 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 len = name_len;
|
||||||
int offset = 0;
|
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);
|
strncpy(buffer, XATTR_MAC_OSX_PREFIX, XATTR_MAC_OSX_PREFIX_LEN);
|
||||||
offset += XATTR_MAC_OSX_PREFIX_LEN;
|
offset += XATTR_MAC_OSX_PREFIX_LEN;
|
||||||
len += 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))
|
HFSPLUS_IS_RSRC(inode))
|
||||||
return -EOPNOTSUPP;
|
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))
|
if (!strcmp_xattr_finder_info(name))
|
||||||
return hfsplus_getxattr_finder_info(inode, value, size);
|
return hfsplus_getxattr_finder_info(inode, value, size);
|
||||||
|
|
||||||
|
@ -743,28 +722,18 @@ end_listxattr:
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
int hfsplus_removexattr(struct dentry *dentry, const char *name)
|
static int hfsplus_removexattr(struct inode *inode, const char *name)
|
||||||
{
|
{
|
||||||
int err = 0;
|
int err = 0;
|
||||||
struct inode *inode = dentry->d_inode;
|
|
||||||
struct hfs_find_data cat_fd;
|
struct hfs_find_data cat_fd;
|
||||||
u16 flags;
|
u16 flags;
|
||||||
u16 cat_entry_type;
|
u16 cat_entry_type;
|
||||||
int is_xattr_acl_deleted = 0;
|
int is_xattr_acl_deleted = 0;
|
||||||
int is_all_xattrs_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)
|
if (!HFSPLUS_SB(inode->i_sb)->attr_tree)
|
||||||
return -EOPNOTSUPP;
|
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))
|
if (!strcmp_xattr_finder_info(name))
|
||||||
return -EOPNOTSUPP;
|
return -EOPNOTSUPP;
|
||||||
|
|
||||||
|
@ -838,8 +807,12 @@ static int hfsplus_osx_getxattr(struct dentry *dentry, const char *name,
|
||||||
if (len > HFSPLUS_ATTR_MAX_STRLEN)
|
if (len > HFSPLUS_ATTR_MAX_STRLEN)
|
||||||
return -EOPNOTSUPP;
|
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);
|
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)
|
if (len > HFSPLUS_ATTR_MAX_STRLEN)
|
||||||
return -EOPNOTSUPP;
|
return -EOPNOTSUPP;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Don't allow setting properly prefixed attributes
|
||||||
|
* by prepending them with "osx."
|
||||||
|
*/
|
||||||
if (is_known_namespace(name))
|
if (is_known_namespace(name))
|
||||||
return -EOPNOTSUPP;
|
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);
|
return hfsplus_setxattr(dentry, xattr_name, buffer, size, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
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,
|
int hfsplus_init_security(struct inode *inode, struct inode *dir,
|
||||||
const struct qstr *qstr);
|
const struct qstr *qstr);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue