Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

nfsd: fix return error code for nfsd_map_name_to_[ug]id

idmap lookups can time out while the cache is waiting for a userspace
upcall reply. In that case cache_check() returns -ETIMEDOUT to callers.

The nfsd_map_name_to_[ug]id functions currently proceed with attempting
to map the id to a kuid despite a potentially temporary failure to
perform the idmap lookup. This results in the code returning the error
NFSERR_BADOWNER which can cause client operations to return to userspace
with failure.

Fix this by returning the failure status before attempting kuid mapping.

This will return NFSERR_JUKEBOX on idmap lookup timeout so that clients
can retry the operation instead of aborting it.

Fixes: 65e10f6d0ab0 ("nfsd: Convert idmap to use kuids and kgids")
Cc: stable@vger.kernel.org
Signed-off-by: Anthony Iliopoulos <ailiop@suse.com>
Reviewed-by: NeilBrown <neil@brown.name>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>

authored by

Anthony Iliopoulos and committed by
Chuck Lever
404d7794 f9c206cd

+4
+4
fs/nfsd/nfs4idmap.c
··· 672 672 return nfserr_inval; 673 673 674 674 status = do_name_to_id(rqstp, IDMAP_TYPE_USER, name, namelen, &id); 675 + if (status) 676 + return status; 675 677 *uid = make_kuid(nfsd_user_namespace(rqstp), id); 676 678 if (!uid_valid(*uid)) 677 679 status = nfserr_badowner; ··· 709 707 return nfserr_inval; 710 708 711 709 status = do_name_to_id(rqstp, IDMAP_TYPE_GROUP, name, namelen, &id); 710 + if (status) 711 + return status; 712 712 *gid = make_kgid(nfsd_user_namespace(rqstp), id); 713 713 if (!gid_valid(*gid)) 714 714 status = nfserr_badowner;