diff options
author | Damien Le Moal <damien.lemoal@wdc.com> | 2019-07-01 01:09:16 -0400 |
---|---|---|
committer | Jens Axboe <axboe@kernel.dk> | 2019-07-11 22:04:37 -0400 |
commit | bd976e52725965ddcceb9abecbcc7ca46863665c (patch) | |
tree | 920d0b976f212f1a4af42c67f271ff8c18406589 /drivers | |
parent | b4c5875d36178e8df409bdce232f270cac89fafe (diff) |
block: Kill gfp_t argument of blkdev_report_zones()
Only GFP_KERNEL and GFP_NOIO are used with blkdev_report_zones(). In
preparation of using vmalloc() for large report buffer and zone array
allocations used by this function, remove its "gfp_t gfp_mask" argument
and rely on the caller context to use memalloc_noio_save/restore() where
necessary (block layer zone revalidation and dm-zoned I/O error path).
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Martin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: Damien Le Moal <damien.lemoal@wdc.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/block/null_blk.h | 3 | ||||
-rw-r--r-- | drivers/block/null_blk_zoned.c | 3 | ||||
-rw-r--r-- | drivers/md/dm-flakey.c | 5 | ||||
-rw-r--r-- | drivers/md/dm-linear.c | 5 | ||||
-rw-r--r-- | drivers/md/dm-zoned-metadata.c | 16 | ||||
-rw-r--r-- | drivers/md/dm.c | 6 | ||||
-rw-r--r-- | drivers/scsi/sd.h | 3 | ||||
-rw-r--r-- | drivers/scsi/sd_zbc.c | 6 |
8 files changed, 23 insertions, 24 deletions
diff --git a/drivers/block/null_blk.h b/drivers/block/null_blk.h index 34b22d6523ba..4b9bbe3bb5a1 100644 --- a/drivers/block/null_blk.h +++ b/drivers/block/null_blk.h | |||
@@ -89,8 +89,7 @@ struct nullb { | |||
89 | int null_zone_init(struct nullb_device *dev); | 89 | int null_zone_init(struct nullb_device *dev); |
90 | void null_zone_exit(struct nullb_device *dev); | 90 | void null_zone_exit(struct nullb_device *dev); |
91 | int null_zone_report(struct gendisk *disk, sector_t sector, | 91 | int null_zone_report(struct gendisk *disk, sector_t sector, |
92 | struct blk_zone *zones, unsigned int *nr_zones, | 92 | struct blk_zone *zones, unsigned int *nr_zones); |
93 | gfp_t gfp_mask); | ||
94 | void null_zone_write(struct nullb_cmd *cmd, sector_t sector, | 93 | void null_zone_write(struct nullb_cmd *cmd, sector_t sector, |
95 | unsigned int nr_sectors); | 94 | unsigned int nr_sectors); |
96 | void null_zone_reset(struct nullb_cmd *cmd, sector_t sector); | 95 | void null_zone_reset(struct nullb_cmd *cmd, sector_t sector); |
diff --git a/drivers/block/null_blk_zoned.c b/drivers/block/null_blk_zoned.c index fca0c97ff1aa..cb28d93f2bd1 100644 --- a/drivers/block/null_blk_zoned.c +++ b/drivers/block/null_blk_zoned.c | |||
@@ -67,8 +67,7 @@ void null_zone_exit(struct nullb_device *dev) | |||
67 | } | 67 | } |
68 | 68 | ||
69 | int null_zone_report(struct gendisk *disk, sector_t sector, | 69 | int null_zone_report(struct gendisk *disk, sector_t sector, |
70 | struct blk_zone *zones, unsigned int *nr_zones, | 70 | struct blk_zone *zones, unsigned int *nr_zones) |
71 | gfp_t gfp_mask) | ||
72 | { | 71 | { |
73 | struct nullb *nullb = disk->private_data; | 72 | struct nullb *nullb = disk->private_data; |
74 | struct nullb_device *dev = nullb->dev; | 73 | struct nullb_device *dev = nullb->dev; |
diff --git a/drivers/md/dm-flakey.c b/drivers/md/dm-flakey.c index a9bc518156f2..2900fbde89b3 100644 --- a/drivers/md/dm-flakey.c +++ b/drivers/md/dm-flakey.c | |||
@@ -461,15 +461,14 @@ static int flakey_prepare_ioctl(struct dm_target *ti, struct block_device **bdev | |||
461 | 461 | ||
462 | #ifdef CONFIG_BLK_DEV_ZONED | 462 | #ifdef CONFIG_BLK_DEV_ZONED |
463 | static int flakey_report_zones(struct dm_target *ti, sector_t sector, | 463 | static int flakey_report_zones(struct dm_target *ti, sector_t sector, |
464 | struct blk_zone *zones, unsigned int *nr_zones, | 464 | struct blk_zone *zones, unsigned int *nr_zones) |
465 | gfp_t gfp_mask) | ||
466 | { | 465 | { |
467 | struct flakey_c *fc = ti->private; | 466 | struct flakey_c *fc = ti->private; |
468 | int ret; | 467 | int ret; |
469 | 468 | ||
470 | /* Do report and remap it */ | 469 | /* Do report and remap it */ |
471 | ret = blkdev_report_zones(fc->dev->bdev, flakey_map_sector(ti, sector), | 470 | ret = blkdev_report_zones(fc->dev->bdev, flakey_map_sector(ti, sector), |
472 | zones, nr_zones, gfp_mask); | 471 | zones, nr_zones); |
473 | if (ret != 0) | 472 | if (ret != 0) |
474 | return ret; | 473 | return ret; |
475 | 474 | ||
diff --git a/drivers/md/dm-linear.c b/drivers/md/dm-linear.c index ad980a38fb1e..ecefe6703736 100644 --- a/drivers/md/dm-linear.c +++ b/drivers/md/dm-linear.c | |||
@@ -137,15 +137,14 @@ static int linear_prepare_ioctl(struct dm_target *ti, struct block_device **bdev | |||
137 | 137 | ||
138 | #ifdef CONFIG_BLK_DEV_ZONED | 138 | #ifdef CONFIG_BLK_DEV_ZONED |
139 | static int linear_report_zones(struct dm_target *ti, sector_t sector, | 139 | static int linear_report_zones(struct dm_target *ti, sector_t sector, |
140 | struct blk_zone *zones, unsigned int *nr_zones, | 140 | struct blk_zone *zones, unsigned int *nr_zones) |
141 | gfp_t gfp_mask) | ||
142 | { | 141 | { |
143 | struct linear_c *lc = (struct linear_c *) ti->private; | 142 | struct linear_c *lc = (struct linear_c *) ti->private; |
144 | int ret; | 143 | int ret; |
145 | 144 | ||
146 | /* Do report and remap it */ | 145 | /* Do report and remap it */ |
147 | ret = blkdev_report_zones(lc->dev->bdev, linear_map_sector(ti, sector), | 146 | ret = blkdev_report_zones(lc->dev->bdev, linear_map_sector(ti, sector), |
148 | zones, nr_zones, gfp_mask); | 147 | zones, nr_zones); |
149 | if (ret != 0) | 148 | if (ret != 0) |
150 | return ret; | 149 | return ret; |
151 | 150 | ||
diff --git a/drivers/md/dm-zoned-metadata.c b/drivers/md/dm-zoned-metadata.c index d8334cd45d7c..9faf3e49c7af 100644 --- a/drivers/md/dm-zoned-metadata.c +++ b/drivers/md/dm-zoned-metadata.c | |||
@@ -8,6 +8,7 @@ | |||
8 | 8 | ||
9 | #include <linux/module.h> | 9 | #include <linux/module.h> |
10 | #include <linux/crc32.h> | 10 | #include <linux/crc32.h> |
11 | #include <linux/sched/mm.h> | ||
11 | 12 | ||
12 | #define DM_MSG_PREFIX "zoned metadata" | 13 | #define DM_MSG_PREFIX "zoned metadata" |
13 | 14 | ||
@@ -1162,8 +1163,7 @@ static int dmz_init_zones(struct dmz_metadata *zmd) | |||
1162 | while (sector < dev->capacity) { | 1163 | while (sector < dev->capacity) { |
1163 | /* Get zone information */ | 1164 | /* Get zone information */ |
1164 | nr_blkz = DMZ_REPORT_NR_ZONES; | 1165 | nr_blkz = DMZ_REPORT_NR_ZONES; |
1165 | ret = blkdev_report_zones(dev->bdev, sector, blkz, | 1166 | ret = blkdev_report_zones(dev->bdev, sector, blkz, &nr_blkz); |
1166 | &nr_blkz, GFP_KERNEL); | ||
1167 | if (ret) { | 1167 | if (ret) { |
1168 | dmz_dev_err(dev, "Report zones failed %d", ret); | 1168 | dmz_dev_err(dev, "Report zones failed %d", ret); |
1169 | goto out; | 1169 | goto out; |
@@ -1201,12 +1201,20 @@ out: | |||
1201 | static int dmz_update_zone(struct dmz_metadata *zmd, struct dm_zone *zone) | 1201 | static int dmz_update_zone(struct dmz_metadata *zmd, struct dm_zone *zone) |
1202 | { | 1202 | { |
1203 | unsigned int nr_blkz = 1; | 1203 | unsigned int nr_blkz = 1; |
1204 | unsigned int noio_flag; | ||
1204 | struct blk_zone blkz; | 1205 | struct blk_zone blkz; |
1205 | int ret; | 1206 | int ret; |
1206 | 1207 | ||
1207 | /* Get zone information from disk */ | 1208 | /* |
1209 | * Get zone information from disk. Since blkdev_report_zones() uses | ||
1210 | * GFP_KERNEL by default for memory allocations, set the per-task | ||
1211 | * PF_MEMALLOC_NOIO flag so that all allocations are done as if | ||
1212 | * GFP_NOIO was specified. | ||
1213 | */ | ||
1214 | noio_flag = memalloc_noio_save(); | ||
1208 | ret = blkdev_report_zones(zmd->dev->bdev, dmz_start_sect(zmd, zone), | 1215 | ret = blkdev_report_zones(zmd->dev->bdev, dmz_start_sect(zmd, zone), |
1209 | &blkz, &nr_blkz, GFP_NOIO); | 1216 | &blkz, &nr_blkz); |
1217 | memalloc_noio_restore(noio_flag); | ||
1210 | if (!nr_blkz) | 1218 | if (!nr_blkz) |
1211 | ret = -EIO; | 1219 | ret = -EIO; |
1212 | if (ret) { | 1220 | if (ret) { |
diff --git a/drivers/md/dm.c b/drivers/md/dm.c index 5475081dcbd6..61f1152b74e9 100644 --- a/drivers/md/dm.c +++ b/drivers/md/dm.c | |||
@@ -441,8 +441,7 @@ static int dm_blk_getgeo(struct block_device *bdev, struct hd_geometry *geo) | |||
441 | } | 441 | } |
442 | 442 | ||
443 | static int dm_blk_report_zones(struct gendisk *disk, sector_t sector, | 443 | static int dm_blk_report_zones(struct gendisk *disk, sector_t sector, |
444 | struct blk_zone *zones, unsigned int *nr_zones, | 444 | struct blk_zone *zones, unsigned int *nr_zones) |
445 | gfp_t gfp_mask) | ||
446 | { | 445 | { |
447 | #ifdef CONFIG_BLK_DEV_ZONED | 446 | #ifdef CONFIG_BLK_DEV_ZONED |
448 | struct mapped_device *md = disk->private_data; | 447 | struct mapped_device *md = disk->private_data; |
@@ -480,8 +479,7 @@ static int dm_blk_report_zones(struct gendisk *disk, sector_t sector, | |||
480 | * So there is no need to loop here trying to fill the entire array | 479 | * So there is no need to loop here trying to fill the entire array |
481 | * of zones. | 480 | * of zones. |
482 | */ | 481 | */ |
483 | ret = tgt->type->report_zones(tgt, sector, zones, | 482 | ret = tgt->type->report_zones(tgt, sector, zones, nr_zones); |
484 | nr_zones, gfp_mask); | ||
485 | 483 | ||
486 | out: | 484 | out: |
487 | dm_put_live_table(md, srcu_idx); | 485 | dm_put_live_table(md, srcu_idx); |
diff --git a/drivers/scsi/sd.h b/drivers/scsi/sd.h index 5796ace76225..38c50946fc42 100644 --- a/drivers/scsi/sd.h +++ b/drivers/scsi/sd.h | |||
@@ -213,8 +213,7 @@ extern blk_status_t sd_zbc_setup_reset_cmnd(struct scsi_cmnd *cmd); | |||
213 | extern void sd_zbc_complete(struct scsi_cmnd *cmd, unsigned int good_bytes, | 213 | extern void sd_zbc_complete(struct scsi_cmnd *cmd, unsigned int good_bytes, |
214 | struct scsi_sense_hdr *sshdr); | 214 | struct scsi_sense_hdr *sshdr); |
215 | extern int sd_zbc_report_zones(struct gendisk *disk, sector_t sector, | 215 | extern int sd_zbc_report_zones(struct gendisk *disk, sector_t sector, |
216 | struct blk_zone *zones, unsigned int *nr_zones, | 216 | struct blk_zone *zones, unsigned int *nr_zones); |
217 | gfp_t gfp_mask); | ||
218 | 217 | ||
219 | #else /* CONFIG_BLK_DEV_ZONED */ | 218 | #else /* CONFIG_BLK_DEV_ZONED */ |
220 | 219 | ||
diff --git a/drivers/scsi/sd_zbc.c b/drivers/scsi/sd_zbc.c index 7334024b64f1..ec3764c8f3f1 100644 --- a/drivers/scsi/sd_zbc.c +++ b/drivers/scsi/sd_zbc.c | |||
@@ -109,13 +109,11 @@ static int sd_zbc_do_report_zones(struct scsi_disk *sdkp, unsigned char *buf, | |||
109 | * @sector: Start 512B sector of the report | 109 | * @sector: Start 512B sector of the report |
110 | * @zones: Array of zone descriptors | 110 | * @zones: Array of zone descriptors |
111 | * @nr_zones: Number of descriptors in the array | 111 | * @nr_zones: Number of descriptors in the array |
112 | * @gfp_mask: Memory allocation mask | ||
113 | * | 112 | * |
114 | * Execute a report zones command on the target disk. | 113 | * Execute a report zones command on the target disk. |
115 | */ | 114 | */ |
116 | int sd_zbc_report_zones(struct gendisk *disk, sector_t sector, | 115 | int sd_zbc_report_zones(struct gendisk *disk, sector_t sector, |
117 | struct blk_zone *zones, unsigned int *nr_zones, | 116 | struct blk_zone *zones, unsigned int *nr_zones) |
118 | gfp_t gfp_mask) | ||
119 | { | 117 | { |
120 | struct scsi_disk *sdkp = scsi_disk(disk); | 118 | struct scsi_disk *sdkp = scsi_disk(disk); |
121 | unsigned int i, buflen, nrz = *nr_zones; | 119 | unsigned int i, buflen, nrz = *nr_zones; |
@@ -134,7 +132,7 @@ int sd_zbc_report_zones(struct gendisk *disk, sector_t sector, | |||
134 | */ | 132 | */ |
135 | buflen = min(queue_max_hw_sectors(disk->queue) << 9, | 133 | buflen = min(queue_max_hw_sectors(disk->queue) << 9, |
136 | roundup((nrz + 1) * 64, 512)); | 134 | roundup((nrz + 1) * 64, 512)); |
137 | buf = kmalloc(buflen, gfp_mask); | 135 | buf = kmalloc(buflen, GFP_KERNEL); |
138 | if (!buf) | 136 | if (!buf) |
139 | return -ENOMEM; | 137 | return -ENOMEM; |
140 | 138 | ||