Branch data Line data Source code
1 : : // SPDX-License-Identifier: GPL-2.0-only 2 : : /* 3 : : * fs/kernfs/mount.c - kernfs mount 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/fs.h> 11 : : #include <linux/mount.h> 12 : : #include <linux/init.h> 13 : : #include <linux/magic.h> 14 : : #include <linux/slab.h> 15 : : #include <linux/pagemap.h> 16 : : #include <linux/namei.h> 17 : : #include <linux/seq_file.h> 18 : : #include <linux/exportfs.h> 19 : : 20 : : #include "kernfs-internal.h" 21 : : 22 : : struct kmem_cache *kernfs_node_cache, *kernfs_iattrs_cache; 23 : : 24 : 3 : static int kernfs_sop_show_options(struct seq_file *sf, struct dentry *dentry) 25 : : { 26 : : struct kernfs_root *root = kernfs_root(kernfs_dentry_node(dentry)); 27 : 3 : struct kernfs_syscall_ops *scops = root->syscall_ops; 28 : : 29 : 3 : if (scops && scops->show_options) 30 : 3 : return scops->show_options(sf, root); 31 : : return 0; 32 : : } 33 : : 34 : 3 : static int kernfs_sop_show_path(struct seq_file *sf, struct dentry *dentry) 35 : : { 36 : : struct kernfs_node *node = kernfs_dentry_node(dentry); 37 : : struct kernfs_root *root = kernfs_root(node); 38 : 3 : struct kernfs_syscall_ops *scops = root->syscall_ops; 39 : : 40 : 3 : if (scops && scops->show_path) 41 : 3 : return scops->show_path(sf, node, root); 42 : : 43 : 3 : seq_dentry(sf, dentry, " \t\n\\"); 44 : 3 : return 0; 45 : : } 46 : : 47 : : const struct super_operations kernfs_sops = { 48 : : .statfs = simple_statfs, 49 : : .drop_inode = generic_delete_inode, 50 : : .evict_inode = kernfs_evict_inode, 51 : : 52 : : .show_options = kernfs_sop_show_options, 53 : : .show_path = kernfs_sop_show_path, 54 : : }; 55 : : 56 : : /* 57 : : * Similar to kernfs_fh_get_inode, this one gets kernfs node from inode 58 : : * number and generation 59 : : */ 60 : 0 : struct kernfs_node *kernfs_get_node_by_id(struct kernfs_root *root, 61 : : const union kernfs_node_id *id) 62 : : { 63 : : struct kernfs_node *kn; 64 : : 65 : 0 : kn = kernfs_find_and_get_node_by_ino(root, id->ino); 66 : 0 : if (!kn) 67 : : return NULL; 68 : 0 : if (kn->id.generation != id->generation) { 69 : 0 : kernfs_put(kn); 70 : 0 : return NULL; 71 : : } 72 : : return kn; 73 : : } 74 : : 75 : 0 : static struct inode *kernfs_fh_get_inode(struct super_block *sb, 76 : : u64 ino, u32 generation) 77 : : { 78 : 0 : struct kernfs_super_info *info = kernfs_info(sb); 79 : : struct inode *inode; 80 : : struct kernfs_node *kn; 81 : : 82 : 0 : if (ino == 0) 83 : : return ERR_PTR(-ESTALE); 84 : : 85 : 0 : kn = kernfs_find_and_get_node_by_ino(info->root, ino); 86 : 0 : if (!kn) 87 : : return ERR_PTR(-ESTALE); 88 : 0 : inode = kernfs_get_inode(sb, kn); 89 : 0 : kernfs_put(kn); 90 : 0 : if (!inode) 91 : : return ERR_PTR(-ESTALE); 92 : : 93 : 0 : if (generation && inode->i_generation != generation) { 94 : : /* we didn't find the right inode.. */ 95 : 0 : iput(inode); 96 : 0 : return ERR_PTR(-ESTALE); 97 : : } 98 : : return inode; 99 : : } 100 : : 101 : 0 : static struct dentry *kernfs_fh_to_dentry(struct super_block *sb, struct fid *fid, 102 : : int fh_len, int fh_type) 103 : : { 104 : 0 : return generic_fh_to_dentry(sb, fid, fh_len, fh_type, 105 : : kernfs_fh_get_inode); 106 : : } 107 : : 108 : 0 : static struct dentry *kernfs_fh_to_parent(struct super_block *sb, struct fid *fid, 109 : : int fh_len, int fh_type) 110 : : { 111 : 0 : return generic_fh_to_parent(sb, fid, fh_len, fh_type, 112 : : kernfs_fh_get_inode); 113 : : } 114 : : 115 : 0 : static struct dentry *kernfs_get_parent_dentry(struct dentry *child) 116 : : { 117 : : struct kernfs_node *kn = kernfs_dentry_node(child); 118 : : 119 : 0 : return d_obtain_alias(kernfs_get_inode(child->d_sb, kn->parent)); 120 : : } 121 : : 122 : : static const struct export_operations kernfs_export_ops = { 123 : : .fh_to_dentry = kernfs_fh_to_dentry, 124 : : .fh_to_parent = kernfs_fh_to_parent, 125 : : .get_parent = kernfs_get_parent_dentry, 126 : : }; 127 : : 128 : : /** 129 : : * kernfs_root_from_sb - determine kernfs_root associated with a super_block 130 : : * @sb: the super_block in question 131 : : * 132 : : * Return the kernfs_root associated with @sb. If @sb is not a kernfs one, 133 : : * %NULL is returned. 134 : : */ 135 : 0 : struct kernfs_root *kernfs_root_from_sb(struct super_block *sb) 136 : : { 137 : 0 : if (sb->s_op == &kernfs_sops) 138 : 0 : return kernfs_info(sb)->root; 139 : : return NULL; 140 : : } 141 : : 142 : : /* 143 : : * find the next ancestor in the path down to @child, where @parent was the 144 : : * ancestor whose descendant we want to find. 145 : : * 146 : : * Say the path is /a/b/c/d. @child is d, @parent is NULL. We return the root 147 : : * node. If @parent is b, then we return the node for c. 148 : : * Passing in d as @parent is not ok. 149 : : */ 150 : 0 : static struct kernfs_node *find_next_ancestor(struct kernfs_node *child, 151 : : struct kernfs_node *parent) 152 : : { 153 : 0 : if (child == parent) { 154 : 0 : pr_crit_once("BUG in find_next_ancestor: called with parent == child"); 155 : : return NULL; 156 : : } 157 : : 158 : 0 : while (child->parent != parent) { 159 : 0 : if (!child->parent) 160 : : return NULL; 161 : : child = child->parent; 162 : : } 163 : : 164 : 0 : return child; 165 : : } 166 : : 167 : : /** 168 : : * kernfs_node_dentry - get a dentry for the given kernfs_node 169 : : * @kn: kernfs_node for which a dentry is needed 170 : : * @sb: the kernfs super_block 171 : : */ 172 : 0 : struct dentry *kernfs_node_dentry(struct kernfs_node *kn, 173 : : struct super_block *sb) 174 : : { 175 : : struct dentry *dentry; 176 : : struct kernfs_node *knparent = NULL; 177 : : 178 : 0 : BUG_ON(sb->s_op != &kernfs_sops); 179 : : 180 : 0 : dentry = dget(sb->s_root); 181 : : 182 : : /* Check if this is the root kernfs_node */ 183 : 0 : if (!kn->parent) 184 : : return dentry; 185 : : 186 : 0 : knparent = find_next_ancestor(kn, NULL); 187 : 0 : if (WARN_ON(!knparent)) { 188 : 0 : dput(dentry); 189 : 0 : return ERR_PTR(-EINVAL); 190 : : } 191 : : 192 : : do { 193 : : struct dentry *dtmp; 194 : : struct kernfs_node *kntmp; 195 : : 196 : 0 : if (kn == knparent) 197 : 0 : return dentry; 198 : 0 : kntmp = find_next_ancestor(kn, knparent); 199 : 0 : if (WARN_ON(!kntmp)) { 200 : 0 : dput(dentry); 201 : 0 : return ERR_PTR(-EINVAL); 202 : : } 203 : 0 : dtmp = lookup_one_len_unlocked(kntmp->name, dentry, 204 : 0 : strlen(kntmp->name)); 205 : 0 : dput(dentry); 206 : 0 : if (IS_ERR(dtmp)) 207 : 0 : return dtmp; 208 : : knparent = kntmp; 209 : : dentry = dtmp; 210 : : } while (true); 211 : : } 212 : : 213 : 3 : static int kernfs_fill_super(struct super_block *sb, struct kernfs_fs_context *kfc) 214 : : { 215 : 3 : struct kernfs_super_info *info = kernfs_info(sb); 216 : : struct inode *inode; 217 : : struct dentry *root; 218 : : 219 : 3 : info->sb = sb; 220 : : /* Userspace would break if executables or devices appear on sysfs */ 221 : 3 : sb->s_iflags |= SB_I_NOEXEC | SB_I_NODEV; 222 : 3 : sb->s_blocksize = PAGE_SIZE; 223 : 3 : sb->s_blocksize_bits = PAGE_SHIFT; 224 : 3 : sb->s_magic = kfc->magic; 225 : 3 : sb->s_op = &kernfs_sops; 226 : 3 : sb->s_xattr = kernfs_xattr_handlers; 227 : 3 : if (info->root->flags & KERNFS_ROOT_SUPPORT_EXPORTOP) 228 : 3 : sb->s_export_op = &kernfs_export_ops; 229 : 3 : sb->s_time_gran = 1; 230 : : 231 : : /* sysfs dentries and inodes don't require IO to create */ 232 : 3 : sb->s_shrink.seeks = 0; 233 : : 234 : : /* get root inode, initialize and unlock it */ 235 : 3 : mutex_lock(&kernfs_mutex); 236 : 3 : inode = kernfs_get_inode(sb, info->root->kn); 237 : 3 : mutex_unlock(&kernfs_mutex); 238 : 3 : if (!inode) { 239 : : pr_debug("kernfs: could not get root inode\n"); 240 : : return -ENOMEM; 241 : : } 242 : : 243 : : /* instantiate and link root dentry */ 244 : 3 : root = d_make_root(inode); 245 : 3 : if (!root) { 246 : : pr_debug("%s: could not get root dentry!\n", __func__); 247 : : return -ENOMEM; 248 : : } 249 : 3 : sb->s_root = root; 250 : 3 : sb->s_d_op = &kernfs_dops; 251 : 3 : return 0; 252 : : } 253 : : 254 : 3 : static int kernfs_test_super(struct super_block *sb, struct fs_context *fc) 255 : : { 256 : 3 : struct kernfs_super_info *sb_info = kernfs_info(sb); 257 : 3 : struct kernfs_super_info *info = fc->s_fs_info; 258 : : 259 : 3 : return sb_info->root == info->root && sb_info->ns == info->ns; 260 : : } 261 : : 262 : 3 : static int kernfs_set_super(struct super_block *sb, struct fs_context *fc) 263 : : { 264 : 3 : struct kernfs_fs_context *kfc = fc->fs_private; 265 : : 266 : 3 : kfc->ns_tag = NULL; 267 : 3 : return set_anon_super_fc(sb, fc); 268 : : } 269 : : 270 : : /** 271 : : * kernfs_super_ns - determine the namespace tag of a kernfs super_block 272 : : * @sb: super_block of interest 273 : : * 274 : : * Return the namespace tag associated with kernfs super_block @sb. 275 : : */ 276 : 0 : const void *kernfs_super_ns(struct super_block *sb) 277 : : { 278 : 0 : struct kernfs_super_info *info = kernfs_info(sb); 279 : : 280 : 0 : return info->ns; 281 : : } 282 : : 283 : : /** 284 : : * kernfs_get_tree - kernfs filesystem access/retrieval helper 285 : : * @fc: The filesystem context. 286 : : * 287 : : * This is to be called from each kernfs user's fs_context->ops->get_tree() 288 : : * implementation, which should set the specified ->@fs_type and ->@flags, and 289 : : * specify the hierarchy and namespace tag to mount via ->@root and ->@ns, 290 : : * respectively. 291 : : */ 292 : 3 : int kernfs_get_tree(struct fs_context *fc) 293 : : { 294 : 3 : struct kernfs_fs_context *kfc = fc->fs_private; 295 : : struct super_block *sb; 296 : : struct kernfs_super_info *info; 297 : : int error; 298 : : 299 : 3 : info = kzalloc(sizeof(*info), GFP_KERNEL); 300 : 3 : if (!info) 301 : : return -ENOMEM; 302 : : 303 : 3 : info->root = kfc->root; 304 : 3 : info->ns = kfc->ns_tag; 305 : 3 : INIT_LIST_HEAD(&info->node); 306 : : 307 : 3 : fc->s_fs_info = info; 308 : 3 : sb = sget_fc(fc, kernfs_test_super, kernfs_set_super); 309 : 3 : if (IS_ERR(sb)) 310 : 0 : return PTR_ERR(sb); 311 : : 312 : 3 : if (!sb->s_root) { 313 : 3 : struct kernfs_super_info *info = kernfs_info(sb); 314 : : 315 : 3 : kfc->new_sb_created = true; 316 : : 317 : 3 : error = kernfs_fill_super(sb, kfc); 318 : 3 : if (error) { 319 : 0 : deactivate_locked_super(sb); 320 : 0 : return error; 321 : : } 322 : 3 : sb->s_flags |= SB_ACTIVE; 323 : : 324 : 3 : mutex_lock(&kernfs_mutex); 325 : 3 : list_add(&info->node, &info->root->supers); 326 : 3 : mutex_unlock(&kernfs_mutex); 327 : : } 328 : : 329 : 3 : fc->root = dget(sb->s_root); 330 : 3 : return 0; 331 : : } 332 : : 333 : 3 : void kernfs_free_fs_context(struct fs_context *fc) 334 : : { 335 : : /* Note that we don't deal with kfc->ns_tag here. */ 336 : 3 : kfree(fc->s_fs_info); 337 : 3 : fc->s_fs_info = NULL; 338 : 3 : } 339 : : 340 : : /** 341 : : * kernfs_kill_sb - kill_sb for kernfs 342 : : * @sb: super_block being killed 343 : : * 344 : : * This can be used directly for file_system_type->kill_sb(). If a kernfs 345 : : * user needs extra cleanup, it can implement its own kill_sb() and call 346 : : * this function at the end. 347 : : */ 348 : 0 : void kernfs_kill_sb(struct super_block *sb) 349 : : { 350 : 0 : struct kernfs_super_info *info = kernfs_info(sb); 351 : : 352 : 0 : mutex_lock(&kernfs_mutex); 353 : : list_del(&info->node); 354 : 0 : mutex_unlock(&kernfs_mutex); 355 : : 356 : : /* 357 : : * Remove the superblock from fs_supers/s_instances 358 : : * so we can't find it, before freeing kernfs_super_info. 359 : : */ 360 : 0 : kill_anon_super(sb); 361 : 0 : kfree(info); 362 : 0 : } 363 : : 364 : 3 : void __init kernfs_init(void) 365 : : { 366 : : 367 : : /* 368 : : * the slab is freed in RCU context, so kernfs_find_and_get_node_by_ino 369 : : * can access the slab lock free. This could introduce stale nodes, 370 : : * please see how kernfs_find_and_get_node_by_ino filters out stale 371 : : * nodes. 372 : : */ 373 : 3 : kernfs_node_cache = kmem_cache_create("kernfs_node_cache", 374 : : sizeof(struct kernfs_node), 375 : : 0, 376 : : SLAB_PANIC | SLAB_TYPESAFE_BY_RCU, 377 : : NULL); 378 : : 379 : : /* Creates slab cache for kernfs inode attributes */ 380 : 3 : kernfs_iattrs_cache = kmem_cache_create("kernfs_iattrs_cache", 381 : : sizeof(struct kernfs_iattrs), 382 : : 0, SLAB_PANIC, NULL); 383 : 3 : }