mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-10 07:10:27 +00:00
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: Petr Vorel <pvorel@suse.cz> Signed-off-by: Jan Kara <jack@suse.cz> Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
This commit is contained in:
parent
bedd6fe4d3
commit
8bf771972b
@ -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;
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user