ceph: fix directories inode i_blkbits initialization
authorLuis Henriques <lhenriques@suse.com>
Tue, 23 Jul 2019 15:50:20 +0000 (16:50 +0100)
committerIlya Dryomov <idryomov@gmail.com>
Mon, 16 Sep 2019 10:06:23 +0000 (12:06 +0200)
commit750670341a24cb714e624e0fd7da30900ad93752
tree0fa8e1ebe0b2d0a0a490939a1739b969d9f9f62b
parent4d856f72c10ecb060868ed10ff1b1453943fc6c8
ceph: fix directories inode i_blkbits initialization

When filling an inode with info from the MDS, i_blkbits is being
initialized using fl_stripe_unit, which contains the stripe unit in
bytes.  Unfortunately, this doesn't make sense for directories as they
have fl_stripe_unit set to '0'.  This means that i_blkbits will be set
to 0xff, causing an UBSAN undefined behaviour in i_blocksize():

  UBSAN: Undefined behaviour in ./include/linux/fs.h:731:12
  shift exponent 255 is too large for 32-bit type 'int'

Fix this by initializing i_blkbits to CEPH_BLOCK_SHIFT if fl_stripe_unit
is zero.

Signed-off-by: Luis Henriques <lhenriques@suse.com>
Reviewed-by: Jeff Layton <jlayton@kernel.org>
Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
fs/ceph/inode.c