Improve compile-time type checking for f2fs_report_zone()

Change the type of the third argument of f2fs_report_zone() from void *
into struct blk_zone * to enable type checking.

Signed-off-by: Bart Van Assche <bvanassche@acm.org>
Reviewed-by: Chao Yu <chao@kernel.org>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
This commit is contained in:
Bart Van Assche 2022-06-23 11:12:06 -07:00 committed by sunshenshen
parent a491213a0d
commit cdd66bafeb
2 changed files with 18 additions and 10 deletions

View File

@ -1560,9 +1560,11 @@ blk_zone_cond_str(struct blk_zone *blkz)
#endif #endif
struct blk_zone;
extern int f2fs_get_zoned_model(int); extern int f2fs_get_zoned_model(int);
extern int f2fs_get_zone_blocks(int); extern int f2fs_get_zone_blocks(int);
extern int f2fs_report_zone(int, uint64_t, void *); extern int f2fs_report_zone(int, uint64_t, struct blk_zone *);
typedef int (report_zones_cb_t)(int i, void *, 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_report_zones(int, report_zones_cb_t *, void *);
extern int f2fs_check_zones(int); extern int f2fs_check_zones(int);

View File

@ -202,21 +202,26 @@ int f2fs_get_zone_blocks(int i)
return 0; return 0;
} }
int f2fs_report_zone(int i, uint64_t sector, void *blkzone) int f2fs_report_zone(int i, uint64_t sector, struct blk_zone *blkzone)
{ {
struct blk_zone *blkz = (struct blk_zone *)blkzone; struct one_zone_report {
struct blk_zone_report *rep; struct blk_zone_report rep;
struct blk_zone zone;
} *rep;
int ret = -1; int ret = -1;
rep = calloc(1, sizeof(struct blk_zone_report) + static_assert(sizeof(*rep) == sizeof(rep->rep) + sizeof(rep->zone), "");
sizeof(struct blk_zone));
rep = calloc(1, sizeof(*rep));
if (!rep) { if (!rep) {
ERR_MSG("No memory for report zones\n"); ERR_MSG("No memory for report zones\n");
return -ENOMEM; return -ENOMEM;
} }
rep->sector = sector; rep->rep = (struct blk_zone_report){
rep->nr_zones = 1; .sector = sector,
.nr_zones = 1,
};
ret = ioctl(c.devices[i].fd, BLKREPORTZONE, rep); ret = ioctl(c.devices[i].fd, BLKREPORTZONE, rep);
if (ret != 0) { if (ret != 0) {
ret = -errno; ret = -errno;
@ -224,7 +229,7 @@ int f2fs_report_zone(int i, uint64_t sector, void *blkzone)
goto out; goto out;
} }
*blkz = *(struct blk_zone *)(rep + 1); *blkzone = rep->zone;
out: out:
free(rep); free(rep);
return ret; return ret;
@ -533,7 +538,8 @@ uint32_t f2fs_get_usable_segments(struct f2fs_super_block *sb)
#else #else
int f2fs_report_zone(int i, uint64_t UNUSED(sector), void *UNUSED(blkzone)) int f2fs_report_zone(int i, uint64_t UNUSED(sector),
struct blk_zone *UNUSED(blkzone))
{ {
ERR_MSG("%d: Unsupported zoned block device\n", i); ERR_MSG("%d: Unsupported zoned block device\n", i);
return -1; return -1;