erofs-utils: lib: keep erofs_init_devices in sync with kernel
authorJingbo Xu <jefflexu@linux.alibaba.com>
Wed, 23 Aug 2023 07:15:09 +0000 (15:15 +0800)
committerGao Xiang <hsiangkao@linux.alibaba.com>
Tue, 29 Aug 2023 00:51:42 +0000 (08:51 +0800)
Keep erofs_init_devices() in sync with kernel erofs_scan_devices()[1],
which scans the devtable (if any) automatically if sbi->extra_devices is
not explicitly specified.

Also fix the missing le32_to_cpu() when parsing the device slot.  Read
and cache the number of blocks of each device for later use.

[1] https://git.kernel.org/torvalds/c/ba73eadd23d1

Fixes: 0ce853a01123 ("erofs-utils: fuse: add multiple device support")
Signed-off-by: Jingbo Xu <jefflexu@linux.alibaba.com>
Reviewed-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Link: https://lore.kernel.org/r/20230823071517.12303-3-jefflexu@linux.alibaba.com
Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
lib/super.c

index 373354ab997b31fb4583ce3284fa380f68230ca1..ce97278b2365bbaa9f6327e12ed7016a850dd38e 100644 (file)
@@ -37,7 +37,8 @@ static int erofs_init_devices(struct erofs_sb_info *sbi,
        else
                ondisk_extradevs = le16_to_cpu(dsb->extra_devices);
 
-       if (ondisk_extradevs != sbi->extra_devices) {
+       if (sbi->extra_devices &&
+           ondisk_extradevs != sbi->extra_devices) {
                erofs_err("extra devices don't match (ondisk %u, given %u)",
                          ondisk_extradevs, sbi->extra_devices);
                return -EINVAL;
@@ -45,6 +46,7 @@ static int erofs_init_devices(struct erofs_sb_info *sbi,
        if (!ondisk_extradevs)
                return 0;
 
+       sbi->extra_devices = ondisk_extradevs;
        sbi->device_id_mask = roundup_pow_of_two(ondisk_extradevs + 1) - 1;
        sbi->devs = calloc(ondisk_extradevs, sizeof(*sbi->devs));
        if (!sbi->devs)
@@ -61,8 +63,9 @@ static int erofs_init_devices(struct erofs_sb_info *sbi,
                        return ret;
                }
 
-               sbi->devs[i].mapped_blkaddr = dis.mapped_blkaddr;
-               sbi->total_blocks += dis.blocks;
+               sbi->devs[i].mapped_blkaddr = le32_to_cpu(dis.mapped_blkaddr);
+               sbi->devs[i].blocks = le32_to_cpu(dis.blocks);
+               sbi->total_blocks += sbi->devs[i].blocks;
                pos += EROFS_DEVT_SLOT_SIZE;
        }
        return 0;