root/fs/kernfs/inode.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. __kernfs_iattrs
  2. kernfs_iattrs_noalloc
  3. __kernfs_setattr
  4. kernfs_setattr
  5. kernfs_iop_setattr
  6. kernfs_iop_listxattr
  7. set_default_inode_attr
  8. set_inode_attr
  9. kernfs_refresh_inode
  10. kernfs_iop_getattr
  11. kernfs_init_inode
  12. kernfs_get_inode
  13. kernfs_evict_inode
  14. kernfs_iop_permission
  15. kernfs_xattr_get
  16. kernfs_xattr_set
  17. kernfs_vfs_xattr_get
  18. kernfs_vfs_xattr_set

   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  */
   9 
  10 #include <linux/pagemap.h>
  11 #include <linux/backing-dev.h>
  12 #include <linux/capability.h>
  13 #include <linux/errno.h>
  14 #include <linux/slab.h>
  15 #include <linux/xattr.h>
  16 #include <linux/security.h>
  17 
  18 #include "kernfs-internal.h"
  19 
  20 static const struct address_space_operations kernfs_aops = {
  21         .readpage       = simple_readpage,
  22         .write_begin    = simple_write_begin,
  23         .write_end      = simple_write_end,
  24 };
  25 
  26 static const struct inode_operations kernfs_iops = {
  27         .permission     = kernfs_iop_permission,
  28         .setattr        = kernfs_iop_setattr,
  29         .getattr        = kernfs_iop_getattr,
  30         .listxattr      = kernfs_iop_listxattr,
  31 };
  32 
  33 static struct kernfs_iattrs *__kernfs_iattrs(struct kernfs_node *kn, int alloc)
  34 {
  35         static DEFINE_MUTEX(iattr_mutex);
  36         struct kernfs_iattrs *ret;
  37 
  38         mutex_lock(&iattr_mutex);
  39 
  40         if (kn->iattr || !alloc)
  41                 goto out_unlock;
  42 
  43         kn->iattr = kmem_cache_zalloc(kernfs_iattrs_cache, GFP_KERNEL);
  44         if (!kn->iattr)
  45                 goto out_unlock;
  46 
  47         /* assign default attributes */
  48         kn->iattr->ia_uid = GLOBAL_ROOT_UID;
  49         kn->iattr->ia_gid = GLOBAL_ROOT_GID;
  50 
  51         ktime_get_real_ts64(&kn->iattr->ia_atime);
  52         kn->iattr->ia_mtime = kn->iattr->ia_atime;
  53         kn->iattr->ia_ctime = kn->iattr->ia_atime;
  54 
  55         simple_xattrs_init(&kn->iattr->xattrs);
  56 out_unlock:
  57         ret = kn->iattr;
  58         mutex_unlock(&iattr_mutex);
  59         return ret;
  60 }
  61 
  62 static struct kernfs_iattrs *kernfs_iattrs(struct kernfs_node *kn)
  63 {
  64         return __kernfs_iattrs(kn, 1);
  65 }
  66 
  67 static struct kernfs_iattrs *kernfs_iattrs_noalloc(struct kernfs_node *kn)
  68 {
  69         return __kernfs_iattrs(kn, 0);
  70 }
  71 
  72 int __kernfs_setattr(struct kernfs_node *kn, const struct iattr *iattr)
  73 {
  74         struct kernfs_iattrs *attrs;
  75         unsigned int ia_valid = iattr->ia_valid;
  76 
  77         attrs = kernfs_iattrs(kn);
  78         if (!attrs)
  79                 return -ENOMEM;
  80 
  81         if (ia_valid & ATTR_UID)
  82                 attrs->ia_uid = iattr->ia_uid;
  83         if (ia_valid & ATTR_GID)
  84                 attrs->ia_gid = iattr->ia_gid;
  85         if (ia_valid & ATTR_ATIME)
  86                 attrs->ia_atime = iattr->ia_atime;
  87         if (ia_valid & ATTR_MTIME)
  88                 attrs->ia_mtime = iattr->ia_mtime;
  89         if (ia_valid & ATTR_CTIME)
  90                 attrs->ia_ctime = iattr->ia_ctime;
  91         if (ia_valid & ATTR_MODE)
  92                 kn->mode = iattr->ia_mode;
  93         return 0;
  94 }
  95 
  96 /**
  97  * kernfs_setattr - set iattr on a node
  98  * @kn: target node
  99  * @iattr: iattr to set
 100  *
 101  * Returns 0 on success, -errno on failure.
 102  */
 103 int kernfs_setattr(struct kernfs_node *kn, const struct iattr *iattr)
 104 {
 105         int ret;
 106 
 107         mutex_lock(&kernfs_mutex);
 108         ret = __kernfs_setattr(kn, iattr);
 109         mutex_unlock(&kernfs_mutex);
 110         return ret;
 111 }
 112 
 113 int kernfs_iop_setattr(struct dentry *dentry, struct iattr *iattr)
 114 {
 115         struct inode *inode = d_inode(dentry);
 116         struct kernfs_node *kn = inode->i_private;
 117         int error;
 118 
 119         if (!kn)
 120                 return -EINVAL;
 121 
 122         mutex_lock(&kernfs_mutex);
 123         error = setattr_prepare(dentry, iattr);
 124         if (error)
 125                 goto out;
 126 
 127         error = __kernfs_setattr(kn, iattr);
 128         if (error)
 129                 goto out;
 130 
 131         /* this ignores size changes */
 132         setattr_copy(inode, iattr);
 133 
 134 out:
 135         mutex_unlock(&kernfs_mutex);
 136         return error;
 137 }
 138 
 139 ssize_t kernfs_iop_listxattr(struct dentry *dentry, char *buf, size_t size)
 140 {
 141         struct kernfs_node *kn = kernfs_dentry_node(dentry);
 142         struct kernfs_iattrs *attrs;
 143 
 144         attrs = kernfs_iattrs(kn);
 145         if (!attrs)
 146                 return -ENOMEM;
 147 
 148         return simple_xattr_list(d_inode(dentry), &attrs->xattrs, buf, size);
 149 }
 150 
 151 static 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 =
 155                 inode->i_ctime = current_time(inode);
 156 }
 157 
 158 static 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 = timestamp_truncate(attrs->ia_atime, inode);
 164         inode->i_mtime = timestamp_truncate(attrs->ia_mtime, inode);
 165         inode->i_ctime = timestamp_truncate(attrs->ia_ctime, inode);
 166 }
 167 
 168 static 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)
 174                 /*
 175                  * kernfs_node has non-default attributes get them from
 176                  * persistent copy in kernfs_node.
 177                  */
 178                 set_inode_attr(inode, attrs);
 179 
 180         if (kernfs_type(kn) == KERNFS_DIR)
 181                 set_nlink(inode, kn->dir.subdirs + 2);
 182 }
 183 
 184 int kernfs_iop_getattr(const struct path *path, struct kstat *stat,
 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 
 190         mutex_lock(&kernfs_mutex);
 191         kernfs_refresh_inode(kn, inode);
 192         mutex_unlock(&kernfs_mutex);
 193 
 194         generic_fillattr(inode, stat);
 195         return 0;
 196 }
 197 
 198 static void kernfs_init_inode(struct kernfs_node *kn, struct inode *inode)
 199 {
 200         kernfs_get(kn);
 201         inode->i_private = kn;
 202         inode->i_mapping->a_ops = &kernfs_aops;
 203         inode->i_op = &kernfs_iops;
 204         inode->i_generation = kn->id.generation;
 205 
 206         set_default_inode_attr(inode, kn->mode);
 207         kernfs_refresh_inode(kn, inode);
 208 
 209         /* initialize inode according to type */
 210         switch (kernfs_type(kn)) {
 211         case KERNFS_DIR:
 212                 inode->i_op = &kernfs_dir_iops;
 213                 inode->i_fop = &kernfs_dir_fops;
 214                 if (kn->flags & KERNFS_EMPTY_DIR)
 215                         make_empty_dir_inode(inode);
 216                 break;
 217         case KERNFS_FILE:
 218                 inode->i_size = kn->attr.size;
 219                 inode->i_fop = &kernfs_file_fops;
 220                 break;
 221         case KERNFS_LINK:
 222                 inode->i_op = &kernfs_symlink_iops;
 223                 break;
 224         default:
 225                 BUG();
 226         }
 227 
 228         unlock_new_inode(inode);
 229 }
 230 
 231 /**
 232  *      kernfs_get_inode - get inode for kernfs_node
 233  *      @sb: super block
 234  *      @kn: kernfs_node to allocate inode for
 235  *
 236  *      Get inode for @kn.  If such inode doesn't exist, a new inode is
 237  *      allocated and basics are initialized.  New inode is returned
 238  *      locked.
 239  *
 240  *      LOCKING:
 241  *      Kernel thread context (may sleep).
 242  *
 243  *      RETURNS:
 244  *      Pointer to allocated inode on success, NULL on failure.
 245  */
 246 struct inode *kernfs_get_inode(struct super_block *sb, struct kernfs_node *kn)
 247 {
 248         struct inode *inode;
 249 
 250         inode = iget_locked(sb, kn->id.ino);
 251         if (inode && (inode->i_state & I_NEW))
 252                 kernfs_init_inode(kn, inode);
 253 
 254         return inode;
 255 }
 256 
 257 /*
 258  * The kernfs_node serves as both an inode and a directory entry for
 259  * kernfs.  To prevent the kernfs inode numbers from being freed
 260  * prematurely we take a reference to kernfs_node from the kernfs inode.  A
 261  * super_operations.evict_inode() implementation is needed to drop that
 262  * reference upon inode destruction.
 263  */
 264 void kernfs_evict_inode(struct inode *inode)
 265 {
 266         struct kernfs_node *kn = inode->i_private;
 267 
 268         truncate_inode_pages_final(&inode->i_data);
 269         clear_inode(inode);
 270         kernfs_put(kn);
 271 }
 272 
 273 int kernfs_iop_permission(struct inode *inode, int mask)
 274 {
 275         struct kernfs_node *kn;
 276 
 277         if (mask & MAY_NOT_BLOCK)
 278                 return -ECHILD;
 279 
 280         kn = inode->i_private;
 281 
 282         mutex_lock(&kernfs_mutex);
 283         kernfs_refresh_inode(kn, inode);
 284         mutex_unlock(&kernfs_mutex);
 285 
 286         return generic_permission(inode, mask);
 287 }
 288 
 289 int kernfs_xattr_get(struct kernfs_node *kn, const char *name,
 290                      void *value, size_t size)
 291 {
 292         struct kernfs_iattrs *attrs = kernfs_iattrs_noalloc(kn);
 293         if (!attrs)
 294                 return -ENODATA;
 295 
 296         return simple_xattr_get(&attrs->xattrs, name, value, size);
 297 }
 298 
 299 int kernfs_xattr_set(struct kernfs_node *kn, const char *name,
 300                      const void *value, size_t size, int flags)
 301 {
 302         struct kernfs_iattrs *attrs = kernfs_iattrs(kn);
 303         if (!attrs)
 304                 return -ENOMEM;
 305 
 306         return simple_xattr_set(&attrs->xattrs, name, value, size, flags);
 307 }
 308 
 309 static int kernfs_vfs_xattr_get(const struct xattr_handler *handler,
 310                                 struct dentry *unused, struct inode *inode,
 311                                 const char *suffix, void *value, size_t size)
 312 {
 313         const char *name = xattr_full_name(handler, suffix);
 314         struct kernfs_node *kn = inode->i_private;
 315 
 316         return kernfs_xattr_get(kn, name, value, size);
 317 }
 318 
 319 static int kernfs_vfs_xattr_set(const struct xattr_handler *handler,
 320                                 struct dentry *unused, struct inode *inode,
 321                                 const char *suffix, const void *value,
 322                                 size_t size, int flags)
 323 {
 324         const char *name = xattr_full_name(handler, suffix);
 325         struct kernfs_node *kn = inode->i_private;
 326 
 327         return kernfs_xattr_set(kn, name, value, size, flags);
 328 }
 329 
 330 static const struct xattr_handler kernfs_trusted_xattr_handler = {
 331         .prefix = XATTR_TRUSTED_PREFIX,
 332         .get = kernfs_vfs_xattr_get,
 333         .set = kernfs_vfs_xattr_set,
 334 };
 335 
 336 static const struct xattr_handler kernfs_security_xattr_handler = {
 337         .prefix = XATTR_SECURITY_PREFIX,
 338         .get = kernfs_vfs_xattr_get,
 339         .set = kernfs_vfs_xattr_set,
 340 };
 341 
 342 const struct xattr_handler *kernfs_xattr_handlers[] = {
 343         &kernfs_trusted_xattr_handler,
 344         &kernfs_security_xattr_handler,
 345         NULL
 346 };

/* [<][>][^][v][top][bottom][index][help] */