static int user_set(const struct xattr_handler *handler, struct dentry *unused, struct inode *inode, const char *name, const void *buffer, size_t size, int flags) { if (!reiserfs_xattrs_user(inode->i_sb)) return -EOPNOTSUPP; return reiserfs_xattr_set(inode, xattr_full_name(handler, name), buffer, size, flags); }
static int user_set(struct dentry *dentry, const char *name, const void *buffer, size_t size, int flags, int handler_flags) { if (strlen(name) < sizeof(XATTR_USER_PREFIX)) return -EINVAL; if (!reiserfs_xattrs_user(dentry->d_sb)) return -EOPNOTSUPP; return reiserfs_xattr_set(dentry->d_inode, name, buffer, size, flags); }
static int user_set(struct inode *inode, const char *name, const void *buffer, size_t size, int flags) { if (strlen(name) < sizeof(XATTR_USER_PREFIX)) return -EINVAL; if (!reiserfs_xattrs_user(inode->i_sb)) return -EOPNOTSUPP; return reiserfs_xattr_set(inode, name, buffer, size, flags); }
static int trusted_set(const struct xattr_handler *handler, struct dentry *dentry, const char *name, const void *buffer, size_t size, int flags) { if (!capable(CAP_SYS_ADMIN) || IS_PRIVATE(d_inode(dentry))) return -EPERM; return reiserfs_xattr_set(d_inode(dentry), xattr_full_name(handler, name), buffer, size, flags); }
static int security_set(struct inode *inode, const char *name, const void *buffer, size_t size, int flags) { if (strlen(name) < sizeof(XATTR_SECURITY_PREFIX)) return -EINVAL; if (is_reiserfs_priv_object(inode)) return -EPERM; return reiserfs_xattr_set(inode, name, buffer, size, flags); }
static int trusted_set(struct dentry *dentry, const char *name, const void *buffer, size_t size, int flags, int handler_flags) { if (strlen(name) < sizeof(XATTR_TRUSTED_PREFIX)) return -EINVAL; if (!capable(CAP_SYS_ADMIN) || IS_PRIVATE(dentry->d_inode)) return -EPERM; return reiserfs_xattr_set(dentry->d_inode, name, buffer, size, flags); }
static int security_set(struct dentry *dentry, const char *name, const void *buffer, size_t size, int flags, int handler_flags) { if (strlen(name) < sizeof(XATTR_SECURITY_PREFIX)) return -EINVAL; if (IS_PRIVATE(dentry->d_inode)) return -EPERM; return reiserfs_xattr_set(dentry->d_inode, name, buffer, size, flags); }
/* * Inode operation set_posix_acl(). * * inode->i_sem: down * BKL held [before 2.5.x] */ static int reiserfs_set_acl(struct inode *inode, int type, struct posix_acl *acl) { char *name; void *value = NULL; struct posix_acl **p_acl; size_t size; int error; struct reiserfs_inode_info *reiserfs_i = REISERFS_I(inode); if (S_ISLNK(inode->i_mode)) return -EOPNOTSUPP; switch (type) { case ACL_TYPE_ACCESS: name = XATTR_NAME_ACL_ACCESS; p_acl = &reiserfs_i->i_acl_access; if (acl) { mode_t mode = inode->i_mode; error = posix_acl_equiv_mode (acl, &mode); if (error < 0) return error; else { inode->i_mode = mode; if (error == 0) acl = NULL; } } break; case ACL_TYPE_DEFAULT: name = XATTR_NAME_ACL_DEFAULT; p_acl = &reiserfs_i->i_acl_default; if (!S_ISDIR (inode->i_mode)) return acl ? -EACCES : 0; break; default: return -EINVAL; } if (acl) { value = posix_acl_to_disk(acl, &size); if (IS_ERR(value)) return (int)PTR_ERR(value); error = reiserfs_xattr_set(inode, name, value, size, 0); } else { error = reiserfs_xattr_del (inode, name); if (error == -ENODATA) { /* This may seem odd here, but it means that the ACL was set * with a value representable with mode bits. If there was * an ACL before, reiserfs_xattr_del already dirtied the inode. */ mark_inode_dirty (inode); error = 0; } } if (value) kfree(value); if (!error) { /* Release the old one */ if (!IS_ERR (*p_acl) && *p_acl) posix_acl_release (*p_acl); if (acl == NULL) *p_acl = ERR_PTR (-ENODATA); else *p_acl = posix_acl_dup (acl); } return error; }