BTRFS: support NFSv2 export

The "fh_len" passed to ->fh_to_* is not guaranteed to be that same as
that returned by encode_fh - it may be larger.

With NFSv2, the filehandle is fixed length, so it may appear longer
than expected and be zero-padded.

So we must test that fh_len is at least some value, not exactly equal
to it.

Signed-off-by: NeilBrown <neilb@suse.de>
Acked-by: David Sterba <dsterba@suse.cz>
This commit is contained in:
NeilBrown 2015-05-08 10:16:23 +10:00 committed by Chris Mason
parent e5fffbac4a
commit 7d35199e15
1 changed files with 5 additions and 5 deletions

View File

@ -112,11 +112,11 @@ static struct dentry *btrfs_fh_to_parent(struct super_block *sb, struct fid *fh,
u32 generation; u32 generation;
if (fh_type == FILEID_BTRFS_WITH_PARENT) { if (fh_type == FILEID_BTRFS_WITH_PARENT) {
if (fh_len != BTRFS_FID_SIZE_CONNECTABLE) if (fh_len < BTRFS_FID_SIZE_CONNECTABLE)
return NULL; return NULL;
root_objectid = fid->root_objectid; root_objectid = fid->root_objectid;
} else if (fh_type == FILEID_BTRFS_WITH_PARENT_ROOT) { } else if (fh_type == FILEID_BTRFS_WITH_PARENT_ROOT) {
if (fh_len != BTRFS_FID_SIZE_CONNECTABLE_ROOT) if (fh_len < BTRFS_FID_SIZE_CONNECTABLE_ROOT)
return NULL; return NULL;
root_objectid = fid->parent_root_objectid; root_objectid = fid->parent_root_objectid;
} else } else
@ -136,11 +136,11 @@ static struct dentry *btrfs_fh_to_dentry(struct super_block *sb, struct fid *fh,
u32 generation; u32 generation;
if ((fh_type != FILEID_BTRFS_WITH_PARENT || if ((fh_type != FILEID_BTRFS_WITH_PARENT ||
fh_len != BTRFS_FID_SIZE_CONNECTABLE) && fh_len < BTRFS_FID_SIZE_CONNECTABLE) &&
(fh_type != FILEID_BTRFS_WITH_PARENT_ROOT || (fh_type != FILEID_BTRFS_WITH_PARENT_ROOT ||
fh_len != BTRFS_FID_SIZE_CONNECTABLE_ROOT) && fh_len < BTRFS_FID_SIZE_CONNECTABLE_ROOT) &&
(fh_type != FILEID_BTRFS_WITHOUT_PARENT || (fh_type != FILEID_BTRFS_WITHOUT_PARENT ||
fh_len != BTRFS_FID_SIZE_NON_CONNECTABLE)) fh_len < BTRFS_FID_SIZE_NON_CONNECTABLE))
return NULL; return NULL;
objectid = fid->objectid; objectid = fid->objectid;