diff options
Diffstat (limited to 'fs/sysfs/dir.c')
| -rw-r--r-- | fs/sysfs/dir.c | 10 | 
1 files changed, 10 insertions, 0 deletions
diff --git a/fs/sysfs/dir.c b/fs/sysfs/dir.c index a5cf784f9cc..6b0bb00d4d2 100644 --- a/fs/sysfs/dir.c +++ b/fs/sysfs/dir.c @@ -307,6 +307,7 @@ static int sysfs_dentry_revalidate(struct dentry *dentry, unsigned int flags)  {  	struct sysfs_dirent *sd;  	int is_dir; +	int type;  	if (flags & LOOKUP_RCU)  		return -ECHILD; @@ -326,6 +327,15 @@ static int sysfs_dentry_revalidate(struct dentry *dentry, unsigned int flags)  	if (strcmp(dentry->d_name.name, sd->s_name) != 0)  		goto out_bad; +	/* The sysfs dirent has been moved to a different namespace */ +	type = KOBJ_NS_TYPE_NONE; +	if (sd->s_parent) { +		type = sysfs_ns_type(sd->s_parent); +		if (type != KOBJ_NS_TYPE_NONE && +				sysfs_info(dentry->d_sb)->ns[type] != sd->s_ns) +			goto out_bad; +	} +  	mutex_unlock(&sysfs_mutex);  out_valid:  	return 1;  |