1b8441ed2STejun Heo /* 2b8441ed2STejun Heo * fs/kernfs/inode.c - kernfs inode implementation 3b8441ed2STejun Heo * 4b8441ed2STejun Heo * Copyright (c) 2001-3 Patrick Mochel 5b8441ed2STejun Heo * Copyright (c) 2007 SUSE Linux Products GmbH 6b8441ed2STejun Heo * Copyright (c) 2007, 2013 Tejun Heo <tj@kernel.org> 7b8441ed2STejun Heo * 8b8441ed2STejun Heo * This file is released under the GPLv2. 9b8441ed2STejun Heo */ 10ffed24e2STejun Heo 11ffed24e2STejun Heo #include <linux/pagemap.h> 12ffed24e2STejun Heo #include <linux/backing-dev.h> 13ffed24e2STejun Heo #include <linux/capability.h> 14ffed24e2STejun Heo #include <linux/errno.h> 15ffed24e2STejun Heo #include <linux/slab.h> 16ffed24e2STejun Heo #include <linux/xattr.h> 17ffed24e2STejun Heo #include <linux/security.h> 18ffed24e2STejun Heo 19ffed24e2STejun Heo #include "kernfs-internal.h" 20ffed24e2STejun Heo 21a797bfc3STejun Heo static const struct address_space_operations kernfs_aops = { 22ffed24e2STejun Heo .readpage = simple_readpage, 23ffed24e2STejun Heo .write_begin = simple_write_begin, 24ffed24e2STejun Heo .write_end = simple_write_end, 25ffed24e2STejun Heo }; 26ffed24e2STejun Heo 27a797bfc3STejun Heo static const struct inode_operations kernfs_iops = { 28c637b8acSTejun Heo .permission = kernfs_iop_permission, 29c637b8acSTejun Heo .setattr = kernfs_iop_setattr, 30c637b8acSTejun Heo .getattr = kernfs_iop_getattr, 31c637b8acSTejun Heo .setxattr = kernfs_iop_setxattr, 32c637b8acSTejun Heo .removexattr = kernfs_iop_removexattr, 33c637b8acSTejun Heo .getxattr = kernfs_iop_getxattr, 34c637b8acSTejun Heo .listxattr = kernfs_iop_listxattr, 35ffed24e2STejun Heo }; 36ffed24e2STejun Heo 37c525aaddSTejun Heo static struct kernfs_iattrs *kernfs_iattrs(struct kernfs_node *kn) 38ffed24e2STejun Heo { 394afddd60STejun Heo static DEFINE_MUTEX(iattr_mutex); 404afddd60STejun Heo struct kernfs_iattrs *ret; 41ffed24e2STejun Heo struct iattr *iattrs; 42ffed24e2STejun Heo 434afddd60STejun Heo mutex_lock(&iattr_mutex); 444afddd60STejun Heo 45adc5e8b5STejun Heo if (kn->iattr) 464afddd60STejun Heo goto out_unlock; 479a8049afSTejun Heo 48c525aaddSTejun Heo kn->iattr = kzalloc(sizeof(struct kernfs_iattrs), GFP_KERNEL); 49adc5e8b5STejun Heo if (!kn->iattr) 504afddd60STejun Heo goto out_unlock; 51adc5e8b5STejun Heo iattrs = &kn->iattr->ia_iattr; 52ffed24e2STejun Heo 53ffed24e2STejun Heo /* assign default attributes */ 54adc5e8b5STejun Heo iattrs->ia_mode = kn->mode; 55ffed24e2STejun Heo iattrs->ia_uid = GLOBAL_ROOT_UID; 56ffed24e2STejun Heo iattrs->ia_gid = GLOBAL_ROOT_GID; 57ffed24e2STejun Heo iattrs->ia_atime = iattrs->ia_mtime = iattrs->ia_ctime = CURRENT_TIME; 58ffed24e2STejun Heo 59adc5e8b5STejun Heo simple_xattrs_init(&kn->iattr->xattrs); 604afddd60STejun Heo out_unlock: 614afddd60STejun Heo ret = kn->iattr; 624afddd60STejun Heo mutex_unlock(&iattr_mutex); 634afddd60STejun Heo return ret; 64ffed24e2STejun Heo } 65ffed24e2STejun Heo 66324a56e1STejun Heo static int __kernfs_setattr(struct kernfs_node *kn, const struct iattr *iattr) 67ffed24e2STejun Heo { 68c525aaddSTejun Heo struct kernfs_iattrs *attrs; 69ffed24e2STejun Heo struct iattr *iattrs; 70ffed24e2STejun Heo unsigned int ia_valid = iattr->ia_valid; 71ffed24e2STejun Heo 72c525aaddSTejun Heo attrs = kernfs_iattrs(kn); 739a8049afSTejun Heo if (!attrs) 74ffed24e2STejun Heo return -ENOMEM; 759a8049afSTejun Heo 769a8049afSTejun Heo iattrs = &attrs->ia_iattr; 77ffed24e2STejun Heo 78ffed24e2STejun Heo if (ia_valid & ATTR_UID) 79ffed24e2STejun Heo iattrs->ia_uid = iattr->ia_uid; 80ffed24e2STejun Heo if (ia_valid & ATTR_GID) 81ffed24e2STejun Heo iattrs->ia_gid = iattr->ia_gid; 82ffed24e2STejun Heo if (ia_valid & ATTR_ATIME) 83ffed24e2STejun Heo iattrs->ia_atime = iattr->ia_atime; 84ffed24e2STejun Heo if (ia_valid & ATTR_MTIME) 85ffed24e2STejun Heo iattrs->ia_mtime = iattr->ia_mtime; 86ffed24e2STejun Heo if (ia_valid & ATTR_CTIME) 87ffed24e2STejun Heo iattrs->ia_ctime = iattr->ia_ctime; 88ffed24e2STejun Heo if (ia_valid & ATTR_MODE) { 89ffed24e2STejun Heo umode_t mode = iattr->ia_mode; 90adc5e8b5STejun Heo iattrs->ia_mode = kn->mode = mode; 91ffed24e2STejun Heo } 92ffed24e2STejun Heo return 0; 93ffed24e2STejun Heo } 94ffed24e2STejun Heo 95ffed24e2STejun Heo /** 96ffed24e2STejun Heo * kernfs_setattr - set iattr on a node 97324a56e1STejun Heo * @kn: target node 98ffed24e2STejun Heo * @iattr: iattr to set 99ffed24e2STejun Heo * 100ffed24e2STejun Heo * Returns 0 on success, -errno on failure. 101ffed24e2STejun Heo */ 102324a56e1STejun Heo int kernfs_setattr(struct kernfs_node *kn, const struct iattr *iattr) 103ffed24e2STejun Heo { 104ffed24e2STejun Heo int ret; 105ffed24e2STejun Heo 106a797bfc3STejun Heo mutex_lock(&kernfs_mutex); 107324a56e1STejun Heo ret = __kernfs_setattr(kn, iattr); 108a797bfc3STejun Heo mutex_unlock(&kernfs_mutex); 109ffed24e2STejun Heo return ret; 110ffed24e2STejun Heo } 111ffed24e2STejun Heo 112c637b8acSTejun Heo int kernfs_iop_setattr(struct dentry *dentry, struct iattr *iattr) 113ffed24e2STejun Heo { 1142b0143b5SDavid Howells struct inode *inode = d_inode(dentry); 115324a56e1STejun Heo struct kernfs_node *kn = dentry->d_fsdata; 116ffed24e2STejun Heo int error; 117ffed24e2STejun Heo 118324a56e1STejun Heo if (!kn) 119ffed24e2STejun Heo return -EINVAL; 120ffed24e2STejun Heo 121a797bfc3STejun Heo mutex_lock(&kernfs_mutex); 122ffed24e2STejun Heo error = inode_change_ok(inode, iattr); 123ffed24e2STejun Heo if (error) 124ffed24e2STejun Heo goto out; 125ffed24e2STejun Heo 126324a56e1STejun Heo error = __kernfs_setattr(kn, iattr); 127ffed24e2STejun Heo if (error) 128ffed24e2STejun Heo goto out; 129ffed24e2STejun Heo 130ffed24e2STejun Heo /* this ignores size changes */ 131ffed24e2STejun Heo setattr_copy(inode, iattr); 132ffed24e2STejun Heo 133ffed24e2STejun Heo out: 134a797bfc3STejun Heo mutex_unlock(&kernfs_mutex); 135ffed24e2STejun Heo return error; 136ffed24e2STejun Heo } 137ffed24e2STejun Heo 138c637b8acSTejun Heo static int kernfs_node_setsecdata(struct kernfs_node *kn, void **secdata, 139ffed24e2STejun Heo u32 *secdata_len) 140ffed24e2STejun Heo { 141c525aaddSTejun Heo struct kernfs_iattrs *attrs; 142ffed24e2STejun Heo void *old_secdata; 143ffed24e2STejun Heo size_t old_secdata_len; 144ffed24e2STejun Heo 145c525aaddSTejun Heo attrs = kernfs_iattrs(kn); 1469a8049afSTejun Heo if (!attrs) 147ffed24e2STejun Heo return -ENOMEM; 148ffed24e2STejun Heo 1499a8049afSTejun Heo old_secdata = attrs->ia_secdata; 1509a8049afSTejun Heo old_secdata_len = attrs->ia_secdata_len; 151ffed24e2STejun Heo 1529a8049afSTejun Heo attrs->ia_secdata = *secdata; 1539a8049afSTejun Heo attrs->ia_secdata_len = *secdata_len; 154ffed24e2STejun Heo 155ffed24e2STejun Heo *secdata = old_secdata; 156ffed24e2STejun Heo *secdata_len = old_secdata_len; 157ffed24e2STejun Heo return 0; 158ffed24e2STejun Heo } 159ffed24e2STejun Heo 160c637b8acSTejun Heo int kernfs_iop_setxattr(struct dentry *dentry, const char *name, 161c637b8acSTejun Heo const void *value, size_t size, int flags) 162ffed24e2STejun Heo { 163324a56e1STejun Heo struct kernfs_node *kn = dentry->d_fsdata; 164c525aaddSTejun Heo struct kernfs_iattrs *attrs; 165ffed24e2STejun Heo void *secdata; 166ffed24e2STejun Heo int error; 167ffed24e2STejun Heo u32 secdata_len = 0; 168ffed24e2STejun Heo 169c525aaddSTejun Heo attrs = kernfs_iattrs(kn); 1702322392bSTejun Heo if (!attrs) 1712322392bSTejun Heo return -ENOMEM; 172ffed24e2STejun Heo 173ffed24e2STejun Heo if (!strncmp(name, XATTR_SECURITY_PREFIX, XATTR_SECURITY_PREFIX_LEN)) { 174ffed24e2STejun Heo const char *suffix = name + XATTR_SECURITY_PREFIX_LEN; 1752b0143b5SDavid Howells error = security_inode_setsecurity(d_inode(dentry), suffix, 176ffed24e2STejun Heo value, size, flags); 177ffed24e2STejun Heo if (error) 1782322392bSTejun Heo return error; 1792b0143b5SDavid Howells error = security_inode_getsecctx(d_inode(dentry), 180ffed24e2STejun Heo &secdata, &secdata_len); 181ffed24e2STejun Heo if (error) 1822322392bSTejun Heo return error; 183ffed24e2STejun Heo 184a797bfc3STejun Heo mutex_lock(&kernfs_mutex); 185c637b8acSTejun Heo error = kernfs_node_setsecdata(kn, &secdata, &secdata_len); 186a797bfc3STejun Heo mutex_unlock(&kernfs_mutex); 187ffed24e2STejun Heo 188ffed24e2STejun Heo if (secdata) 189ffed24e2STejun Heo security_release_secctx(secdata, secdata_len); 190ffed24e2STejun Heo return error; 1912322392bSTejun Heo } else if (!strncmp(name, XATTR_TRUSTED_PREFIX, XATTR_TRUSTED_PREFIX_LEN)) { 1922322392bSTejun Heo return simple_xattr_set(&attrs->xattrs, name, value, size, 1932322392bSTejun Heo flags); 1942322392bSTejun Heo } 1952322392bSTejun Heo 1962322392bSTejun Heo return -EINVAL; 1972322392bSTejun Heo } 1982322392bSTejun Heo 199c637b8acSTejun Heo int kernfs_iop_removexattr(struct dentry *dentry, const char *name) 2002322392bSTejun Heo { 201324a56e1STejun Heo struct kernfs_node *kn = dentry->d_fsdata; 202c525aaddSTejun Heo struct kernfs_iattrs *attrs; 2032322392bSTejun Heo 204c525aaddSTejun Heo attrs = kernfs_iattrs(kn); 2052322392bSTejun Heo if (!attrs) 2062322392bSTejun Heo return -ENOMEM; 2072322392bSTejun Heo 2082322392bSTejun Heo return simple_xattr_remove(&attrs->xattrs, name); 2092322392bSTejun Heo } 2102322392bSTejun Heo 211c637b8acSTejun Heo ssize_t kernfs_iop_getxattr(struct dentry *dentry, const char *name, void *buf, 2122322392bSTejun Heo size_t size) 2132322392bSTejun Heo { 214324a56e1STejun Heo struct kernfs_node *kn = dentry->d_fsdata; 215c525aaddSTejun Heo struct kernfs_iattrs *attrs; 2162322392bSTejun Heo 217c525aaddSTejun Heo attrs = kernfs_iattrs(kn); 2182322392bSTejun Heo if (!attrs) 2192322392bSTejun Heo return -ENOMEM; 2202322392bSTejun Heo 2212322392bSTejun Heo return simple_xattr_get(&attrs->xattrs, name, buf, size); 2222322392bSTejun Heo } 2232322392bSTejun Heo 224c637b8acSTejun Heo ssize_t kernfs_iop_listxattr(struct dentry *dentry, char *buf, size_t size) 2252322392bSTejun Heo { 226324a56e1STejun Heo struct kernfs_node *kn = dentry->d_fsdata; 227c525aaddSTejun Heo struct kernfs_iattrs *attrs; 2282322392bSTejun Heo 229c525aaddSTejun Heo attrs = kernfs_iattrs(kn); 2302322392bSTejun Heo if (!attrs) 2312322392bSTejun Heo return -ENOMEM; 2322322392bSTejun Heo 2332322392bSTejun Heo return simple_xattr_list(&attrs->xattrs, buf, size); 234ffed24e2STejun Heo } 235ffed24e2STejun Heo 236ffed24e2STejun Heo static inline void set_default_inode_attr(struct inode *inode, umode_t mode) 237ffed24e2STejun Heo { 238ffed24e2STejun Heo inode->i_mode = mode; 239ffed24e2STejun Heo inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME; 240ffed24e2STejun Heo } 241ffed24e2STejun Heo 242ffed24e2STejun Heo static inline void set_inode_attr(struct inode *inode, struct iattr *iattr) 243ffed24e2STejun Heo { 244ffed24e2STejun Heo inode->i_uid = iattr->ia_uid; 245ffed24e2STejun Heo inode->i_gid = iattr->ia_gid; 246ffed24e2STejun Heo inode->i_atime = iattr->ia_atime; 247ffed24e2STejun Heo inode->i_mtime = iattr->ia_mtime; 248ffed24e2STejun Heo inode->i_ctime = iattr->ia_ctime; 249ffed24e2STejun Heo } 250ffed24e2STejun Heo 251c637b8acSTejun Heo static void kernfs_refresh_inode(struct kernfs_node *kn, struct inode *inode) 252ffed24e2STejun Heo { 253c525aaddSTejun Heo struct kernfs_iattrs *attrs = kn->iattr; 254ffed24e2STejun Heo 255adc5e8b5STejun Heo inode->i_mode = kn->mode; 2569a8049afSTejun Heo if (attrs) { 257324a56e1STejun Heo /* 258324a56e1STejun Heo * kernfs_node has non-default attributes get them from 259324a56e1STejun Heo * persistent copy in kernfs_node. 260ffed24e2STejun Heo */ 2619a8049afSTejun Heo set_inode_attr(inode, &attrs->ia_iattr); 2629a8049afSTejun Heo security_inode_notifysecctx(inode, attrs->ia_secdata, 2639a8049afSTejun Heo attrs->ia_secdata_len); 264ffed24e2STejun Heo } 265ffed24e2STejun Heo 266df23fc39STejun Heo if (kernfs_type(kn) == KERNFS_DIR) 267adc5e8b5STejun Heo set_nlink(inode, kn->dir.subdirs + 2); 268ffed24e2STejun Heo } 269ffed24e2STejun Heo 270c637b8acSTejun Heo int kernfs_iop_getattr(struct vfsmount *mnt, struct dentry *dentry, 271ffed24e2STejun Heo struct kstat *stat) 272ffed24e2STejun Heo { 273324a56e1STejun Heo struct kernfs_node *kn = dentry->d_fsdata; 2742b0143b5SDavid Howells struct inode *inode = d_inode(dentry); 275ffed24e2STejun Heo 276a797bfc3STejun Heo mutex_lock(&kernfs_mutex); 277c637b8acSTejun Heo kernfs_refresh_inode(kn, inode); 278a797bfc3STejun Heo mutex_unlock(&kernfs_mutex); 279ffed24e2STejun Heo 280ffed24e2STejun Heo generic_fillattr(inode, stat); 281ffed24e2STejun Heo return 0; 282ffed24e2STejun Heo } 283ffed24e2STejun Heo 284c637b8acSTejun Heo static void kernfs_init_inode(struct kernfs_node *kn, struct inode *inode) 285ffed24e2STejun Heo { 286324a56e1STejun Heo kernfs_get(kn); 287324a56e1STejun Heo inode->i_private = kn; 288a797bfc3STejun Heo inode->i_mapping->a_ops = &kernfs_aops; 289a797bfc3STejun Heo inode->i_op = &kernfs_iops; 290ffed24e2STejun Heo 291adc5e8b5STejun Heo set_default_inode_attr(inode, kn->mode); 292c637b8acSTejun Heo kernfs_refresh_inode(kn, inode); 293ffed24e2STejun Heo 294ffed24e2STejun Heo /* initialize inode according to type */ 295df23fc39STejun Heo switch (kernfs_type(kn)) { 296df23fc39STejun Heo case KERNFS_DIR: 297a797bfc3STejun Heo inode->i_op = &kernfs_dir_iops; 298a797bfc3STejun Heo inode->i_fop = &kernfs_dir_fops; 299ea015218SEric W. Biederman if (kn->flags & KERNFS_EMPTY_DIR) 300ea015218SEric W. Biederman make_empty_dir_inode(inode); 301ffed24e2STejun Heo break; 302df23fc39STejun Heo case KERNFS_FILE: 303adc5e8b5STejun Heo inode->i_size = kn->attr.size; 304a797bfc3STejun Heo inode->i_fop = &kernfs_file_fops; 305ffed24e2STejun Heo break; 306df23fc39STejun Heo case KERNFS_LINK: 307a797bfc3STejun Heo inode->i_op = &kernfs_symlink_iops; 308ffed24e2STejun Heo break; 309ffed24e2STejun Heo default: 310ffed24e2STejun Heo BUG(); 311ffed24e2STejun Heo } 312ffed24e2STejun Heo 313ffed24e2STejun Heo unlock_new_inode(inode); 314ffed24e2STejun Heo } 315ffed24e2STejun Heo 316ffed24e2STejun Heo /** 317c637b8acSTejun Heo * kernfs_get_inode - get inode for kernfs_node 318ffed24e2STejun Heo * @sb: super block 319324a56e1STejun Heo * @kn: kernfs_node to allocate inode for 320ffed24e2STejun Heo * 321324a56e1STejun Heo * Get inode for @kn. If such inode doesn't exist, a new inode is 322324a56e1STejun Heo * allocated and basics are initialized. New inode is returned 323324a56e1STejun Heo * locked. 324ffed24e2STejun Heo * 325ffed24e2STejun Heo * LOCKING: 326ffed24e2STejun Heo * Kernel thread context (may sleep). 327ffed24e2STejun Heo * 328ffed24e2STejun Heo * RETURNS: 329ffed24e2STejun Heo * Pointer to allocated inode on success, NULL on failure. 330ffed24e2STejun Heo */ 331c637b8acSTejun Heo struct inode *kernfs_get_inode(struct super_block *sb, struct kernfs_node *kn) 332ffed24e2STejun Heo { 333ffed24e2STejun Heo struct inode *inode; 334ffed24e2STejun Heo 335adc5e8b5STejun Heo inode = iget_locked(sb, kn->ino); 336ffed24e2STejun Heo if (inode && (inode->i_state & I_NEW)) 337c637b8acSTejun Heo kernfs_init_inode(kn, inode); 338ffed24e2STejun Heo 339ffed24e2STejun Heo return inode; 340ffed24e2STejun Heo } 341ffed24e2STejun Heo 342ffed24e2STejun Heo /* 343c637b8acSTejun Heo * The kernfs_node serves as both an inode and a directory entry for 344c637b8acSTejun Heo * kernfs. To prevent the kernfs inode numbers from being freed 345c637b8acSTejun Heo * prematurely we take a reference to kernfs_node from the kernfs inode. A 346ffed24e2STejun Heo * super_operations.evict_inode() implementation is needed to drop that 347ffed24e2STejun Heo * reference upon inode destruction. 348ffed24e2STejun Heo */ 349c637b8acSTejun Heo void kernfs_evict_inode(struct inode *inode) 350ffed24e2STejun Heo { 351324a56e1STejun Heo struct kernfs_node *kn = inode->i_private; 352ffed24e2STejun Heo 35391b0abe3SJohannes Weiner truncate_inode_pages_final(&inode->i_data); 354ffed24e2STejun Heo clear_inode(inode); 355324a56e1STejun Heo kernfs_put(kn); 356ffed24e2STejun Heo } 357ffed24e2STejun Heo 358c637b8acSTejun Heo int kernfs_iop_permission(struct inode *inode, int mask) 359ffed24e2STejun Heo { 360324a56e1STejun Heo struct kernfs_node *kn; 361ffed24e2STejun Heo 362ffed24e2STejun Heo if (mask & MAY_NOT_BLOCK) 363ffed24e2STejun Heo return -ECHILD; 364ffed24e2STejun Heo 365324a56e1STejun Heo kn = inode->i_private; 366ffed24e2STejun Heo 367a797bfc3STejun Heo mutex_lock(&kernfs_mutex); 368c637b8acSTejun Heo kernfs_refresh_inode(kn, inode); 369a797bfc3STejun Heo mutex_unlock(&kernfs_mutex); 370ffed24e2STejun Heo 371ffed24e2STejun Heo return generic_permission(inode, mask); 372ffed24e2STejun Heo } 373