erofs-utils: lib: fix uncompressed packed inode
authorGao Xiang <hsiangkao@linux.alibaba.com>
Thu, 23 May 2024 02:55:50 +0000 (10:55 +0800)
committerGao Xiang <hsiangkao@linux.alibaba.com>
Tue, 4 Jun 2024 09:00:22 +0000 (17:00 +0800)
Currently, packed inode can also be used in the unencoded way
such as xattr prefixes.

Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Link: https://lore.kernel.org/r/20240523025550.2447091-1-hsiangkao@linux.alibaba.com
lib/inode.c

index cbe081024071e2b6641a5cf5bb503b0cbc317cc8..cd48e55556267ecc10ea64061f1af66dd7037dc3 100644 (file)
@@ -1710,24 +1710,24 @@ struct erofs_inode *erofs_mkfs_build_special_from_fd(int fd, const char *name)
                inode->nid = inode->sbi->packed_nid;
        }
 
-       ictx = erofs_begin_compressed_file(inode, fd, 0);
-       if (IS_ERR(ictx))
-               return ERR_CAST(ictx);
+       if (cfg.c_compr_opts[0].alg &&
+           erofs_file_is_compressible(inode)) {
+               ictx = erofs_begin_compressed_file(inode, fd, 0);
+               if (IS_ERR(ictx))
+                       return ERR_CAST(ictx);
+
+               DBG_BUGON(!ictx);
+               ret = erofs_write_compressed_file(ictx);
+               if (ret && ret != -ENOSPC)
+                        return ERR_PTR(ret);
 
-       DBG_BUGON(!ictx);
-       ret = erofs_write_compressed_file(ictx);
-       if (ret == -ENOSPC) {
                ret = lseek(fd, 0, SEEK_SET);
                if (ret < 0)
                        return ERR_PTR(-errno);
-
-               ret = write_uncompressed_file_from_fd(inode, fd);
        }
-
-       if (ret) {
-               DBG_BUGON(ret == -ENOSPC);
+       ret = write_uncompressed_file_from_fd(inode, fd);
+       if (ret)
                return ERR_PTR(ret);
-       }
        erofs_prepare_inode_buffer(inode);
        erofs_write_tail_end(inode);
        return inode;