mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	NFS: Return valid errors from nfs2/3_decode_dirent()
Valid return values for decode_dirent() callback functions are:
 0: Success
 -EBADCOOKIE: End of directory
 -EAGAIN: End of xdr_stream
All errors need to map into one of those three values.
Fixes: 573c4e1ef5 ("NFS: Simplify ->decode_dirent() calling sequence")
Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
			
			
This commit is contained in:
		
							parent
							
								
									b38e09b9b6
								
							
						
					
					
						commit
						64cfca85ba
					
				
					 2 changed files with 7 additions and 16 deletions
				
			
		| 
						 | 
				
			
			@ -949,7 +949,7 @@ int nfs2_decode_dirent(struct xdr_stream *xdr, struct nfs_entry *entry,
 | 
			
		|||
 | 
			
		||||
	error = decode_filename_inline(xdr, &entry->name, &entry->len);
 | 
			
		||||
	if (unlikely(error))
 | 
			
		||||
		return error;
 | 
			
		||||
		return -EAGAIN;
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * The type (size and byte order) of nfscookie isn't defined in
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1967,7 +1967,6 @@ int nfs3_decode_dirent(struct xdr_stream *xdr, struct nfs_entry *entry,
 | 
			
		|||
		       bool plus)
 | 
			
		||||
{
 | 
			
		||||
	struct user_namespace *userns = rpc_userns(entry->server->client);
 | 
			
		||||
	struct nfs_entry old = *entry;
 | 
			
		||||
	__be32 *p;
 | 
			
		||||
	int error;
 | 
			
		||||
	u64 new_cookie;
 | 
			
		||||
| 
						 | 
				
			
			@ -1987,15 +1986,15 @@ int nfs3_decode_dirent(struct xdr_stream *xdr, struct nfs_entry *entry,
 | 
			
		|||
 | 
			
		||||
	error = decode_fileid3(xdr, &entry->ino);
 | 
			
		||||
	if (unlikely(error))
 | 
			
		||||
		return error;
 | 
			
		||||
		return -EAGAIN;
 | 
			
		||||
 | 
			
		||||
	error = decode_inline_filename3(xdr, &entry->name, &entry->len);
 | 
			
		||||
	if (unlikely(error))
 | 
			
		||||
		return error;
 | 
			
		||||
		return -EAGAIN;
 | 
			
		||||
 | 
			
		||||
	error = decode_cookie3(xdr, &new_cookie);
 | 
			
		||||
	if (unlikely(error))
 | 
			
		||||
		return error;
 | 
			
		||||
		return -EAGAIN;
 | 
			
		||||
 | 
			
		||||
	entry->d_type = DT_UNKNOWN;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -2003,7 +2002,7 @@ int nfs3_decode_dirent(struct xdr_stream *xdr, struct nfs_entry *entry,
 | 
			
		|||
		entry->fattr->valid = 0;
 | 
			
		||||
		error = decode_post_op_attr(xdr, entry->fattr, userns);
 | 
			
		||||
		if (unlikely(error))
 | 
			
		||||
			return error;
 | 
			
		||||
			return -EAGAIN;
 | 
			
		||||
		if (entry->fattr->valid & NFS_ATTR_FATTR_V3)
 | 
			
		||||
			entry->d_type = nfs_umode_to_dtype(entry->fattr->mode);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -2018,11 +2017,8 @@ int nfs3_decode_dirent(struct xdr_stream *xdr, struct nfs_entry *entry,
 | 
			
		|||
			return -EAGAIN;
 | 
			
		||||
		if (*p != xdr_zero) {
 | 
			
		||||
			error = decode_nfs_fh3(xdr, entry->fh);
 | 
			
		||||
			if (unlikely(error)) {
 | 
			
		||||
				if (error == -E2BIG)
 | 
			
		||||
					goto out_truncated;
 | 
			
		||||
				return error;
 | 
			
		||||
			}
 | 
			
		||||
			if (unlikely(error))
 | 
			
		||||
				return -EAGAIN;
 | 
			
		||||
		} else
 | 
			
		||||
			zero_nfs_fh3(entry->fh);
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -2031,11 +2027,6 @@ int nfs3_decode_dirent(struct xdr_stream *xdr, struct nfs_entry *entry,
 | 
			
		|||
	entry->cookie = new_cookie;
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
 | 
			
		||||
out_truncated:
 | 
			
		||||
	dprintk("NFS: directory entry contains invalid file handle\n");
 | 
			
		||||
	*entry = old;
 | 
			
		||||
	return -EAGAIN;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue