diff options
Diffstat (limited to 'fs/dcache.c')
| -rw-r--r-- | fs/dcache.c | 37 | 
1 files changed, 7 insertions, 30 deletions
diff --git a/fs/dcache.c b/fs/dcache.c index 89509b5a090..9791b1e7eee 100644 --- a/fs/dcache.c +++ b/fs/dcache.c @@ -38,6 +38,7 @@  #include <linux/prefetch.h>  #include <linux/ratelimit.h>  #include "internal.h" +#include "mount.h"  /*   * Usage: @@ -2451,6 +2452,7 @@ static int prepend_path(const struct path *path,  {  	struct dentry *dentry = path->dentry;  	struct vfsmount *vfsmnt = path->mnt; +	struct mount *mnt = real_mount(vfsmnt);  	bool slash = false;  	int error = 0; @@ -2460,11 +2462,11 @@ static int prepend_path(const struct path *path,  		if (dentry == vfsmnt->mnt_root || IS_ROOT(dentry)) {  			/* Global root? */ -			if (vfsmnt->mnt_parent == vfsmnt) { +			if (!mnt_has_parent(mnt))  				goto global_root; -			} -			dentry = vfsmnt->mnt_mountpoint; -			vfsmnt = vfsmnt->mnt_parent; +			dentry = mnt->mnt_mountpoint; +			mnt = mnt->mnt_parent; +			vfsmnt = &mnt->mnt;  			continue;  		}  		parent = dentry->d_parent; @@ -2501,7 +2503,7 @@ global_root:  	if (!slash)  		error = prepend(buffer, buflen, "/", 1);  	if (!error) -		error = vfsmnt->mnt_ns ? 1 : 2; +		error = real_mount(vfsmnt)->mnt_ns ? 1 : 2;  	goto out;  } @@ -2853,31 +2855,6 @@ int is_subdir(struct dentry *new_dentry, struct dentry *old_dentry)  	return result;  } -int path_is_under(struct path *path1, struct path *path2) -{ -	struct vfsmount *mnt = path1->mnt; -	struct dentry *dentry = path1->dentry; -	int res; - -	br_read_lock(vfsmount_lock); -	if (mnt != path2->mnt) { -		for (;;) { -			if (mnt->mnt_parent == mnt) { -				br_read_unlock(vfsmount_lock); -				return 0; -			} -			if (mnt->mnt_parent == path2->mnt) -				break; -			mnt = mnt->mnt_parent; -		} -		dentry = mnt->mnt_mountpoint; -	} -	res = is_subdir(dentry, path2->dentry); -	br_read_unlock(vfsmount_lock); -	return res; -} -EXPORT_SYMBOL(path_is_under); -  void d_genocide(struct dentry *root)  {  	struct dentry *this_parent;  |