mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-04-18 04:13:58 +00:00
kernfs: Add removed_size out param for simple_xattr_set
This helps set up size accounting in the next commit. Without this out param, it's difficult to find out the removed xattr size without taking a lock for longer and walking the xattr linked list twice. Signed-off-by: Daniel Xu <dxu@dxuuu.xyz> Acked-by: Chris Down <chris@chrisdown.name> Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Signed-off-by: Tejun Heo <tj@kernel.org>
This commit is contained in:
parent
fdc85222d5
commit
a46a22955b
4 changed files with 14 additions and 4 deletions
|
@ -303,7 +303,7 @@ int kernfs_xattr_set(struct kernfs_node *kn, const char *name,
|
||||||
if (!attrs)
|
if (!attrs)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
return simple_xattr_set(&attrs->xattrs, name, value, size, flags);
|
return simple_xattr_set(&attrs->xattrs, name, value, size, flags, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int kernfs_vfs_xattr_get(const struct xattr_handler *handler,
|
static int kernfs_vfs_xattr_get(const struct xattr_handler *handler,
|
||||||
|
|
11
fs/xattr.c
11
fs/xattr.c
|
@ -860,6 +860,7 @@ int simple_xattr_get(struct simple_xattrs *xattrs, const char *name,
|
||||||
* @value: value of the xattr. If %NULL, will remove the attribute.
|
* @value: value of the xattr. If %NULL, will remove the attribute.
|
||||||
* @size: size of the new xattr
|
* @size: size of the new xattr
|
||||||
* @flags: %XATTR_{CREATE|REPLACE}
|
* @flags: %XATTR_{CREATE|REPLACE}
|
||||||
|
* @removed_size: returns size of the removed xattr, -1 if none removed
|
||||||
*
|
*
|
||||||
* %XATTR_CREATE is set, the xattr shouldn't exist already; otherwise fails
|
* %XATTR_CREATE is set, the xattr shouldn't exist already; otherwise fails
|
||||||
* with -EEXIST. If %XATTR_REPLACE is set, the xattr should exist;
|
* with -EEXIST. If %XATTR_REPLACE is set, the xattr should exist;
|
||||||
|
@ -868,7 +869,8 @@ int simple_xattr_get(struct simple_xattrs *xattrs, const char *name,
|
||||||
* Returns 0 on success, -errno on failure.
|
* Returns 0 on success, -errno on failure.
|
||||||
*/
|
*/
|
||||||
int simple_xattr_set(struct simple_xattrs *xattrs, const char *name,
|
int simple_xattr_set(struct simple_xattrs *xattrs, const char *name,
|
||||||
const void *value, size_t size, int flags)
|
const void *value, size_t size, int flags,
|
||||||
|
ssize_t *removed_size)
|
||||||
{
|
{
|
||||||
struct simple_xattr *xattr;
|
struct simple_xattr *xattr;
|
||||||
struct simple_xattr *new_xattr = NULL;
|
struct simple_xattr *new_xattr = NULL;
|
||||||
|
@ -895,8 +897,12 @@ int simple_xattr_set(struct simple_xattrs *xattrs, const char *name,
|
||||||
err = -EEXIST;
|
err = -EEXIST;
|
||||||
} else if (new_xattr) {
|
} else if (new_xattr) {
|
||||||
list_replace(&xattr->list, &new_xattr->list);
|
list_replace(&xattr->list, &new_xattr->list);
|
||||||
|
if (removed_size)
|
||||||
|
*removed_size = xattr->size;
|
||||||
} else {
|
} else {
|
||||||
list_del(&xattr->list);
|
list_del(&xattr->list);
|
||||||
|
if (removed_size)
|
||||||
|
*removed_size = xattr->size;
|
||||||
}
|
}
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
@ -908,6 +914,9 @@ int simple_xattr_set(struct simple_xattrs *xattrs, const char *name,
|
||||||
list_add(&new_xattr->list, &xattrs->head);
|
list_add(&new_xattr->list, &xattrs->head);
|
||||||
xattr = NULL;
|
xattr = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (removed_size)
|
||||||
|
*removed_size = -1;
|
||||||
out:
|
out:
|
||||||
spin_unlock(&xattrs->lock);
|
spin_unlock(&xattrs->lock);
|
||||||
if (xattr) {
|
if (xattr) {
|
||||||
|
|
|
@ -102,7 +102,8 @@ struct simple_xattr *simple_xattr_alloc(const void *value, size_t size);
|
||||||
int simple_xattr_get(struct simple_xattrs *xattrs, const char *name,
|
int simple_xattr_get(struct simple_xattrs *xattrs, const char *name,
|
||||||
void *buffer, size_t size);
|
void *buffer, size_t size);
|
||||||
int simple_xattr_set(struct simple_xattrs *xattrs, const char *name,
|
int simple_xattr_set(struct simple_xattrs *xattrs, const char *name,
|
||||||
const void *value, size_t size, int flags);
|
const void *value, size_t size, int flags,
|
||||||
|
ssize_t *removed_size);
|
||||||
ssize_t simple_xattr_list(struct inode *inode, struct simple_xattrs *xattrs, char *buffer,
|
ssize_t simple_xattr_list(struct inode *inode, struct simple_xattrs *xattrs, char *buffer,
|
||||||
size_t size);
|
size_t size);
|
||||||
void simple_xattr_list_add(struct simple_xattrs *xattrs,
|
void simple_xattr_list_add(struct simple_xattrs *xattrs,
|
||||||
|
|
|
@ -3243,7 +3243,7 @@ static int shmem_xattr_handler_set(const struct xattr_handler *handler,
|
||||||
struct shmem_inode_info *info = SHMEM_I(inode);
|
struct shmem_inode_info *info = SHMEM_I(inode);
|
||||||
|
|
||||||
name = xattr_full_name(handler, name);
|
name = xattr_full_name(handler, name);
|
||||||
return simple_xattr_set(&info->xattrs, name, value, size, flags);
|
return simple_xattr_set(&info->xattrs, name, value, size, flags, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct xattr_handler shmem_security_xattr_handler = {
|
static const struct xattr_handler shmem_security_xattr_handler = {
|
||||||
|
|
Loading…
Add table
Reference in a new issue