![Trond Myklebust](/assets/img/avatar_default.png)
The purpose of this patch is to improve the remote mount path lookup support for distributed filesystems such as the NFSv4 client. When given a mount command of the form "mount server:/foo/bar /mnt", the NFSv4 client is required to look up the filehandle for "server:/", and then look up each component of the remote mount path "foo/bar" in order to find the directory that is actually going to be mounted on /mnt. Following that remote mount path may involve following symlinks, crossing server-side mount points and even following referrals to filesystem volumes on other servers. Since the standard VFS path lookup code already supports walking paths that contain all these features (using in-kernel automounts for following referrals) we would like to be able to reuse that rather than duplicate the full path traversal functionality in the NFSv4 client code. This patch therefore defines a VFS helper function create_mnt_ns(), that sets up a temporary filesystem namespace and attaches a root filesystem to it. It exports the create_mnt_ns() and put_mnt_ns() function for use by filesystem modules. Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
50 lines
1 KiB
C
50 lines
1 KiB
C
#ifndef _NAMESPACE_H_
|
|
#define _NAMESPACE_H_
|
|
#ifdef __KERNEL__
|
|
|
|
#include <linux/mount.h>
|
|
#include <linux/sched.h>
|
|
#include <linux/nsproxy.h>
|
|
#include <linux/seq_file.h>
|
|
|
|
struct mnt_namespace {
|
|
atomic_t count;
|
|
struct vfsmount * root;
|
|
struct list_head list;
|
|
wait_queue_head_t poll;
|
|
int event;
|
|
};
|
|
|
|
struct proc_mounts {
|
|
struct seq_file m; /* must be the first element */
|
|
struct mnt_namespace *ns;
|
|
struct path root;
|
|
int event;
|
|
};
|
|
|
|
struct fs_struct;
|
|
|
|
extern struct mnt_namespace *create_mnt_ns(struct vfsmount *mnt);
|
|
extern struct mnt_namespace *copy_mnt_ns(unsigned long, struct mnt_namespace *,
|
|
struct fs_struct *);
|
|
extern void put_mnt_ns(struct mnt_namespace *ns);
|
|
|
|
static inline void exit_mnt_ns(struct task_struct *p)
|
|
{
|
|
struct mnt_namespace *ns = p->nsproxy->mnt_ns;
|
|
if (ns)
|
|
put_mnt_ns(ns);
|
|
}
|
|
|
|
static inline void get_mnt_ns(struct mnt_namespace *ns)
|
|
{
|
|
atomic_inc(&ns->count);
|
|
}
|
|
|
|
extern const struct seq_operations mounts_op;
|
|
extern const struct seq_operations mountinfo_op;
|
|
extern const struct seq_operations mountstats_op;
|
|
|
|
#endif
|
|
#endif
|