diff options
Diffstat (limited to 'fs/nfsd/vfs.c')
| -rw-r--r-- | fs/nfsd/vfs.c | 50 | 
1 files changed, 31 insertions, 19 deletions
diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c index d316e11923c5..fd6be35a1642 100644 --- a/fs/nfsd/vfs.c +++ b/fs/nfsd/vfs.c @@ -448,7 +448,7 @@ nfsd_setattr(struct svc_rqst *rqstp, struct svc_fh *fhp, struct iattr *iap,  			.ia_size	= iap->ia_size,  		}; -		host_err = notify_change(dentry, &size_attr, NULL); +		host_err = notify_change(&init_user_ns, dentry, &size_attr, NULL);  		if (host_err)  			goto out_unlock;  		iap->ia_valid &= ~ATTR_SIZE; @@ -463,7 +463,7 @@ nfsd_setattr(struct svc_rqst *rqstp, struct svc_fh *fhp, struct iattr *iap,  	}  	iap->ia_valid |= ATTR_CTIME; -	host_err = notify_change(dentry, iap, NULL); +	host_err = notify_change(&init_user_ns, dentry, iap, NULL);  out_unlock:  	fh_unlock(fhp); @@ -499,7 +499,8 @@ int nfsd4_is_junction(struct dentry *dentry)  		return 0;  	if (!(inode->i_mode & S_ISVTX))  		return 0; -	if (vfs_getxattr(dentry, NFSD_JUNCTION_XATTR_NAME, NULL, 0) <= 0) +	if (vfs_getxattr(&init_user_ns, dentry, NFSD_JUNCTION_XATTR_NAME, +			 NULL, 0) <= 0)  		return 0;  	return 1;  } @@ -1254,12 +1255,12 @@ nfsd_create_locked(struct svc_rqst *rqstp, struct svc_fh *fhp,  	host_err = 0;  	switch (type) {  	case S_IFREG: -		host_err = vfs_create(dirp, dchild, iap->ia_mode, true); +		host_err = vfs_create(&init_user_ns, dirp, dchild, iap->ia_mode, true);  		if (!host_err)  			nfsd_check_ignore_resizing(iap);  		break;  	case S_IFDIR: -		host_err = vfs_mkdir(dirp, dchild, iap->ia_mode); +		host_err = vfs_mkdir(&init_user_ns, dirp, dchild, iap->ia_mode);  		if (!host_err && unlikely(d_unhashed(dchild))) {  			struct dentry *d;  			d = lookup_one_len(dchild->d_name.name, @@ -1287,7 +1288,8 @@ nfsd_create_locked(struct svc_rqst *rqstp, struct svc_fh *fhp,  	case S_IFBLK:  	case S_IFIFO:  	case S_IFSOCK: -		host_err = vfs_mknod(dirp, dchild, iap->ia_mode, rdev); +		host_err = vfs_mknod(&init_user_ns, dirp, dchild, +				     iap->ia_mode, rdev);  		break;  	default:  		printk(KERN_WARNING "nfsd: bad file type %o in nfsd_create\n", @@ -1485,7 +1487,7 @@ do_nfsd_create(struct svc_rqst *rqstp, struct svc_fh *fhp,  	if (!IS_POSIXACL(dirp))  		iap->ia_mode &= ~current_umask(); -	host_err = vfs_create(dirp, dchild, iap->ia_mode, true); +	host_err = vfs_create(&init_user_ns, dirp, dchild, iap->ia_mode, true);  	if (host_err < 0) {  		fh_drop_write(fhp);  		goto out_nfserr; @@ -1609,7 +1611,7 @@ nfsd_symlink(struct svc_rqst *rqstp, struct svc_fh *fhp,  	if (IS_ERR(dnew))  		goto out_nfserr; -	host_err = vfs_symlink(d_inode(dentry), dnew, path); +	host_err = vfs_symlink(&init_user_ns, d_inode(dentry), dnew, path);  	err = nfserrno(host_err);  	if (!err)  		err = nfserrno(commit_metadata(fhp)); @@ -1677,7 +1679,7 @@ nfsd_link(struct svc_rqst *rqstp, struct svc_fh *ffhp,  	err = nfserr_noent;  	if (d_really_is_negative(dold))  		goto out_dput; -	host_err = vfs_link(dold, dirp, dnew, NULL); +	host_err = vfs_link(dold, &init_user_ns, dirp, dnew, NULL);  	if (!host_err) {  		err = nfserrno(commit_metadata(ffhp));  		if (!err) @@ -1797,7 +1799,15 @@ retry:  		close_cached = true;  		goto out_dput_old;  	} else { -		host_err = vfs_rename(fdir, odentry, tdir, ndentry, NULL, 0); +		struct renamedata rd = { +			.old_mnt_userns	= &init_user_ns, +			.old_dir	= fdir, +			.old_dentry	= odentry, +			.new_mnt_userns	= &init_user_ns, +			.new_dir	= tdir, +			.new_dentry	= ndentry, +		}; +		host_err = vfs_rename(&rd);  		if (!host_err) {  			host_err = commit_metadata(tfhp);  			if (!host_err) @@ -1884,9 +1894,9 @@ nfsd_unlink(struct svc_rqst *rqstp, struct svc_fh *fhp, int type,  	if (type != S_IFDIR) {  		if (rdentry->d_sb->s_export_op->flags & EXPORT_OP_CLOSE_BEFORE_UNLINK)  			nfsd_close_cached_files(rdentry); -		host_err = vfs_unlink(dirp, rdentry, NULL); +		host_err = vfs_unlink(&init_user_ns, dirp, rdentry, NULL);  	} else { -		host_err = vfs_rmdir(dirp, rdentry); +		host_err = vfs_rmdir(&init_user_ns, dirp, rdentry);  	}  	if (!host_err) @@ -2149,7 +2159,7 @@ nfsd_getxattr(struct svc_rqst *rqstp, struct svc_fh *fhp, char *name,  	inode_lock_shared(inode); -	len = vfs_getxattr(dentry, name, NULL, 0); +	len = vfs_getxattr(&init_user_ns, dentry, name, NULL, 0);  	/*  	 * Zero-length attribute, just return. @@ -2176,7 +2186,7 @@ nfsd_getxattr(struct svc_rqst *rqstp, struct svc_fh *fhp, char *name,  		goto out;  	} -	len = vfs_getxattr(dentry, name, buf, len); +	len = vfs_getxattr(&init_user_ns, dentry, name, buf, len);  	if (len <= 0) {  		kvfree(buf);  		buf = NULL; @@ -2283,7 +2293,8 @@ nfsd_removexattr(struct svc_rqst *rqstp, struct svc_fh *fhp, char *name)  	fh_lock(fhp); -	ret = __vfs_removexattr_locked(fhp->fh_dentry, name, NULL); +	ret = __vfs_removexattr_locked(&init_user_ns, fhp->fh_dentry, +				       name, NULL);  	fh_unlock(fhp);  	fh_drop_write(fhp); @@ -2307,8 +2318,8 @@ nfsd_setxattr(struct svc_rqst *rqstp, struct svc_fh *fhp, char *name,  		return nfserrno(ret);  	fh_lock(fhp); -	ret = __vfs_setxattr_locked(fhp->fh_dentry, name, buf, len, flags, -				    NULL); +	ret = __vfs_setxattr_locked(&init_user_ns, fhp->fh_dentry, name, buf, +				    len, flags, NULL);  	fh_unlock(fhp);  	fh_drop_write(fhp); @@ -2391,13 +2402,14 @@ nfsd_permission(struct svc_rqst *rqstp, struct svc_export *exp,  		return 0;  	/* This assumes  NFSD_MAY_{READ,WRITE,EXEC} == MAY_{READ,WRITE,EXEC} */ -	err = inode_permission(inode, acc & (MAY_READ|MAY_WRITE|MAY_EXEC)); +	err = inode_permission(&init_user_ns, inode, +			       acc & (MAY_READ | MAY_WRITE | MAY_EXEC));  	/* Allow read access to binaries even when mode 111 */  	if (err == -EACCES && S_ISREG(inode->i_mode) &&  	     (acc == (NFSD_MAY_READ | NFSD_MAY_OWNER_OVERRIDE) ||  	      acc == (NFSD_MAY_READ | NFSD_MAY_READ_IF_EXEC))) -		err = inode_permission(inode, MAY_EXEC); +		err = inode_permission(&init_user_ns, inode, MAY_EXEC);  	return err? nfserrno(err) : 0;  }  | 
