On Thu 18-04-24 14:39:46, Ye Bin wrote: > There's a issue: > []$~/e2fsprogs/e2fsck/e2fsck -f scsi-disk2.img > e2fsck 1.47.0 (5-Feb-2023) > scsi-disk2.img: recovering journal > Clearing orphaned inode 12 (uid=0, gid=0, mode=0140777, size=0) > Pass 1: Checking inodes, blocks, and sizes > Extended attribute block 4247 has reference count 3, should be 2. Fix<y>? no > Pass 2: Checking directory structure > Pass 3: Checking directory connectivity > Pass 4: Checking reference counts > Pass 5: Checking group summary information > Free blocks count wrong (249189, counted=249188). > Fix<y>? no > Free inodes count wrong (65526, counted=65523). > Fix<y>? no > > scsi-disk2.img: ***** FILE SYSTEM WAS MODIFIED ***** > > scsi-disk2.img: ********** WARNING: Filesystem still has errors ********** > > scsi-disk2.img: 10/65536 files (0.0% non-contiguous), 12955/262144 blocks > > Above issue can reproduce as follows: > step1: socat UNIX-LISTEN:/home/test/mysocket.sock,mode=777,reuseaddr,fork EXEC:/home/test & > step2: setfacl some xattr for mysocket.sock > step3: cp -a /home/test/mysocket.sock /home/test/sock1 > cp -a /home/test/mysocket.sock /home/test/sock2 > step4: sync > step5: Power-off > step6: run e2fsck > > As after commit 42475e281d22 add ext2fs_inode_has_valid_blocks() judgement in > release_inode_blocks() which means socket type file skip realse block include > ACL block. The kernel does not restrict the setting of extended attributes for > socket files. So this will lead to ACL block leak. > To solve above issue there's need to release ACL block for other kind of > special file. > > Fixes: 42475e281d22 ("super.c (release_inode_blocks): Don't try to release the blocks if the orphaned inode is a device file, symlink, or some other kind of special file that doesn't have a block list.") > Signed-off-by: Ye Bin <yebin10@xxxxxxxxxx> Makes sense. Feel free to add: Reviewed-by: Jan Kara <jack@xxxxxxx> Honza > --- > e2fsck/super.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > diff --git a/e2fsck/super.c b/e2fsck/super.c > index be40dd8f..cefc2b07 100644 > --- a/e2fsck/super.c > +++ b/e2fsck/super.c > @@ -196,7 +196,7 @@ static int release_inode_blocks(e2fsck_t ctx, ext2_ino_t ino, > __u32 count; > > if (!ext2fs_inode_has_valid_blocks2(fs, EXT2_INODE(inode))) > - return 0; > + goto release_acl; > > pb.buf = block_buf + 3 * ctx->fs->blocksize; > pb.ctx = ctx; > @@ -235,7 +235,7 @@ static int release_inode_blocks(e2fsck_t ctx, ext2_ino_t ino, > if (pb.truncated_blocks) > ext2fs_iblk_sub_blocks(fs, EXT2_INODE(inode), > pb.truncated_blocks); > - > +release_acl: > blk = ext2fs_file_acl_block(fs, EXT2_INODE(inode)); > if (blk) { > retval = ext2fs_adjust_ea_refcount3(fs, blk, block_buf, -1, > -- > 2.31.1 > -- Jan Kara <jack@xxxxxxxx> SUSE Labs, CR