Messages in this thread | | | Date | Thu, 12 May 2022 13:41:02 +0800 | From | Gao Xiang <> | Subject | Re: [PATCH] erofs: scan devices from device table |
| |
On Tue, May 10, 2022 at 05:35:11PM +0800, Jeffle Xu wrote: > When "-o device" mount option is not specified, scan the device table > and instantiate the devices if there's any in the device table. In this > case, the tag field of each device slot uniquely specifies a device. > > Signed-off-by: Jeffle Xu <jefflexu@linux.alibaba.com> > --- > fs/erofs/erofs_fs.h | 9 ++-- > fs/erofs/super.c | 102 ++++++++++++++++++++++++++++++-------------- > 2 files changed, 72 insertions(+), 39 deletions(-) > > diff --git a/fs/erofs/erofs_fs.h b/fs/erofs/erofs_fs.h > index 1238ca104f09..1adde3a813b4 100644 > --- a/fs/erofs/erofs_fs.h > +++ b/fs/erofs/erofs_fs.h > @@ -37,12 +37,9 @@ > #define EROFS_SB_EXTSLOT_SIZE 16 > > struct erofs_deviceslot { > - union { > - u8 uuid[16]; /* used for device manager later */ > - u8 userdata[64]; /* digest(sha256), etc. */ > - } u; > - __le32 blocks; /* total fs blocks of this device */ > - __le32 mapped_blkaddr; /* map starting at mapped_blkaddr */ > + u8 tag[64]; /* digest(sha256), etc. */ > + __le32 blocks; /* total fs blocks of this device */ > + __le32 mapped_blkaddr; /* map starting at mapped_blkaddr */ > u8 reserved[56]; > }; > #define EROFS_DEVT_SLOT_SIZE sizeof(struct erofs_deviceslot) > diff --git a/fs/erofs/super.c b/fs/erofs/super.c > index 4a623630e1c4..3f19c2031e69 100644 > --- a/fs/erofs/super.c > +++ b/fs/erofs/super.c > @@ -219,7 +219,52 @@ static int erofs_load_compr_cfgs(struct super_block *sb, > } > #endif > > -static int erofs_init_devices(struct super_block *sb, > +static int erofs_init_device(struct erofs_buf *buf, struct super_block *sb, > + struct erofs_device_info *dif, erofs_off_t *pos) > +{ > + struct erofs_sb_info *sbi = EROFS_SB(sb); > + struct erofs_deviceslot *dis; > + struct block_device *bdev; > + void *ptr; > + int ret; > + > + ptr = erofs_read_metabuf(buf, sb, erofs_blknr(*pos), EROFS_KMAP); > + if (IS_ERR(ptr)) > + return PTR_ERR(ptr); > + dis = ptr + erofs_blkoff(*pos); > + > + if (!dif->path) { > + if (!dis->tag[0]) { > + erofs_err(sb, "Empty digest data (pos %llu)", *pos);
erofs_err(sb, "empty tag @ pos %llu", *pos); ?
Otherwise it looks good to me, Reviewed-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Thanks, Gao Xiang
| |