mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/jaegeuk/f2fs-tools.git
synced 2024-11-23 17:53:39 +08:00
libf2fs_zoned: Introduce f2fs_report_zones() helper function
To prepare for write pointer consistency check by fsck, add f2fs_report_zones() helper function which calls REPORT ZONE command to get write pointer status. The function is added to lib/libf2fs_zoned which gathers zoned block device related functions. To check write pointer consistency with f2fs meta data, fsck needs to refer both of reported zone information and f2fs super block structure "f2fs_sb_info". However, libf2fs_zoned does not import f2fs_sb_info. To keep f2fs_sb_info structure out of libf2fs_zoned, provide a callback function in fsck to f2fs_report_zones() and call it for each zone. Add SECTOR_SHIFT definition in include/f2fs_fs.h to avoid a magic number to convert bytes into 512B sectors. Signed-off-by: Shin'ichiro Kawasaki <shinichiro.kawasaki@wdc.com> Reviewed-by: Chao Yu <yuchao0@huawei.com> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
This commit is contained in:
parent
05fee40110
commit
512b8426ac
@ -279,6 +279,9 @@ static inline uint64_t bswap_64(uint64_t val)
|
||||
#endif
|
||||
#define PAGE_CACHE_SIZE 4096
|
||||
#define BITS_PER_BYTE 8
|
||||
#ifndef SECTOR_SHIFT
|
||||
#define SECTOR_SHIFT 9
|
||||
#endif
|
||||
#define F2FS_SUPER_MAGIC 0xF2F52010 /* F2FS Magic Number */
|
||||
#define CP_CHKSUM_OFFSET 4092
|
||||
#define SB_CHKSUM_OFFSET 3068
|
||||
@ -1296,6 +1299,8 @@ blk_zone_cond_str(struct blk_zone *blkz)
|
||||
|
||||
extern int f2fs_get_zoned_model(int);
|
||||
extern int f2fs_get_zone_blocks(int);
|
||||
typedef int (report_zones_cb_t)(int i, void *, void *);
|
||||
extern int f2fs_report_zones(int, report_zones_cb_t *, void *);
|
||||
extern int f2fs_check_zones(int);
|
||||
extern int f2fs_reset_zones(int);
|
||||
|
||||
|
@ -193,6 +193,59 @@ int f2fs_get_zone_blocks(int i)
|
||||
|
||||
#define F2FS_REPORT_ZONES_BUFSZ 524288
|
||||
|
||||
int f2fs_report_zones(int j, report_zones_cb_t *report_zones_cb, void *opaque)
|
||||
{
|
||||
struct device_info *dev = c.devices + j;
|
||||
struct blk_zone_report *rep;
|
||||
struct blk_zone *blkz;
|
||||
unsigned int i, n = 0;
|
||||
u_int64_t total_sectors = (dev->total_sectors * c.sector_size)
|
||||
>> SECTOR_SHIFT;
|
||||
u_int64_t sector = 0;
|
||||
int ret = -1;
|
||||
|
||||
rep = malloc(F2FS_REPORT_ZONES_BUFSZ);
|
||||
if (!rep) {
|
||||
ERR_MSG("No memory for report zones\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
while (sector < total_sectors) {
|
||||
|
||||
/* Get zone info */
|
||||
rep->sector = sector;
|
||||
rep->nr_zones = (F2FS_REPORT_ZONES_BUFSZ - sizeof(struct blk_zone_report))
|
||||
/ sizeof(struct blk_zone);
|
||||
|
||||
ret = ioctl(dev->fd, BLKREPORTZONE, rep);
|
||||
if (ret != 0) {
|
||||
ret = -errno;
|
||||
ERR_MSG("ioctl BLKREPORTZONE failed: errno=%d\n",
|
||||
errno);
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (!rep->nr_zones) {
|
||||
ret = -EIO;
|
||||
ERR_MSG("Unexpected ioctl BLKREPORTZONE result\n");
|
||||
goto out;
|
||||
}
|
||||
|
||||
blkz = (struct blk_zone *)(rep + 1);
|
||||
for (i = 0; i < rep->nr_zones; i++) {
|
||||
ret = report_zones_cb(n, blkz, opaque);
|
||||
if (ret)
|
||||
goto out;
|
||||
sector = blk_zone_sector(blkz) + blk_zone_length(blkz);
|
||||
n++;
|
||||
blkz++;
|
||||
}
|
||||
}
|
||||
out:
|
||||
free(rep);
|
||||
return ret;
|
||||
}
|
||||
|
||||
int f2fs_check_zones(int j)
|
||||
{
|
||||
struct device_info *dev = c.devices + j;
|
||||
@ -372,6 +425,12 @@ out:
|
||||
|
||||
#else
|
||||
|
||||
int f2fs_report_zones(int i, report_zones_cb_t *report_zones_cb, void *opaque)
|
||||
{
|
||||
ERR_MSG("%d: Unsupported zoned block device\n", i);
|
||||
return -1;
|
||||
}
|
||||
|
||||
int f2fs_get_zoned_model(int i)
|
||||
{
|
||||
struct device_info *dev = c.devices + i;
|
||||
|
Loading…
Reference in New Issue
Block a user