On Thu, Apr 26, 2018 at 07:20:26PM +0800, Eryu Guan wrote: > I hit ENOSPC error when creating new file in a newly created ext4 > with ea_inode feature enabled, if selinux is enabled and ext4 is > mounted without any selinux context. e.g. > > mkfs -t ext4 -O ea_inode -F /dev/sda5 > mount /dev/sda5 /mnt/ext4 > touch /mnt/ext4/testfile # got ENOSPC here > > It turns out that we run out of journal credits in > ext4_xattr_set_handle() when creating new selinux label for the > newly created inode. > > This is because that in __ext4_new_inode() we use > __ext4_xattr_set_credits() to calculate the reserved credits for new > xattr, with the 'is_create' argument being true, which implies less > credits in the ea_inode case. But we calculate the required credits > in ext4_xattr_set_handle() with 'is_create' being false, which means > we need more credits if ea_inode feature is enabled. So we don't > have enough credits and error out with ENOSPC. > > Fix it by simply calling ext4_xattr_set_handle() with XATTR_CREATE > flag in ext4_initxattrs(), so we end up with requiring less credits > than reserved. The semantic of XATTR_CREATE is "Perform a pure > create, which fails if the named attribute exists already." (from > setxattr(2)), which is fine in this case, because we only call > ext4_initxattrs() on newly created inode. > > Fixes: af65207c76ce ("ext4: fix __ext4_new_inode() journal credits calculation") > Cc: Tahsin Erdogan <tahsin@xxxxxxxxxx> > Signed-off-by: Eryu Guan <guaneryu@xxxxxxxxx> Thanks, applied. - Ted