| 1 | |
| 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 <[email protected]>
|
| 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 | #include <linux/uuid.h>
|
| 20 | #include <linux/statfs.h>
|
| 21 |
|
| 22 | #include "kernfs-internal.h"
|
| 23 |
|
| 24 | struct kmem_cache *kernfs_node_cache __ro_after_init;
|
| 25 | struct kmem_cache *kernfs_iattrs_cache __ro_after_init;
|
| 26 | struct kernfs_global_locks *kernfs_locks __ro_after_init;
|
| 27 |
|
| 28 | static int kernfs_sop_show_options(struct seq_file *sf, struct dentry *dentry)
|
| 29 | {
|
| 30 | struct kernfs_root *root = kernfs_root(kernfs_dentry_node(dentry));
|
| 31 | struct kernfs_syscall_ops *scops = root->syscall_ops;
|
| 32 |
|
| 33 | if (scops && scops->show_options)
|
| 34 | return scops->show_options(sf, root);
|
| 35 | return 0;
|
| 36 | }
|
| 37 |
|
| 38 | static int kernfs_sop_show_path(struct seq_file *sf, struct dentry *dentry)
|
| 39 | {
|
| 40 | struct kernfs_node *node = kernfs_dentry_node(dentry);
|
| 41 | struct kernfs_root *root = kernfs_root(node);
|
| 42 | struct kernfs_syscall_ops *scops = root->syscall_ops;
|
| 43 |
|
| 44 | if (scops && scops->show_path)
|
| 45 | return scops->show_path(sf, node, root);
|
| 46 |
|
| 47 | seq_dentry(sf, dentry, " \t\n\\");
|
| 48 | return 0;
|
| 49 | }
|
| 50 |
|
| 51 | static int kernfs_statfs(struct dentry *dentry, struct kstatfs *buf)
|
| 52 | {
|
| 53 | simple_statfs(dentry, buf);
|
| 54 | buf->f_fsid = uuid_to_fsid(dentry->d_sb->s_uuid.b);
|
| 55 | return 0;
|
| 56 | }
|
| 57 |
|
| 58 | const struct super_operations kernfs_sops = {
|
| 59 | .statfs = kernfs_statfs,
|
| 60 | .drop_inode = inode_just_drop,
|
| 61 | .evict_inode = kernfs_evict_inode,
|
| 62 |
|
| 63 | .show_options = kernfs_sop_show_options,
|
| 64 | .show_path = kernfs_sop_show_path,
|
| 65 |
|
| 66 | |
| 67 | * sysfs is built on top of kernfs and sysfs provides the power
|
| 68 | * management infrastructure to support suspend/hibernate by
|
| 69 | * writing to various files in /sys/power/. As filesystems may
|
| 70 | * be automatically frozen during suspend/hibernate implementing
|
| 71 | * freeze/thaw support for kernfs generically will cause
|
| 72 | * deadlocks as the suspending/hibernation initiating task will
|
| 73 | * hold a VFS lock that it will then wait upon to be released.
|
| 74 | * If freeze/thaw for kernfs is needed talk to the VFS.
|
| 75 |
|
| 76 | .freeze_fs = NULL,
|
| 77 | .unfreeze_fs = NULL,
|
| 78 | .freeze_super = NULL,
|
| 79 | .thaw_super = NULL,
|
| 80 | };
|
| 81 |
|
| 82 | static int kernfs_encode_fh(struct inode *inode, __u32 *fh, int *max_len,
|
| 83 | struct inode *parent)
|
| 84 | {
|
| 85 | struct kernfs_node *kn = inode->i_private;
|
| 86 |
|
| 87 | if (*max_len < 2) {
|
| 88 | *max_len = 2;
|
| 89 | return FILEID_INVALID;
|
| 90 | }
|
| 91 |
|
| 92 | *max_len = 2;
|
| 93 | *(u64 *)fh = kn->id;
|
| 94 | return FILEID_KERNFS;
|
| 95 | }
|
| 96 |
|
| 97 | static struct dentry *__kernfs_fh_to_dentry(struct super_block *sb,
|
| 98 | struct fid *fid, int fh_len,
|
| 99 | int fh_type, bool get_parent)
|
| 100 | {
|
| 101 | struct kernfs_super_info *info = kernfs_info(sb);
|
| 102 | struct kernfs_node *kn;
|
| 103 | struct inode *inode;
|
| 104 | u64 id;
|
| 105 |
|
| 106 | if (fh_len < 2)
|
| 107 | return NULL;
|
| 108 |
|
| 109 | switch (fh_type) {
|
| 110 | case FILEID_KERNFS:
|
| 111 | id = *(u64 *)fid;
|
| 112 | break;
|
| 113 | case FILEID_INO32_GEN:
|
| 114 | case FILEID_INO32_GEN_PARENT:
|
| 115 | |
| 116 | * blk_log_action() exposes "LOW32,HIGH32" pair without
|
| 117 | * type and userland can call us with generic fid
|
| 118 | * constructed from them. Combine it back to ID. See
|
| 119 | * blk_log_action().
|
| 120 |
|
| 121 | id = ((u64)fid->i32.gen << 32) | fid->i32.ino;
|
| 122 | break;
|
| 123 | default:
|
| 124 | return NULL;
|
| 125 | }
|
| 126 |
|
| 127 | |
| 128 | * Hold kernfs_rwsem across the lookup as well as kernfs_get_inode().
|
| 129 | * __kernfs_remove() deactivates the subtree and clears i_nlink on its
|
| 130 | * inodes under the write lock, so under the read lock either
|
| 131 | * kernfs_find_and_get_node_by_id() refuses the node, or the inode is
|
| 132 | * in the inode hash before the ilookup() pass goes looking for it.
|
| 133 |
|
| 134 | scoped_guard(rwsem_read, &info->root->kernfs_rwsem) {
|
| 135 | kn = kernfs_find_and_get_node_by_id(info->root, id);
|
| 136 | if (!kn)
|
| 137 | return ERR_PTR(-ESTALE);
|
| 138 |
|
| 139 | if (get_parent) {
|
| 140 | struct kernfs_node *parent;
|
| 141 |
|
| 142 | parent = kernfs_get_parent(kn);
|
| 143 | kernfs_put(kn);
|
| 144 | kn = parent;
|
| 145 | if (!kn)
|
| 146 | return ERR_PTR(-ESTALE);
|
| 147 | }
|
| 148 |
|
| 149 | inode = kernfs_get_inode(sb, kn);
|
| 150 | kernfs_put(kn);
|
| 151 | }
|
| 152 |
|
| 153 | return d_obtain_alias(inode);
|
| 154 | }
|
| 155 |
|
| 156 | static struct dentry *kernfs_fh_to_dentry(struct super_block *sb,
|
| 157 | struct fid *fid, int fh_len,
|
| 158 | int fh_type)
|
| 159 | {
|
| 160 | return __kernfs_fh_to_dentry(sb, fid, fh_len, fh_type, false);
|
| 161 | }
|
| 162 |
|
| 163 | static struct dentry *kernfs_fh_to_parent(struct super_block *sb,
|
| 164 | struct fid *fid, int fh_len,
|
| 165 | int fh_type)
|
| 166 | {
|
| 167 | return __kernfs_fh_to_dentry(sb, fid, fh_len, fh_type, true);
|
| 168 | }
|
| 169 |
|
| 170 | static struct dentry *kernfs_get_parent_dentry(struct dentry *child)
|
| 171 | {
|
| 172 | struct kernfs_node *kn = kernfs_dentry_node(child);
|
| 173 | struct kernfs_root *root = kernfs_root(kn);
|
| 174 |
|
| 175 | guard(rwsem_read)(&root->kernfs_rwsem);
|
| 176 | return d_obtain_alias(kernfs_get_inode(child->d_sb, kernfs_parent(kn)));
|
| 177 | }
|
| 178 |
|
| 179 | static const struct export_operations kernfs_export_ops = {
|
| 180 | .encode_fh = kernfs_encode_fh,
|
| 181 | .fh_to_dentry = kernfs_fh_to_dentry,
|
| 182 | .fh_to_parent = kernfs_fh_to_parent,
|
| 183 | .get_parent = kernfs_get_parent_dentry,
|
| 184 | };
|
| 185 |
|
| 186 | |
| 187 | * kernfs_root_from_sb - determine kernfs_root associated with a super_block
|
| 188 | * @sb: the super_block in question
|
| 189 | *
|
| 190 | * Return: the kernfs_root associated with @sb. If @sb is not a kernfs one,
|
| 191 | * %NULL is returned.
|
| 192 |
|
| 193 | struct kernfs_root *kernfs_root_from_sb(struct super_block *sb)
|
| 194 | {
|
| 195 | if (sb->s_op == &kernfs_sops)
|
| 196 | return kernfs_info(sb)->root;
|
| 197 | return NULL;
|
| 198 | }
|
| 199 |
|
| 200 | |
| 201 | * find the next ancestor in the path down to @child, where @parent was the
|
| 202 | * ancestor whose descendant we want to find.
|
| 203 | *
|
| 204 | * Say the path is /a/b/c/d. @child is d, @parent is %NULL. We return the root
|
| 205 | * node. If @parent is b, then we return the node for c.
|
| 206 | * Passing in d as @parent is not ok.
|
| 207 |
|
| 208 | static struct kernfs_node *find_next_ancestor(struct kernfs_node *child,
|
| 209 | struct kernfs_node *parent)
|
| 210 | {
|
| 211 | if (child == parent) {
|
| 212 | pr_crit_once("BUG in find_next_ancestor: called with parent == child");
|
| 213 | return NULL;
|
| 214 | }
|
| 215 |
|
| 216 | while (kernfs_parent(child) != parent) {
|
| 217 | child = kernfs_parent(child);
|
| 218 | if (!child)
|
| 219 | return NULL;
|
| 220 | }
|
| 221 |
|
| 222 | return child;
|
| 223 | }
|
| 224 |
|
| 225 | |
| 226 | * kernfs_node_dentry - get a dentry for the given kernfs_node
|
| 227 | * @kn: kernfs_node for which a dentry is needed
|
| 228 | * @sb: the kernfs super_block
|
| 229 | *
|
| 230 | * Return: the dentry pointer
|
| 231 |
|
| 232 | struct dentry *kernfs_node_dentry(struct kernfs_node *kn,
|
| 233 | struct super_block *sb)
|
| 234 | {
|
| 235 | struct dentry *dentry;
|
| 236 | struct kernfs_node *knparent;
|
| 237 | struct kernfs_root *root;
|
| 238 |
|
| 239 | BUG_ON(sb->s_op != &kernfs_sops);
|
| 240 |
|
| 241 | dentry = dget(sb->s_root);
|
| 242 |
|
| 243 |
|
| 244 | if (!rcu_access_pointer(kn->__parent))
|
| 245 | return dentry;
|
| 246 |
|
| 247 | root = kernfs_root(kn);
|
| 248 | |
| 249 | * As long as kn is valid, its parent can not vanish. This is cgroup's
|
| 250 | * kn so it can't have its parent replaced. Therefore it is safe to use
|
| 251 | * the ancestor node outside of the RCU or locked section.
|
| 252 |
|
| 253 | if (WARN_ON_ONCE(!(root->flags & KERNFS_ROOT_INVARIANT_PARENT)))
|
| 254 | return ERR_PTR(-EINVAL);
|
| 255 | scoped_guard(rcu) {
|
| 256 | knparent = find_next_ancestor(kn, NULL);
|
| 257 | }
|
| 258 | if (WARN_ON(!knparent)) {
|
| 259 | dput(dentry);
|
| 260 | return ERR_PTR(-EINVAL);
|
| 261 | }
|
| 262 |
|
| 263 | do {
|
| 264 | struct dentry *dtmp;
|
| 265 | struct kernfs_node *kntmp;
|
| 266 | const char *name;
|
| 267 |
|
| 268 | if (kn == knparent)
|
| 269 | return dentry;
|
| 270 |
|
| 271 | scoped_guard(rwsem_read, &root->kernfs_rwsem) {
|
| 272 | kntmp = find_next_ancestor(kn, knparent);
|
| 273 | if (WARN_ON(!kntmp)) {
|
| 274 | dput(dentry);
|
| 275 | return ERR_PTR(-EINVAL);
|
| 276 | }
|
| 277 | name = kstrdup(kernfs_rcu_name(kntmp), GFP_KERNEL);
|
| 278 | }
|
| 279 | if (!name) {
|
| 280 | dput(dentry);
|
| 281 | return ERR_PTR(-ENOMEM);
|
| 282 | }
|
| 283 | dtmp = lookup_noperm_positive_unlocked(&QSTR(name), dentry);
|
| 284 | dput(dentry);
|
| 285 | kfree(name);
|
| 286 | if (IS_ERR(dtmp))
|
| 287 | return dtmp;
|
| 288 | knparent = kntmp;
|
| 289 | dentry = dtmp;
|
| 290 | } while (true);
|
| 291 | }
|
| 292 |
|
| 293 | static int kernfs_fill_super(struct super_block *sb, struct kernfs_fs_context *kfc)
|
| 294 | {
|
| 295 | struct kernfs_super_info *info = kernfs_info(sb);
|
| 296 | struct kernfs_root *kf_root = kfc->root;
|
| 297 | struct inode *inode;
|
| 298 | struct dentry *root;
|
| 299 |
|
| 300 | info->sb = sb;
|
| 301 |
|
| 302 | sb->s_iflags |= SB_I_NOEXEC | SB_I_NODEV;
|
| 303 | sb->s_blocksize = PAGE_SIZE;
|
| 304 | sb->s_blocksize_bits = PAGE_SHIFT;
|
| 305 | sb->s_magic = kfc->magic;
|
| 306 | sb->s_op = &kernfs_sops;
|
| 307 | sb->s_xattr = kernfs_xattr_handlers;
|
| 308 | if (info->root->flags & KERNFS_ROOT_SUPPORT_EXPORTOP)
|
| 309 | sb->s_export_op = &kernfs_export_ops;
|
| 310 | sb->s_time_gran = 1;
|
| 311 | sb->s_maxbytes = MAX_LFS_FILESIZE;
|
| 312 |
|
| 313 |
|
| 314 | sb->s_shrink->seeks = 0;
|
| 315 |
|
| 316 |
|
| 317 | down_read(&kf_root->kernfs_rwsem);
|
| 318 | inode = kernfs_get_inode(sb, info->root->kn);
|
| 319 | up_read(&kf_root->kernfs_rwsem);
|
| 320 | if (!inode) {
|
| 321 | pr_debug("kernfs: could not get root inode\n");
|
| 322 | return -ENOMEM;
|
| 323 | }
|
| 324 |
|
| 325 |
|
| 326 | root = d_make_root(inode);
|
| 327 | if (!root) {
|
| 328 | pr_debug("%s: could not get root dentry!\n", __func__);
|
| 329 | return -ENOMEM;
|
| 330 | }
|
| 331 | sb->s_root = root;
|
| 332 | set_default_d_op(sb, &kernfs_dops);
|
| 333 | return 0;
|
| 334 | }
|
| 335 |
|
| 336 | static int kernfs_test_super(struct super_block *sb, struct fs_context *fc)
|
| 337 | {
|
| 338 | struct kernfs_super_info *sb_info = kernfs_info(sb);
|
| 339 | struct kernfs_super_info *info = fc->s_fs_info;
|
| 340 |
|
| 341 | return sb_info->root == info->root && sb_info->ns == info->ns;
|
| 342 | }
|
| 343 |
|
| 344 | static int kernfs_set_super(struct super_block *sb, struct fs_context *fc)
|
| 345 | {
|
| 346 | struct kernfs_fs_context *kfc = fc->fs_private;
|
| 347 |
|
| 348 | kfc->ns_tag = NULL;
|
| 349 | return set_anon_super_fc(sb, fc);
|
| 350 | }
|
| 351 |
|
| 352 | |
| 353 | * kernfs_super_ns - determine the namespace tag of a kernfs super_block
|
| 354 | * @sb: super_block of interest
|
| 355 | *
|
| 356 | * Return: the namespace tag associated with kernfs super_block @sb.
|
| 357 |
|
| 358 | const struct ns_common *kernfs_super_ns(struct super_block *sb)
|
| 359 | {
|
| 360 | struct kernfs_super_info *info = kernfs_info(sb);
|
| 361 |
|
| 362 | return info->ns;
|
| 363 | }
|
| 364 |
|
| 365 | |
| 366 | * kernfs_get_tree - kernfs filesystem access/retrieval helper
|
| 367 | * @fc: The filesystem context.
|
| 368 | *
|
| 369 | * This is to be called from each kernfs user's fs_context->ops->get_tree()
|
| 370 | * implementation, which should set the specified ->@fs_type and ->@flags, and
|
| 371 | * specify the hierarchy and namespace tag to mount via ->@root and ->@ns,
|
| 372 | * respectively.
|
| 373 | *
|
| 374 | * Return: %0 on success, -errno on failure.
|
| 375 |
|
| 376 | int kernfs_get_tree(struct fs_context *fc)
|
| 377 | {
|
| 378 | struct kernfs_fs_context *kfc = fc->fs_private;
|
| 379 | struct super_block *sb;
|
| 380 | struct kernfs_super_info *info;
|
| 381 | int error;
|
| 382 |
|
| 383 | info = kzalloc_obj(*info);
|
| 384 | if (!info)
|
| 385 | return -ENOMEM;
|
| 386 |
|
| 387 | info->root = kfc->root;
|
| 388 | info->ns = kfc->ns_tag;
|
| 389 | INIT_LIST_HEAD(&info->node);
|
| 390 |
|
| 391 | fc->s_fs_info = info;
|
| 392 | sb = sget_fc(fc, kernfs_test_super, kernfs_set_super);
|
| 393 | if (IS_ERR(sb))
|
| 394 | return PTR_ERR(sb);
|
| 395 |
|
| 396 | if (!sb->s_root) {
|
| 397 | struct kernfs_super_info *info = kernfs_info(sb);
|
| 398 | struct kernfs_root *root = kfc->root;
|
| 399 |
|
| 400 | kfc->new_sb_created = true;
|
| 401 |
|
| 402 | error = kernfs_fill_super(sb, kfc);
|
| 403 | if (error) {
|
| 404 | deactivate_locked_super(sb);
|
| 405 | return error;
|
| 406 | }
|
| 407 | sb->s_flags |= SB_ACTIVE;
|
| 408 |
|
| 409 | uuid_t uuid;
|
| 410 | uuid_gen(&uuid);
|
| 411 | super_set_uuid(sb, uuid.b, sizeof(uuid));
|
| 412 |
|
| 413 | down_write(&root->kernfs_supers_rwsem);
|
| 414 | list_add(&info->node, &info->root->supers);
|
| 415 | up_write(&root->kernfs_supers_rwsem);
|
| 416 | }
|
| 417 |
|
| 418 | fc->root = dget(sb->s_root);
|
| 419 | return 0;
|
| 420 | }
|
| 421 |
|
| 422 | void kernfs_free_fs_context(struct fs_context *fc)
|
| 423 | {
|
| 424 |
|
| 425 | kfree(fc->s_fs_info);
|
| 426 | fc->s_fs_info = NULL;
|
| 427 | }
|
| 428 |
|
| 429 | |
| 430 | * kernfs_kill_sb - kill_sb for kernfs
|
| 431 | * @sb: super_block being killed
|
| 432 | *
|
| 433 | * This can be used directly for file_system_type->kill_sb(). If a kernfs
|
| 434 | * user needs extra cleanup, it can implement its own kill_sb() and call
|
| 435 | * this function at the end.
|
| 436 |
|
| 437 | void kernfs_kill_sb(struct super_block *sb)
|
| 438 | {
|
| 439 | struct kernfs_super_info *info = kernfs_info(sb);
|
| 440 | struct kernfs_root *root = info->root;
|
| 441 |
|
| 442 | down_write(&root->kernfs_supers_rwsem);
|
| 443 | list_del(&info->node);
|
| 444 | up_write(&root->kernfs_supers_rwsem);
|
| 445 |
|
| 446 | |
| 447 | * Mark the superblock dead so sget_fc() can't find it,
|
| 448 | * before freeing kernfs_super_info.
|
| 449 |
|
| 450 | kill_anon_super(sb);
|
| 451 | kfree(info);
|
| 452 | }
|
| 453 |
|
| 454 | static void __init kernfs_mutex_init(void)
|
| 455 | {
|
| 456 | int count;
|
| 457 |
|
| 458 | for (count = 0; count < NR_KERNFS_LOCKS; count++)
|
| 459 | mutex_init(&kernfs_locks->node_mutex[count]);
|
| 460 | }
|
| 461 |
|
| 462 | static void __init kernfs_lock_init(void)
|
| 463 | {
|
| 464 | kernfs_locks = kmalloc_obj(struct kernfs_global_locks);
|
| 465 | WARN_ON(!kernfs_locks);
|
| 466 |
|
| 467 | kernfs_mutex_init();
|
| 468 | }
|
| 469 |
|
| 470 | void __init kernfs_init(void)
|
| 471 | {
|
| 472 | kernfs_node_cache = kmem_cache_create("kernfs_node_cache",
|
| 473 | sizeof(struct kernfs_node),
|
| 474 | 0, SLAB_PANIC, NULL);
|
| 475 |
|
| 476 |
|
| 477 | kernfs_iattrs_cache = kmem_cache_create("kernfs_iattrs_cache",
|
| 478 | sizeof(struct kernfs_iattrs),
|
| 479 | 0, SLAB_PANIC, NULL);
|
| 480 |
|
| 481 | kernfs_lock_init();
|
| 482 | }
|