1 // SPDX-License-Identifier: GPL-2.0-only
3 * fs/kernfs/mount.c - kernfs mount implementation
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>
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>
20 #include "kernfs-internal.h"
22 struct kmem_cache
*kernfs_node_cache
, *kernfs_iattrs_cache
;
24 static int kernfs_sop_show_options(struct seq_file
*sf
, struct dentry
*dentry
)
26 struct kernfs_root
*root
= kernfs_root(kernfs_dentry_node(dentry
));
27 struct kernfs_syscall_ops
*scops
= root
->syscall_ops
;
29 if (scops
&& scops
->show_options
)
30 return scops
->show_options(sf
, root
);
34 static int kernfs_sop_show_path(struct seq_file
*sf
, struct dentry
*dentry
)
36 struct kernfs_node
*node
= kernfs_dentry_node(dentry
);
37 struct kernfs_root
*root
= kernfs_root(node
);
38 struct kernfs_syscall_ops
*scops
= root
->syscall_ops
;
40 if (scops
&& scops
->show_path
)
41 return scops
->show_path(sf
, node
, root
);
43 seq_dentry(sf
, dentry
, " \t\n\\");
47 const struct super_operations kernfs_sops
= {
48 .statfs
= simple_statfs
,
49 .drop_inode
= generic_delete_inode
,
50 .evict_inode
= kernfs_evict_inode
,
52 .show_options
= kernfs_sop_show_options
,
53 .show_path
= kernfs_sop_show_path
,
56 static int kernfs_encode_fh(struct inode
*inode
, __u32
*fh
, int *max_len
,
59 struct kernfs_node
*kn
= inode
->i_private
;
63 return FILEID_INVALID
;
71 static struct dentry
*__kernfs_fh_to_dentry(struct super_block
*sb
,
72 struct fid
*fid
, int fh_len
,
73 int fh_type
, bool get_parent
)
75 struct kernfs_super_info
*info
= kernfs_info(sb
);
76 struct kernfs_node
*kn
;
87 case FILEID_INO32_GEN
:
88 case FILEID_INO32_GEN_PARENT
:
90 * blk_log_action() exposes "LOW32,HIGH32" pair without
91 * type and userland can call us with generic fid
92 * constructed from them. Combine it back to ID. See
95 id
= ((u64
)fid
->i32
.gen
<< 32) | fid
->i32
.ino
;
101 kn
= kernfs_find_and_get_node_by_id(info
->root
, id
);
103 return ERR_PTR(-ESTALE
);
106 struct kernfs_node
*parent
;
108 parent
= kernfs_get_parent(kn
);
112 return ERR_PTR(-ESTALE
);
115 inode
= kernfs_get_inode(sb
, kn
);
118 return ERR_PTR(-ESTALE
);
120 return d_obtain_alias(inode
);
123 static struct dentry
*kernfs_fh_to_dentry(struct super_block
*sb
,
124 struct fid
*fid
, int fh_len
,
127 return __kernfs_fh_to_dentry(sb
, fid
, fh_len
, fh_type
, false);
130 static struct dentry
*kernfs_fh_to_parent(struct super_block
*sb
,
131 struct fid
*fid
, int fh_len
,
134 return __kernfs_fh_to_dentry(sb
, fid
, fh_len
, fh_type
, true);
137 static struct dentry
*kernfs_get_parent_dentry(struct dentry
*child
)
139 struct kernfs_node
*kn
= kernfs_dentry_node(child
);
141 return d_obtain_alias(kernfs_get_inode(child
->d_sb
, kn
->parent
));
144 static const struct export_operations kernfs_export_ops
= {
145 .encode_fh
= kernfs_encode_fh
,
146 .fh_to_dentry
= kernfs_fh_to_dentry
,
147 .fh_to_parent
= kernfs_fh_to_parent
,
148 .get_parent
= kernfs_get_parent_dentry
,
152 * kernfs_root_from_sb - determine kernfs_root associated with a super_block
153 * @sb: the super_block in question
155 * Return the kernfs_root associated with @sb. If @sb is not a kernfs one,
158 struct kernfs_root
*kernfs_root_from_sb(struct super_block
*sb
)
160 if (sb
->s_op
== &kernfs_sops
)
161 return kernfs_info(sb
)->root
;
166 * find the next ancestor in the path down to @child, where @parent was the
167 * ancestor whose descendant we want to find.
169 * Say the path is /a/b/c/d. @child is d, @parent is NULL. We return the root
170 * node. If @parent is b, then we return the node for c.
171 * Passing in d as @parent is not ok.
173 static struct kernfs_node
*find_next_ancestor(struct kernfs_node
*child
,
174 struct kernfs_node
*parent
)
176 if (child
== parent
) {
177 pr_crit_once("BUG in find_next_ancestor: called with parent == child");
181 while (child
->parent
!= parent
) {
184 child
= child
->parent
;
191 * kernfs_node_dentry - get a dentry for the given kernfs_node
192 * @kn: kernfs_node for which a dentry is needed
193 * @sb: the kernfs super_block
195 struct dentry
*kernfs_node_dentry(struct kernfs_node
*kn
,
196 struct super_block
*sb
)
198 struct dentry
*dentry
;
199 struct kernfs_node
*knparent
= NULL
;
201 BUG_ON(sb
->s_op
!= &kernfs_sops
);
203 dentry
= dget(sb
->s_root
);
205 /* Check if this is the root kernfs_node */
209 knparent
= find_next_ancestor(kn
, NULL
);
210 if (WARN_ON(!knparent
)) {
212 return ERR_PTR(-EINVAL
);
217 struct kernfs_node
*kntmp
;
221 kntmp
= find_next_ancestor(kn
, knparent
);
222 if (WARN_ON(!kntmp
)) {
224 return ERR_PTR(-EINVAL
);
226 dtmp
= lookup_positive_unlocked(kntmp
->name
, dentry
,
227 strlen(kntmp
->name
));
236 static int kernfs_fill_super(struct super_block
*sb
, struct kernfs_fs_context
*kfc
)
238 struct kernfs_super_info
*info
= kernfs_info(sb
);
243 /* Userspace would break if executables or devices appear on sysfs */
244 sb
->s_iflags
|= SB_I_NOEXEC
| SB_I_NODEV
;
245 sb
->s_blocksize
= PAGE_SIZE
;
246 sb
->s_blocksize_bits
= PAGE_SHIFT
;
247 sb
->s_magic
= kfc
->magic
;
248 sb
->s_op
= &kernfs_sops
;
249 sb
->s_xattr
= kernfs_xattr_handlers
;
250 if (info
->root
->flags
& KERNFS_ROOT_SUPPORT_EXPORTOP
)
251 sb
->s_export_op
= &kernfs_export_ops
;
254 /* sysfs dentries and inodes don't require IO to create */
255 sb
->s_shrink
.seeks
= 0;
257 /* get root inode, initialize and unlock it */
258 mutex_lock(&kernfs_mutex
);
259 inode
= kernfs_get_inode(sb
, info
->root
->kn
);
260 mutex_unlock(&kernfs_mutex
);
262 pr_debug("kernfs: could not get root inode\n");
266 /* instantiate and link root dentry */
267 root
= d_make_root(inode
);
269 pr_debug("%s: could not get root dentry!\n", __func__
);
273 sb
->s_d_op
= &kernfs_dops
;
277 static int kernfs_test_super(struct super_block
*sb
, struct fs_context
*fc
)
279 struct kernfs_super_info
*sb_info
= kernfs_info(sb
);
280 struct kernfs_super_info
*info
= fc
->s_fs_info
;
282 return sb_info
->root
== info
->root
&& sb_info
->ns
== info
->ns
;
285 static int kernfs_set_super(struct super_block
*sb
, struct fs_context
*fc
)
287 struct kernfs_fs_context
*kfc
= fc
->fs_private
;
290 return set_anon_super_fc(sb
, fc
);
294 * kernfs_super_ns - determine the namespace tag of a kernfs super_block
295 * @sb: super_block of interest
297 * Return the namespace tag associated with kernfs super_block @sb.
299 const void *kernfs_super_ns(struct super_block
*sb
)
301 struct kernfs_super_info
*info
= kernfs_info(sb
);
307 * kernfs_get_tree - kernfs filesystem access/retrieval helper
308 * @fc: The filesystem context.
310 * This is to be called from each kernfs user's fs_context->ops->get_tree()
311 * implementation, which should set the specified ->@fs_type and ->@flags, and
312 * specify the hierarchy and namespace tag to mount via ->@root and ->@ns,
315 int kernfs_get_tree(struct fs_context
*fc
)
317 struct kernfs_fs_context
*kfc
= fc
->fs_private
;
318 struct super_block
*sb
;
319 struct kernfs_super_info
*info
;
322 info
= kzalloc(sizeof(*info
), GFP_KERNEL
);
326 info
->root
= kfc
->root
;
327 info
->ns
= kfc
->ns_tag
;
328 INIT_LIST_HEAD(&info
->node
);
330 fc
->s_fs_info
= info
;
331 sb
= sget_fc(fc
, kernfs_test_super
, kernfs_set_super
);
336 struct kernfs_super_info
*info
= kernfs_info(sb
);
338 kfc
->new_sb_created
= true;
340 error
= kernfs_fill_super(sb
, kfc
);
342 deactivate_locked_super(sb
);
345 sb
->s_flags
|= SB_ACTIVE
;
347 mutex_lock(&kernfs_mutex
);
348 list_add(&info
->node
, &info
->root
->supers
);
349 mutex_unlock(&kernfs_mutex
);
352 fc
->root
= dget(sb
->s_root
);
356 void kernfs_free_fs_context(struct fs_context
*fc
)
358 /* Note that we don't deal with kfc->ns_tag here. */
359 kfree(fc
->s_fs_info
);
360 fc
->s_fs_info
= NULL
;
364 * kernfs_kill_sb - kill_sb for kernfs
365 * @sb: super_block being killed
367 * This can be used directly for file_system_type->kill_sb(). If a kernfs
368 * user needs extra cleanup, it can implement its own kill_sb() and call
369 * this function at the end.
371 void kernfs_kill_sb(struct super_block
*sb
)
373 struct kernfs_super_info
*info
= kernfs_info(sb
);
375 mutex_lock(&kernfs_mutex
);
376 list_del(&info
->node
);
377 mutex_unlock(&kernfs_mutex
);
380 * Remove the superblock from fs_supers/s_instances
381 * so we can't find it, before freeing kernfs_super_info.
387 void __init
kernfs_init(void)
389 kernfs_node_cache
= kmem_cache_create("kernfs_node_cache",
390 sizeof(struct kernfs_node
),
391 0, SLAB_PANIC
, NULL
);
393 /* Creates slab cache for kernfs inode attributes */
394 kernfs_iattrs_cache
= kmem_cache_create("kernfs_iattrs_cache",
395 sizeof(struct kernfs_iattrs
),
396 0, SLAB_PANIC
, NULL
);