|
@@ -25,49 +25,45 @@
|
|
#include "f2fs.h"
|
|
#include "f2fs.h"
|
|
#include "xattr.h"
|
|
#include "xattr.h"
|
|
|
|
|
|
-static size_t f2fs_xattr_generic_list(struct dentry *dentry, char *list,
|
|
|
|
- size_t list_size, const char *name, size_t len, int type)
|
|
|
|
|
|
+static size_t f2fs_xattr_generic_list(const struct xattr_handler *handler,
|
|
|
|
+ struct dentry *dentry, char *list, size_t list_size,
|
|
|
|
+ const char *name, size_t len)
|
|
{
|
|
{
|
|
struct f2fs_sb_info *sbi = F2FS_SB(dentry->d_sb);
|
|
struct f2fs_sb_info *sbi = F2FS_SB(dentry->d_sb);
|
|
- int total_len, prefix_len = 0;
|
|
|
|
- const char *prefix = NULL;
|
|
|
|
|
|
+ int total_len, prefix_len;
|
|
|
|
|
|
- switch (type) {
|
|
|
|
|
|
+ switch (handler->flags) {
|
|
case F2FS_XATTR_INDEX_USER:
|
|
case F2FS_XATTR_INDEX_USER:
|
|
if (!test_opt(sbi, XATTR_USER))
|
|
if (!test_opt(sbi, XATTR_USER))
|
|
return -EOPNOTSUPP;
|
|
return -EOPNOTSUPP;
|
|
- prefix = XATTR_USER_PREFIX;
|
|
|
|
- prefix_len = XATTR_USER_PREFIX_LEN;
|
|
|
|
break;
|
|
break;
|
|
case F2FS_XATTR_INDEX_TRUSTED:
|
|
case F2FS_XATTR_INDEX_TRUSTED:
|
|
if (!capable(CAP_SYS_ADMIN))
|
|
if (!capable(CAP_SYS_ADMIN))
|
|
return -EPERM;
|
|
return -EPERM;
|
|
- prefix = XATTR_TRUSTED_PREFIX;
|
|
|
|
- prefix_len = XATTR_TRUSTED_PREFIX_LEN;
|
|
|
|
break;
|
|
break;
|
|
case F2FS_XATTR_INDEX_SECURITY:
|
|
case F2FS_XATTR_INDEX_SECURITY:
|
|
- prefix = XATTR_SECURITY_PREFIX;
|
|
|
|
- prefix_len = XATTR_SECURITY_PREFIX_LEN;
|
|
|
|
break;
|
|
break;
|
|
default:
|
|
default:
|
|
return -EINVAL;
|
|
return -EINVAL;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ prefix_len = strlen(handler->prefix);
|
|
total_len = prefix_len + len + 1;
|
|
total_len = prefix_len + len + 1;
|
|
if (list && total_len <= list_size) {
|
|
if (list && total_len <= list_size) {
|
|
- memcpy(list, prefix, prefix_len);
|
|
|
|
|
|
+ memcpy(list, handler->prefix, prefix_len);
|
|
memcpy(list + prefix_len, name, len);
|
|
memcpy(list + prefix_len, name, len);
|
|
list[prefix_len + len] = '\0';
|
|
list[prefix_len + len] = '\0';
|
|
}
|
|
}
|
|
return total_len;
|
|
return total_len;
|
|
}
|
|
}
|
|
|
|
|
|
-static int f2fs_xattr_generic_get(struct dentry *dentry, const char *name,
|
|
|
|
- void *buffer, size_t size, int type)
|
|
|
|
|
|
+static int f2fs_xattr_generic_get(const struct xattr_handler *handler,
|
|
|
|
+ struct dentry *dentry, const char *name, void *buffer,
|
|
|
|
+ size_t size)
|
|
{
|
|
{
|
|
struct f2fs_sb_info *sbi = F2FS_SB(dentry->d_sb);
|
|
struct f2fs_sb_info *sbi = F2FS_SB(dentry->d_sb);
|
|
|
|
|
|
- switch (type) {
|
|
|
|
|
|
+ switch (handler->flags) {
|
|
case F2FS_XATTR_INDEX_USER:
|
|
case F2FS_XATTR_INDEX_USER:
|
|
if (!test_opt(sbi, XATTR_USER))
|
|
if (!test_opt(sbi, XATTR_USER))
|
|
return -EOPNOTSUPP;
|
|
return -EOPNOTSUPP;
|
|
@@ -83,15 +79,17 @@ static int f2fs_xattr_generic_get(struct dentry *dentry, const char *name,
|
|
}
|
|
}
|
|
if (strcmp(name, "") == 0)
|
|
if (strcmp(name, "") == 0)
|
|
return -EINVAL;
|
|
return -EINVAL;
|
|
- return f2fs_getxattr(d_inode(dentry), type, name, buffer, size, NULL);
|
|
|
|
|
|
+ return f2fs_getxattr(d_inode(dentry), handler->flags, name,
|
|
|
|
+ buffer, size, NULL);
|
|
}
|
|
}
|
|
|
|
|
|
-static int f2fs_xattr_generic_set(struct dentry *dentry, const char *name,
|
|
|
|
- const void *value, size_t size, int flags, int type)
|
|
|
|
|
|
+static int f2fs_xattr_generic_set(const struct xattr_handler *handler,
|
|
|
|
+ struct dentry *dentry, const char *name, const void *value,
|
|
|
|
+ size_t size, int flags)
|
|
{
|
|
{
|
|
struct f2fs_sb_info *sbi = F2FS_SB(dentry->d_sb);
|
|
struct f2fs_sb_info *sbi = F2FS_SB(dentry->d_sb);
|
|
|
|
|
|
- switch (type) {
|
|
|
|
|
|
+ switch (handler->flags) {
|
|
case F2FS_XATTR_INDEX_USER:
|
|
case F2FS_XATTR_INDEX_USER:
|
|
if (!test_opt(sbi, XATTR_USER))
|
|
if (!test_opt(sbi, XATTR_USER))
|
|
return -EOPNOTSUPP;
|
|
return -EOPNOTSUPP;
|
|
@@ -108,27 +106,26 @@ static int f2fs_xattr_generic_set(struct dentry *dentry, const char *name,
|
|
if (strcmp(name, "") == 0)
|
|
if (strcmp(name, "") == 0)
|
|
return -EINVAL;
|
|
return -EINVAL;
|
|
|
|
|
|
- return f2fs_setxattr(d_inode(dentry), type, name,
|
|
|
|
|
|
+ return f2fs_setxattr(d_inode(dentry), handler->flags, name,
|
|
value, size, NULL, flags);
|
|
value, size, NULL, flags);
|
|
}
|
|
}
|
|
|
|
|
|
-static size_t f2fs_xattr_advise_list(struct dentry *dentry, char *list,
|
|
|
|
- size_t list_size, const char *name, size_t len, int type)
|
|
|
|
|
|
+static size_t f2fs_xattr_advise_list(const struct xattr_handler *handler,
|
|
|
|
+ struct dentry *dentry, char *list, size_t list_size,
|
|
|
|
+ const char *name, size_t len)
|
|
{
|
|
{
|
|
const char *xname = F2FS_SYSTEM_ADVISE_PREFIX;
|
|
const char *xname = F2FS_SYSTEM_ADVISE_PREFIX;
|
|
size_t size;
|
|
size_t size;
|
|
|
|
|
|
- if (type != F2FS_XATTR_INDEX_ADVISE)
|
|
|
|
- return 0;
|
|
|
|
-
|
|
|
|
size = strlen(xname) + 1;
|
|
size = strlen(xname) + 1;
|
|
if (list && size <= list_size)
|
|
if (list && size <= list_size)
|
|
memcpy(list, xname, size);
|
|
memcpy(list, xname, size);
|
|
return size;
|
|
return size;
|
|
}
|
|
}
|
|
|
|
|
|
-static int f2fs_xattr_advise_get(struct dentry *dentry, const char *name,
|
|
|
|
- void *buffer, size_t size, int type)
|
|
|
|
|
|
+static int f2fs_xattr_advise_get(const struct xattr_handler *handler,
|
|
|
|
+ struct dentry *dentry, const char *name, void *buffer,
|
|
|
|
+ size_t size)
|
|
{
|
|
{
|
|
struct inode *inode = d_inode(dentry);
|
|
struct inode *inode = d_inode(dentry);
|
|
|
|
|
|
@@ -140,8 +137,9 @@ static int f2fs_xattr_advise_get(struct dentry *dentry, const char *name,
|
|
return sizeof(char);
|
|
return sizeof(char);
|
|
}
|
|
}
|
|
|
|
|
|
-static int f2fs_xattr_advise_set(struct dentry *dentry, const char *name,
|
|
|
|
- const void *value, size_t size, int flags, int type)
|
|
|
|
|
|
+static int f2fs_xattr_advise_set(const struct xattr_handler *handler,
|
|
|
|
+ struct dentry *dentry, const char *name, const void *value,
|
|
|
|
+ size_t size, int flags)
|
|
{
|
|
{
|
|
struct inode *inode = d_inode(dentry);
|
|
struct inode *inode = d_inode(dentry);
|
|
|
|
|
|
@@ -462,8 +460,8 @@ ssize_t f2fs_listxattr(struct dentry *dentry, char *buffer, size_t buffer_size)
|
|
if (!handler)
|
|
if (!handler)
|
|
continue;
|
|
continue;
|
|
|
|
|
|
- size = handler->list(dentry, buffer, rest, entry->e_name,
|
|
|
|
- entry->e_name_len, handler->flags);
|
|
|
|
|
|
+ size = handler->list(handler, dentry, buffer, rest,
|
|
|
|
+ entry->e_name, entry->e_name_len);
|
|
if (buffer && size > rest) {
|
|
if (buffer && size > rest) {
|
|
error = -ERANGE;
|
|
error = -ERANGE;
|
|
goto cleanup;
|
|
goto cleanup;
|