diff options
Diffstat (limited to 'fs/nfs/inode.c')
| -rw-r--r-- | fs/nfs/inode.c | 43 | 
1 files changed, 27 insertions, 16 deletions
diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c index 2faae14d89f..1f941674b08 100644 --- a/fs/nfs/inode.c +++ b/fs/nfs/inode.c @@ -161,10 +161,12 @@ static void nfs_zap_caches_locked(struct inode *inode)  	nfsi->attrtimeo_timestamp = jiffies;  	memset(NFS_I(inode)->cookieverf, 0, sizeof(NFS_I(inode)->cookieverf)); -	if (S_ISREG(mode) || S_ISDIR(mode) || S_ISLNK(mode)) +	if (S_ISREG(mode) || S_ISDIR(mode) || S_ISLNK(mode)) {  		nfsi->cache_validity |= NFS_INO_INVALID_ATTR|NFS_INO_INVALID_DATA|NFS_INO_INVALID_ACCESS|NFS_INO_INVALID_ACL|NFS_INO_REVAL_PAGECACHE; -	else +		nfs_fscache_invalidate(inode); +	} else {  		nfsi->cache_validity |= NFS_INO_INVALID_ATTR|NFS_INO_INVALID_ACCESS|NFS_INO_INVALID_ACL|NFS_INO_REVAL_PAGECACHE; +	}  }  void nfs_zap_caches(struct inode *inode) @@ -179,6 +181,7 @@ void nfs_zap_mapping(struct inode *inode, struct address_space *mapping)  	if (mapping->nrpages != 0) {  		spin_lock(&inode->i_lock);  		NFS_I(inode)->cache_validity |= NFS_INO_INVALID_DATA; +		nfs_fscache_invalidate(inode);  		spin_unlock(&inode->i_lock);  	}  } @@ -234,6 +237,8 @@ nfs_find_actor(struct inode *inode, void *opaque)  	if (NFS_FILEID(inode) != fattr->fileid)  		return 0; +	if ((S_IFMT & inode->i_mode) != (S_IFMT & fattr->mode)) +		return 0;  	if (nfs_compare_fh(NFS_FH(inode), fh))  		return 0;  	if (is_bad_inode(inode) || NFS_STALE(inode)) @@ -329,8 +334,8 @@ nfs_fhget(struct super_block *sb, struct nfs_fh *fh, struct nfs_fattr *fattr)  		inode->i_version = 0;  		inode->i_size = 0;  		clear_nlink(inode); -		inode->i_uid = -2; -		inode->i_gid = -2; +		inode->i_uid = make_kuid(&init_user_ns, -2); +		inode->i_gid = make_kgid(&init_user_ns, -2);  		inode->i_blocks = 0;  		memset(nfsi->cookieverf, 0, sizeof(nfsi->cookieverf));  		nfsi->write_io = 0; @@ -691,10 +696,7 @@ static void __put_nfs_open_context(struct nfs_open_context *ctx, int is_sync)  	if (ctx->cred != NULL)  		put_rpccred(ctx->cred);  	dput(ctx->dentry); -	if (is_sync) -		nfs_sb_deactive(sb); -	else -		nfs_sb_deactive_async(sb); +	nfs_sb_deactive(sb);  	kfree(ctx->mdsthreshold);  	kfree(ctx);  } @@ -711,7 +713,7 @@ EXPORT_SYMBOL_GPL(put_nfs_open_context);   */  void nfs_file_set_open_context(struct file *filp, struct nfs_open_context *ctx)  { -	struct inode *inode = filp->f_path.dentry->d_inode; +	struct inode *inode = file_inode(filp);  	struct nfs_inode *nfsi = NFS_I(inode);  	filp->private_data = get_nfs_open_context(ctx); @@ -744,7 +746,7 @@ struct nfs_open_context *nfs_find_open_context(struct inode *inode, struct rpc_c  static void nfs_file_clear_open_context(struct file *filp)  { -	struct inode *inode = filp->f_path.dentry->d_inode; +	struct inode *inode = file_inode(filp);  	struct nfs_open_context *ctx = nfs_file_open_context(filp);  	if (ctx) { @@ -881,7 +883,7 @@ static int nfs_invalidate_mapping(struct inode *inode, struct address_space *map  		memset(nfsi->cookieverf, 0, sizeof(nfsi->cookieverf));  	spin_unlock(&inode->i_lock);  	nfs_inc_stats(inode, NFSIOS_DATAINVALIDATE); -	nfs_fscache_reset_inode_cookie(inode); +	nfs_fscache_wait_on_invalidate(inode);  	dfprintk(PAGECACHE, "NFS: (%s/%Ld) data cache invalidated\n",  			inode->i_sb->s_id, (long long)NFS_FILEID(inode));  	return 0; @@ -957,6 +959,10 @@ static unsigned long nfs_wcc_update_inode(struct inode *inode, struct nfs_fattr  		i_size_write(inode, nfs_size_to_loff_t(fattr->size));  		ret |= NFS_INO_INVALID_ATTR;  	} + +	if (nfsi->cache_validity & NFS_INO_INVALID_DATA) +		nfs_fscache_invalidate(inode); +  	return ret;  } @@ -1002,9 +1008,9 @@ static int nfs_check_inode_attributes(struct inode *inode, struct nfs_fattr *fat  	/* Have any file permissions changed? */  	if ((fattr->valid & NFS_ATTR_FATTR_MODE) && (inode->i_mode & S_IALLUGO) != (fattr->mode & S_IALLUGO))  		invalid |= NFS_INO_INVALID_ATTR | NFS_INO_INVALID_ACCESS | NFS_INO_INVALID_ACL; -	if ((fattr->valid & NFS_ATTR_FATTR_OWNER) && inode->i_uid != fattr->uid) +	if ((fattr->valid & NFS_ATTR_FATTR_OWNER) && !uid_eq(inode->i_uid, fattr->uid))  		invalid |= NFS_INO_INVALID_ATTR | NFS_INO_INVALID_ACCESS | NFS_INO_INVALID_ACL; -	if ((fattr->valid & NFS_ATTR_FATTR_GROUP) && inode->i_gid != fattr->gid) +	if ((fattr->valid & NFS_ATTR_FATTR_GROUP) && !gid_eq(inode->i_gid, fattr->gid))  		invalid |= NFS_INO_INVALID_ATTR | NFS_INO_INVALID_ACCESS | NFS_INO_INVALID_ACL;  	/* Has the link count changed? */ @@ -1205,8 +1211,10 @@ static int nfs_post_op_update_inode_locked(struct inode *inode, struct nfs_fattr  	struct nfs_inode *nfsi = NFS_I(inode);  	nfsi->cache_validity |= NFS_INO_INVALID_ATTR|NFS_INO_REVAL_PAGECACHE; -	if (S_ISDIR(inode->i_mode)) +	if (S_ISDIR(inode->i_mode)) {  		nfsi->cache_validity |= NFS_INO_INVALID_DATA; +		nfs_fscache_invalidate(inode); +	}  	if ((fattr->valid & NFS_ATTR_FATTR) == 0)  		return 0;  	return nfs_refresh_inode_locked(inode, fattr); @@ -1431,7 +1439,7 @@ static int nfs_update_inode(struct inode *inode, struct nfs_fattr *fattr)  				| NFS_INO_REVAL_FORCED);  	if (fattr->valid & NFS_ATTR_FATTR_OWNER) { -		if (inode->i_uid != fattr->uid) { +		if (!uid_eq(inode->i_uid, fattr->uid)) {  			invalid |= NFS_INO_INVALID_ATTR|NFS_INO_INVALID_ACCESS|NFS_INO_INVALID_ACL;  			inode->i_uid = fattr->uid;  		} @@ -1442,7 +1450,7 @@ static int nfs_update_inode(struct inode *inode, struct nfs_fattr *fattr)  				| NFS_INO_REVAL_FORCED);  	if (fattr->valid & NFS_ATTR_FATTR_GROUP) { -		if (inode->i_gid != fattr->gid) { +		if (!gid_eq(inode->i_gid, fattr->gid)) {  			invalid |= NFS_INO_INVALID_ATTR|NFS_INO_INVALID_ACCESS|NFS_INO_INVALID_ACL;  			inode->i_gid = fattr->gid;  		} @@ -1494,6 +1502,9 @@ static int nfs_update_inode(struct inode *inode, struct nfs_fattr *fattr)  			(save_cache_validity & NFS_INO_REVAL_FORCED))  		nfsi->cache_validity |= invalid; +	if (invalid & NFS_INO_INVALID_DATA) +		nfs_fscache_invalidate(inode); +  	return 0;   out_err:  	/*  |