inode.c (0d72b92883c651a11059d93335f33d65c6eb653b) inode.c (5de75970c9fd7220e394b76e6d20fbafa1369b5a)
1// SPDX-License-Identifier: GPL-2.0-only
2/*
3 * fs/kernfs/inode.c - kernfs inode implementation
4 *
5 * Copyright (c) 2001-3 Patrick Mochel
6 * Copyright (c) 2007 SUSE Linux Products GmbH
7 * Copyright (c) 2007, 2013 Tejun Heo <tj@kernel.org>
8 */

--- 137 unchanged lines hidden (view full) ---

146 return -ENOMEM;
147
148 return simple_xattr_list(d_inode(dentry), &attrs->xattrs, buf, size);
149}
150
151static inline void set_default_inode_attr(struct inode *inode, umode_t mode)
152{
153 inode->i_mode = mode;
1// SPDX-License-Identifier: GPL-2.0-only
2/*
3 * fs/kernfs/inode.c - kernfs inode implementation
4 *
5 * Copyright (c) 2001-3 Patrick Mochel
6 * Copyright (c) 2007 SUSE Linux Products GmbH
7 * Copyright (c) 2007, 2013 Tejun Heo <tj@kernel.org>
8 */

--- 137 unchanged lines hidden (view full) ---

146 return -ENOMEM;
147
148 return simple_xattr_list(d_inode(dentry), &attrs->xattrs, buf, size);
149}
150
151static inline void set_default_inode_attr(struct inode *inode, umode_t mode)
152{
153 inode->i_mode = mode;
154 inode->i_atime = inode->i_mtime = inode_set_ctime_current(inode);
154 inode->i_atime = inode->i_mtime =
155 inode->i_ctime = current_time(inode);
155}
156
157static inline void set_inode_attr(struct inode *inode,
158 struct kernfs_iattrs *attrs)
159{
160 inode->i_uid = attrs->ia_uid;
161 inode->i_gid = attrs->ia_gid;
162 inode->i_atime = attrs->ia_atime;
163 inode->i_mtime = attrs->ia_mtime;
156}
157
158static inline void set_inode_attr(struct inode *inode,
159 struct kernfs_iattrs *attrs)
160{
161 inode->i_uid = attrs->ia_uid;
162 inode->i_gid = attrs->ia_gid;
163 inode->i_atime = attrs->ia_atime;
164 inode->i_mtime = attrs->ia_mtime;
164 inode_set_ctime_to_ts(inode, attrs->ia_ctime);
165 inode->i_ctime = attrs->ia_ctime;
165}
166
167static void kernfs_refresh_inode(struct kernfs_node *kn, struct inode *inode)
168{
169 struct kernfs_iattrs *attrs = kn->iattr;
170
171 inode->i_mode = kn->mode;
172 if (attrs)

--- 12 unchanged lines hidden (view full) ---

185 u32 request_mask, unsigned int query_flags)
186{
187 struct inode *inode = d_inode(path->dentry);
188 struct kernfs_node *kn = inode->i_private;
189 struct kernfs_root *root = kernfs_root(kn);
190
191 down_read(&root->kernfs_iattr_rwsem);
192 kernfs_refresh_inode(kn, inode);
166}
167
168static void kernfs_refresh_inode(struct kernfs_node *kn, struct inode *inode)
169{
170 struct kernfs_iattrs *attrs = kn->iattr;
171
172 inode->i_mode = kn->mode;
173 if (attrs)

--- 12 unchanged lines hidden (view full) ---

186 u32 request_mask, unsigned int query_flags)
187{
188 struct inode *inode = d_inode(path->dentry);
189 struct kernfs_node *kn = inode->i_private;
190 struct kernfs_root *root = kernfs_root(kn);
191
192 down_read(&root->kernfs_iattr_rwsem);
193 kernfs_refresh_inode(kn, inode);
193 generic_fillattr(&nop_mnt_idmap, request_mask, inode, stat);
194 generic_fillattr(&nop_mnt_idmap, inode, stat);
194 up_read(&root->kernfs_iattr_rwsem);
195
196 return 0;
197}
198
199static void kernfs_init_inode(struct kernfs_node *kn, struct inode *inode)
200{
201 kernfs_get(kn);

--- 98 unchanged lines hidden (view full) ---

300 return -ENODATA;
301
302 return simple_xattr_get(&attrs->xattrs, name, value, size);
303}
304
305int kernfs_xattr_set(struct kernfs_node *kn, const char *name,
306 const void *value, size_t size, int flags)
307{
195 up_read(&root->kernfs_iattr_rwsem);
196
197 return 0;
198}
199
200static void kernfs_init_inode(struct kernfs_node *kn, struct inode *inode)
201{
202 kernfs_get(kn);

--- 98 unchanged lines hidden (view full) ---

301 return -ENODATA;
302
303 return simple_xattr_get(&attrs->xattrs, name, value, size);
304}
305
306int kernfs_xattr_set(struct kernfs_node *kn, const char *name,
307 const void *value, size_t size, int flags)
308{
309 struct simple_xattr *old_xattr;
308 struct kernfs_iattrs *attrs = kernfs_iattrs(kn);
309 if (!attrs)
310 return -ENOMEM;
311
310 struct kernfs_iattrs *attrs = kernfs_iattrs(kn);
311 if (!attrs)
312 return -ENOMEM;
313
312 return simple_xattr_set(&attrs->xattrs, name, value, size, flags, NULL);
314 old_xattr = simple_xattr_set(&attrs->xattrs, name, value, size, flags);
315 if (IS_ERR(old_xattr))
316 return PTR_ERR(old_xattr);
317
318 simple_xattr_free(old_xattr);
319 return 0;
313}
314
315static int kernfs_vfs_xattr_get(const struct xattr_handler *handler,
316 struct dentry *unused, struct inode *inode,
317 const char *suffix, void *value, size_t size)
318{
319 const char *name = xattr_full_name(handler, suffix);
320 struct kernfs_node *kn = inode->i_private;

--- 15 unchanged lines hidden (view full) ---

336
337static int kernfs_vfs_user_xattr_add(struct kernfs_node *kn,
338 const char *full_name,
339 struct simple_xattrs *xattrs,
340 const void *value, size_t size, int flags)
341{
342 atomic_t *sz = &kn->iattr->user_xattr_size;
343 atomic_t *nr = &kn->iattr->nr_user_xattrs;
320}
321
322static int kernfs_vfs_xattr_get(const struct xattr_handler *handler,
323 struct dentry *unused, struct inode *inode,
324 const char *suffix, void *value, size_t size)
325{
326 const char *name = xattr_full_name(handler, suffix);
327 struct kernfs_node *kn = inode->i_private;

--- 15 unchanged lines hidden (view full) ---

343
344static int kernfs_vfs_user_xattr_add(struct kernfs_node *kn,
345 const char *full_name,
346 struct simple_xattrs *xattrs,
347 const void *value, size_t size, int flags)
348{
349 atomic_t *sz = &kn->iattr->user_xattr_size;
350 atomic_t *nr = &kn->iattr->nr_user_xattrs;
344 ssize_t removed_size;
351 struct simple_xattr *old_xattr;
345 int ret;
346
347 if (atomic_inc_return(nr) > KERNFS_MAX_USER_XATTRS) {
348 ret = -ENOSPC;
349 goto dec_count_out;
350 }
351
352 if (atomic_add_return(size, sz) > KERNFS_USER_XATTR_SIZE_LIMIT) {
353 ret = -ENOSPC;
354 goto dec_size_out;
355 }
356
352 int ret;
353
354 if (atomic_inc_return(nr) > KERNFS_MAX_USER_XATTRS) {
355 ret = -ENOSPC;
356 goto dec_count_out;
357 }
358
359 if (atomic_add_return(size, sz) > KERNFS_USER_XATTR_SIZE_LIMIT) {
360 ret = -ENOSPC;
361 goto dec_size_out;
362 }
363
357 ret = simple_xattr_set(xattrs, full_name, value, size, flags,
358 &removed_size);
359
360 if (!ret && removed_size >= 0)
361 size = removed_size;
362 else if (!ret)
364 old_xattr = simple_xattr_set(xattrs, full_name, value, size, flags);
365 if (!old_xattr)
363 return 0;
366 return 0;
367
368 if (IS_ERR(old_xattr)) {
369 ret = PTR_ERR(old_xattr);
370 goto dec_size_out;
371 }
372
373 ret = 0;
374 size = old_xattr->size;
375 simple_xattr_free(old_xattr);
364dec_size_out:
365 atomic_sub(size, sz);
366dec_count_out:
367 atomic_dec(nr);
368 return ret;
369}
370
371static int kernfs_vfs_user_xattr_rm(struct kernfs_node *kn,
372 const char *full_name,
373 struct simple_xattrs *xattrs,
374 const void *value, size_t size, int flags)
375{
376 atomic_t *sz = &kn->iattr->user_xattr_size;
377 atomic_t *nr = &kn->iattr->nr_user_xattrs;
376dec_size_out:
377 atomic_sub(size, sz);
378dec_count_out:
379 atomic_dec(nr);
380 return ret;
381}
382
383static int kernfs_vfs_user_xattr_rm(struct kernfs_node *kn,
384 const char *full_name,
385 struct simple_xattrs *xattrs,
386 const void *value, size_t size, int flags)
387{
388 atomic_t *sz = &kn->iattr->user_xattr_size;
389 atomic_t *nr = &kn->iattr->nr_user_xattrs;
378 ssize_t removed_size;
379 int ret;
390 struct simple_xattr *old_xattr;
380
391
381 ret = simple_xattr_set(xattrs, full_name, value, size, flags,
382 &removed_size);
392 old_xattr = simple_xattr_set(xattrs, full_name, value, size, flags);
393 if (!old_xattr)
394 return 0;
383
395
384 if (removed_size >= 0) {
385 atomic_sub(removed_size, sz);
386 atomic_dec(nr);
387 }
396 if (IS_ERR(old_xattr))
397 return PTR_ERR(old_xattr);
388
398
389 return ret;
399 atomic_sub(old_xattr->size, sz);
400 atomic_dec(nr);
401 simple_xattr_free(old_xattr);
402 return 0;
390}
391
392static int kernfs_vfs_user_xattr_set(const struct xattr_handler *handler,
393 struct mnt_idmap *idmap,
394 struct dentry *unused, struct inode *inode,
395 const char *suffix, const void *value,
396 size_t size, int flags)
397{

--- 44 unchanged lines hidden ---
403}
404
405static int kernfs_vfs_user_xattr_set(const struct xattr_handler *handler,
406 struct mnt_idmap *idmap,
407 struct dentry *unused, struct inode *inode,
408 const char *suffix, const void *value,
409 size_t size, int flags)
410{

--- 44 unchanged lines hidden ---