diff options
Diffstat (limited to 'fs/nfs/inode.c')
| -rw-r--r-- | fs/nfs/inode.c | 13 | 
1 files changed, 9 insertions, 4 deletions
| diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c index 4bffe637ea32..e4f0dcef8f54 100644 --- a/fs/nfs/inode.c +++ b/fs/nfs/inode.c @@ -352,8 +352,9 @@ nfs_fhget(struct super_block *sb, struct nfs_fh *fh, struct nfs_fattr *fattr, st  	nfs_attr_check_mountpoint(sb, fattr); -	if (((fattr->valid & NFS_ATTR_FATTR_FILEID) == 0) && -	    !nfs_attr_use_mounted_on_fileid(fattr)) +	if (nfs_attr_use_mounted_on_fileid(fattr)) +		fattr->fileid = fattr->mounted_on_fileid; +	else if ((fattr->valid & NFS_ATTR_FATTR_FILEID) == 0)  		goto out_no_inode;  	if ((fattr->valid & NFS_ATTR_FATTR_TYPE) == 0)  		goto out_no_inode; @@ -387,7 +388,6 @@ nfs_fhget(struct super_block *sb, struct nfs_fh *fh, struct nfs_fattr *fattr, st  		if (S_ISREG(inode->i_mode)) {  			inode->i_fop = NFS_SB(sb)->nfs_client->rpc_ops->file_ops;  			inode->i_data.a_ops = &nfs_file_aops; -			inode->i_data.backing_dev_info = &NFS_SB(sb)->backing_dev_info;  		} else if (S_ISDIR(inode->i_mode)) {  			inode->i_op = NFS_SB(sb)->nfs_client->rpc_ops->dir_inode_ops;  			inode->i_fop = &nfs_dir_operations; @@ -506,10 +506,15 @@ nfs_setattr(struct dentry *dentry, struct iattr *attr)  		attr->ia_valid &= ~ATTR_MODE;  	if (attr->ia_valid & ATTR_SIZE) { +		loff_t i_size; +  		BUG_ON(!S_ISREG(inode->i_mode)); -		if (attr->ia_size == i_size_read(inode)) +		i_size = i_size_read(inode); +		if (attr->ia_size == i_size)  			attr->ia_valid &= ~ATTR_SIZE; +		else if (attr->ia_size < i_size && IS_SWAPFILE(inode)) +			return -ETXTBSY;  	}  	/* Optimization: if the end result is no change, don't RPC */ |