libf2fs_zoned: Introduce f2fs_report_zone() helper function

To prepare for write pointer consistency check by fsck, add
f2fs_report_zone() helper function which calls REPORT ZONE command to
get write pointer status of a single zone. The function is added to
lib/libf2fs_zoned which gathers zoned block device related functions.

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:
Shin'ichiro Kawasaki 2019-11-28 16:59:24 +09:00 committed by Jaegeuk Kim
parent 512b8426ac
commit 6d7c7b785f
2 changed files with 34 additions and 0 deletions

View File

@ -1299,6 +1299,7 @@ blk_zone_cond_str(struct blk_zone *blkz)
extern int f2fs_get_zoned_model(int);
extern int f2fs_get_zone_blocks(int);
extern int f2fs_report_zone(int, u_int64_t, void *);
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);

View File

@ -191,6 +191,33 @@ int f2fs_get_zone_blocks(int i)
return 0;
}
int f2fs_report_zone(int i, u_int64_t sector, void *blkzone)
{
struct blk_zone *blkz = (struct blk_zone *)blkzone;
struct blk_zone_report *rep;
int ret = -1;
rep = malloc(sizeof(struct blk_zone_report) + sizeof(struct blk_zone));
if (!rep) {
ERR_MSG("No memory for report zones\n");
return -ENOMEM;
}
rep->sector = sector;
rep->nr_zones = 1;
ret = ioctl(c.devices[i].fd, BLKREPORTZONE, rep);
if (ret != 0) {
ret = -errno;
ERR_MSG("ioctl BLKREPORTZONE failed: errno=%d\n", errno);
goto out;
}
*blkz = *(struct blk_zone *)(rep + 1);
out:
free(rep);
return ret;
}
#define F2FS_REPORT_ZONES_BUFSZ 524288
int f2fs_report_zones(int j, report_zones_cb_t *report_zones_cb, void *opaque)
@ -425,6 +452,12 @@ out:
#else
int f2fs_report_zone(int i, u_int64_t sector, void *blkzone)
{
ERR_MSG("%d: Unsupported zoned block device\n", i);
return -1;
}
int f2fs_report_zones(int i, report_zones_cb_t *report_zones_cb, void *opaque)
{
ERR_MSG("%d: Unsupported zoned block device\n", i);