mirror of
https://github.com/linux-msm/laptops-kernel.git
synced 2026-08-13 14:19:53 -07:00
xattr: add rhashtable-based simple_xattr infrastructure
Add rhashtable support to the simple_xattr subsystem while keeping the
existing rbtree code fully functional. This allows consumers to be
migrated one at a time without breaking any intermediate build.
struct simple_xattrs gains a dispatch flag and a union holding either
the rbtree (rb_root + rwlock) or rhashtable state:
struct simple_xattrs {
bool use_rhashtable;
union {
struct { struct rb_root rb_root; rwlock_t lock; };
struct rhashtable ht;
};
};
simple_xattrs_init() continues to set up the rbtree path for existing
embedded-struct callers.
Add simple_xattrs_alloc() which dynamically allocates a simple_xattrs
and initializes the rhashtable path. This is the entry point for
consumers switching to pointer-based lazy allocation.
The five core functions (get, set, list, add, free) dispatch based on
the use_rhashtable flag.
Existing callers continue to use the rbtree path unchanged. As each
consumer is converted it will switch to simple_xattrs_alloc() and the
rhashtable path. Once all consumers are converted a follow-up patch
will remove the rbtree code.
Link: https://patch.msgid.link/20260216-work-xattr-socket-v1-2-c2efa4f74cb7@kernel.org
Acked-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Jan Kara <jack@suse.cz>
Signed-off-by: Christian Brauner <brauner@kernel.org>
This commit is contained in:
+332
-105
File diff suppressed because it is too large
Load Diff
+23
-2
@@ -107,8 +107,14 @@ static inline const char *xattr_prefix(const struct xattr_handler *handler)
|
||||
}
|
||||
|
||||
struct simple_xattrs {
|
||||
struct rb_root rb_root;
|
||||
rwlock_t lock;
|
||||
bool use_rhashtable;
|
||||
union {
|
||||
struct {
|
||||
struct rb_root rb_root;
|
||||
rwlock_t lock;
|
||||
};
|
||||
struct rhashtable ht;
|
||||
};
|
||||
};
|
||||
|
||||
struct simple_xattr {
|
||||
@@ -121,6 +127,9 @@ struct simple_xattr {
|
||||
};
|
||||
|
||||
void simple_xattrs_init(struct simple_xattrs *xattrs);
|
||||
struct simple_xattrs *simple_xattrs_alloc(void);
|
||||
struct simple_xattrs *simple_xattrs_lazy_alloc(struct simple_xattrs **xattrsp,
|
||||
const void *value, int flags);
|
||||
void simple_xattrs_free(struct simple_xattrs *xattrs, size_t *freed_space);
|
||||
size_t simple_xattr_space(const char *name, size_t size);
|
||||
struct simple_xattr *simple_xattr_alloc(const void *value, size_t size);
|
||||
@@ -137,4 +146,16 @@ void simple_xattr_add(struct simple_xattrs *xattrs,
|
||||
struct simple_xattr *new_xattr);
|
||||
int xattr_list_one(char **buffer, ssize_t *remaining_size, const char *name);
|
||||
|
||||
DEFINE_CLASS(simple_xattr,
|
||||
struct simple_xattr *,
|
||||
if (!IS_ERR_OR_NULL(_T)) simple_xattr_free(_T),
|
||||
simple_xattr_alloc(value, size),
|
||||
const void *value, size_t size)
|
||||
|
||||
DEFINE_CLASS(simple_xattrs,
|
||||
struct simple_xattrs *,
|
||||
if (!IS_ERR_OR_NULL(_T)) { simple_xattrs_free(_T, NULL); kfree(_T); },
|
||||
simple_xattrs_alloc(),
|
||||
void)
|
||||
|
||||
#endif /* _LINUX_XATTR_H */
|
||||
|
||||
+1
-1
@@ -4278,7 +4278,7 @@ static int shmem_initxattrs(struct inode *inode,
|
||||
|
||||
for (xattr = xattr_array; xattr->name != NULL; xattr++) {
|
||||
new_xattr = simple_xattr_alloc(xattr->value, xattr->value_len);
|
||||
if (!new_xattr)
|
||||
if (IS_ERR(new_xattr))
|
||||
break;
|
||||
|
||||
len = strlen(xattr->name) + 1;
|
||||
|
||||
Reference in New Issue
Block a user