knfsd: Validate filehandle type in fsid_source

fsid_source decided where to get the 'fsid' number to
return for a GETATTR based on the type of filehandle.
It can be from the device, from the fsid, or from the
UUID.

It is possible for the filehandle to be inconsistent
with the export information, so make sure the export information
actually has the info implied by the value returned by
fsid_source.

Signed-off-by: Neil Brown <neilb@suse.de>
Cc: "Luiz Fernando N. Capitulino" <lcapitulino@gmail.com>
Signed-off-by: "J. Bruce Fields" <bfields@citi.umich.edu>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

authored by Neil Brown and committed by Linus Torvalds b8da0d1c a1033be7

+15 -5
+15 -5
fs/nfsd/nfsfh.c
··· 566 566 case FSID_DEV: 567 567 case FSID_ENCODE_DEV: 568 568 case FSID_MAJOR_MINOR: 569 - return FSIDSOURCE_DEV; 569 + if (fhp->fh_export->ex_dentry->d_inode->i_sb->s_type->fs_flags 570 + & FS_REQUIRES_DEV) 571 + return FSIDSOURCE_DEV; 572 + break; 570 573 case FSID_NUM: 571 - return FSIDSOURCE_FSID; 572 - default: 573 574 if (fhp->fh_export->ex_flags & NFSEXP_FSID) 574 575 return FSIDSOURCE_FSID; 575 - else 576 - return FSIDSOURCE_UUID; 576 + break; 577 + default: 578 + break; 577 579 } 580 + /* either a UUID type filehandle, or the filehandle doesn't 581 + * match the export. 582 + */ 583 + if (fhp->fh_export->ex_flags & NFSEXP_FSID) 584 + return FSIDSOURCE_FSID; 585 + if (fhp->fh_export->ex_uuid) 586 + return FSIDSOURCE_UUID; 587 + return FSIDSOURCE_DEV; 578 588 }