Select the types of activity you want to include in your feed.
xattr: move user limits for xattrs to generic infra
Link: https://patch.msgid.link/20260216-work-xattr-socket-v1-9-c2efa4f74cb7@kernel.org Acked-by: Darrick J. Wong <djwong@kernel.org> Signed-off-by: Christian Brauner <brauner@kernel.org>
···14271427 return old_xattr;14281428}1429142914301430+static inline void simple_xattr_limits_dec(struct simple_xattr_limits *limits,14311431+ size_t size)14321432+{14331433+ atomic_sub(size, &limits->xattr_size);14341434+ atomic_dec(&limits->nr_xattrs);14351435+}14361436+14371437+static inline int simple_xattr_limits_inc(struct simple_xattr_limits *limits,14381438+ size_t size)14391439+{14401440+ if (atomic_inc_return(&limits->nr_xattrs) > SIMPLE_XATTR_MAX_NR) {14411441+ atomic_dec(&limits->nr_xattrs);14421442+ return -ENOSPC;14431443+ }14441444+14451445+ if (atomic_add_return(size, &limits->xattr_size) <= SIMPLE_XATTR_MAX_SIZE)14461446+ return 0;14471447+14481448+ simple_xattr_limits_dec(limits, size);14491449+ return -ENOSPC;14501450+}14511451+14521452+/**14531453+ * simple_xattr_set_limited - set an xattr with per-inode user.* limits14541454+ * @xattrs: the header of the xattr object14551455+ * @limits: per-inode limit counters for user.* xattrs14561456+ * @name: the name of the xattr to set or remove14571457+ * @value: the value to store (NULL to remove)14581458+ * @size: the size of @value14591459+ * @flags: XATTR_CREATE, XATTR_REPLACE, or 014601460+ *14611461+ * Like simple_xattr_set(), but enforces per-inode count and total value size14621462+ * limits for user.* xattrs. Uses speculative pre-increment of the atomic14631463+ * counters to avoid races without requiring external locks.14641464+ *14651465+ * Return: On success zero is returned. On failure a negative error code is14661466+ * returned.14671467+ */14681468+int simple_xattr_set_limited(struct simple_xattrs *xattrs,14691469+ struct simple_xattr_limits *limits,14701470+ const char *name, const void *value,14711471+ size_t size, int flags)14721472+{14731473+ struct simple_xattr *old_xattr;14741474+ int ret;14751475+14761476+ if (value) {14771477+ ret = simple_xattr_limits_inc(limits, size);14781478+ if (ret)14791479+ return ret;14801480+ }14811481+14821482+ old_xattr = simple_xattr_set(xattrs, name, value, size, flags);14831483+ if (IS_ERR(old_xattr)) {14841484+ if (value)14851485+ simple_xattr_limits_dec(limits, size);14861486+ return PTR_ERR(old_xattr);14871487+ }14881488+ if (old_xattr) {14891489+ simple_xattr_limits_dec(limits, old_xattr->size);14901490+ simple_xattr_free_rcu(old_xattr);14911491+ }14921492+ return 0;14931493+}14941494+14301495static bool xattr_is_trusted(const char *name)14311496{14321497 return !strncmp(name, XATTR_TRUSTED_PREFIX, XATTR_TRUSTED_PREFIX_LEN);