Commit 8bf77197 authored by Jan Kara's avatar Jan Kara Committed by Kent Overstreet
Browse files

bcachefs: Fix determining required file handle length



The ->encode_fh method is responsible for setting amount of space
required for storing the file handle if not enough space was provided.
bch2_encode_fh() was not setting required length in that case which
breaks e.g. fanotify. Fix it.

Reported-by: default avatarPetr Vorel <pvorel@suse.cz>
Signed-off-by: default avatarJan Kara <jack@suse.cz>
Signed-off-by: default avatarKent Overstreet <kent.overstreet@linux.dev>
parent bedd6fe4
Loading
Loading
Loading
Loading
+14 −5
Original line number Diff line number Diff line
@@ -1143,24 +1143,33 @@ static int bch2_encode_fh(struct inode *vinode, u32 *fh, int *len,
{
	struct bch_inode_info *inode	= to_bch_ei(vinode);
	struct bch_inode_info *dir	= to_bch_ei(vdir);

	if (*len < sizeof(struct bcachefs_fid_with_parent) / sizeof(u32))
		return FILEID_INVALID;
	int min_len;

	if (!S_ISDIR(inode->v.i_mode) && dir) {
		struct bcachefs_fid_with_parent *fid = (void *) fh;

		min_len = sizeof(*fid) / sizeof(u32);
		if (*len < min_len) {
			*len = min_len;
			return FILEID_INVALID;
		}

		fid->fid = bch2_inode_to_fid(inode);
		fid->dir = bch2_inode_to_fid(dir);

		*len = sizeof(*fid) / sizeof(u32);
		*len = min_len;
		return FILEID_BCACHEFS_WITH_PARENT;
	} else {
		struct bcachefs_fid *fid = (void *) fh;

		min_len = sizeof(*fid) / sizeof(u32);
		if (*len < min_len) {
			*len = min_len;
			return FILEID_INVALID;
		}
		*fid = bch2_inode_to_fid(inode);

		*len = sizeof(*fid) / sizeof(u32);
		*len = min_len;
		return FILEID_BCACHEFS_WITHOUT_PARENT;
	}
}