/* * Extended attribute REMOVE operations */ static long removexattr(struct dentry *d, char __user *name) { int error; char kname[XATTR_NAME_MAX + 1]; error = strncpy_from_user(kname, name, sizeof(kname)); if (error == 0 || error == sizeof(kname)) error = -ERANGE; if (error < 0) return error; error = -EOPNOTSUPP; if (d->d_inode->i_op && d->d_inode->i_op->removexattr) { error = security_inode_removexattr(d, kname); if (error) goto out; down(&d->d_inode->i_sem); audit_notify_watch(d->d_inode, MAY_WRITE); error = d->d_inode->i_op->removexattr(d, kname); up(&d->d_inode->i_sem); } out: return error; }
int vfs_removexattr(struct dentry *dentry, const char *name) { struct inode *inode = dentry->d_inode; int error; if (!inode->i_op->removexattr) return -EOPNOTSUPP; error = xattr_permission(inode, name, MAY_WRITE); if (error) return error; error = security_inode_removexattr(dentry, name); if (error) return error; mutex_lock(&inode->i_mutex); error = inode->i_op->removexattr(dentry, name); mutex_unlock(&inode->i_mutex); if (!error) fsnotify_xattr(dentry); return error; }