diff options
Diffstat (limited to 'fs/nfs/inode.c')
| -rw-r--r-- | fs/nfs/inode.c | 26 | 
1 files changed, 15 insertions, 11 deletions
| diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c index 6acc73c80d7f..c1c7a9d78722 100644 --- a/fs/nfs/inode.c +++ b/fs/nfs/inode.c @@ -237,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)) @@ -332,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; @@ -559,20 +561,22 @@ static void nfs_init_lock_context(struct nfs_lock_context *l_ctx)  	l_ctx->lockowner.l_owner = current->files;  	l_ctx->lockowner.l_pid = current->tgid;  	INIT_LIST_HEAD(&l_ctx->list); +	nfs_iocounter_init(&l_ctx->io_count);  }  static struct nfs_lock_context *__nfs_find_lock_context(struct nfs_open_context *ctx)  { -	struct nfs_lock_context *pos; +	struct nfs_lock_context *head = &ctx->lock_context; +	struct nfs_lock_context *pos = head; -	list_for_each_entry(pos, &ctx->lock_context.list, list) { +	do {  		if (pos->lockowner.l_owner != current->files)  			continue;  		if (pos->lockowner.l_pid != current->tgid)  			continue;  		atomic_inc(&pos->count);  		return pos; -	} +	} while ((pos = list_entry(pos->list.next, typeof(*pos), list)) != head);  	return NULL;  } @@ -711,7 +715,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 +748,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) { @@ -1006,9 +1010,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? */ @@ -1437,7 +1441,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;  		} @@ -1448,7 +1452,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;  		} | 
