summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMikulas Patocka <mpatocka@redhat.com>2019-08-23 09:55:26 -0400
committerMike Snitzer <snitzer@redhat.com>2019-08-23 10:13:12 -0400
commit123d87d553e26f67e7be318c97c971b6b5fb1daa (patch)
tree874e61dd6809114c3b5186c2d7e0fc25a43b3662
parent1cfd5d3399e87167b7f9157ef99daa0e959f395d (diff)
dm: make dm_table_find_target return NULL
Currently, if we pass too high sector number to dm_table_find_target, it returns zeroed dm_target structure and callers test if the structure is zeroed with the macro dm_target_is_valid. However, returning NULL is common practice to indicate errors. This patch refactors the dm code, so that dm_table_find_target returns NULL and its callers test the returned value for NULL. The macro dm_target_is_valid is deleted. In alloc_targets, we no longer allocate an extra zeroed target. Signed-off-by: Mikulas Patocka <mpatocka@redhat.com> Signed-off-by: Mike Snitzer <snitzer@redhat.com>
-rw-r--r--drivers/md/dm-ioctl.c2
-rw-r--r--drivers/md/dm-table.c8
-rw-r--r--drivers/md/dm.c8
-rw-r--r--drivers/md/dm.h5
4 files changed, 8 insertions, 15 deletions
diff --git a/drivers/md/dm-ioctl.c b/drivers/md/dm-ioctl.c
index 1e03bc89e20f..fb6f8fb1f13d 100644
--- a/drivers/md/dm-ioctl.c
+++ b/drivers/md/dm-ioctl.c
@@ -1592,7 +1592,7 @@ static int target_message(struct file *filp, struct dm_ioctl *param, size_t para
1592 } 1592 }
1593 1593
1594 ti = dm_table_find_target(table, tmsg->sector); 1594 ti = dm_table_find_target(table, tmsg->sector);
1595 if (!dm_target_is_valid(ti)) { 1595 if (!ti) {
1596 DMWARN("Target message sector outside device."); 1596 DMWARN("Target message sector outside device.");
1597 r = -EINVAL; 1597 r = -EINVAL;
1598 } else if (ti->type->message) 1598 } else if (ti->type->message)
diff --git a/drivers/md/dm-table.c b/drivers/md/dm-table.c
index 8820931ec7d2..52e049554f5c 100644
--- a/drivers/md/dm-table.c
+++ b/drivers/md/dm-table.c
@@ -163,10 +163,8 @@ static int alloc_targets(struct dm_table *t, unsigned int num)
163 163
164 /* 164 /*
165 * Allocate both the target array and offset array at once. 165 * Allocate both the target array and offset array at once.
166 * Append an empty entry to catch sectors beyond the end of
167 * the device.
168 */ 166 */
169 n_highs = (sector_t *) dm_vcalloc(num + 1, sizeof(struct dm_target) + 167 n_highs = (sector_t *) dm_vcalloc(num, sizeof(struct dm_target) +
170 sizeof(sector_t)); 168 sizeof(sector_t));
171 if (!n_highs) 169 if (!n_highs)
172 return -ENOMEM; 170 return -ENOMEM;
@@ -1359,7 +1357,7 @@ struct dm_target *dm_table_get_target(struct dm_table *t, unsigned int index)
1359/* 1357/*
1360 * Search the btree for the correct target. 1358 * Search the btree for the correct target.
1361 * 1359 *
1362 * Caller should check returned pointer with dm_target_is_valid() 1360 * Caller should check returned pointer for NULL
1363 * to trap I/O beyond end of device. 1361 * to trap I/O beyond end of device.
1364 */ 1362 */
1365struct dm_target *dm_table_find_target(struct dm_table *t, sector_t sector) 1363struct dm_target *dm_table_find_target(struct dm_table *t, sector_t sector)
@@ -1368,7 +1366,7 @@ struct dm_target *dm_table_find_target(struct dm_table *t, sector_t sector)
1368 sector_t *node; 1366 sector_t *node;
1369 1367
1370 if (unlikely(sector >= dm_table_get_size(t))) 1368 if (unlikely(sector >= dm_table_get_size(t)))
1371 return &t->targets[t->num_targets]; 1369 return NULL;
1372 1370
1373 for (l = 0; l < t->depth; l++) { 1371 for (l = 0; l < t->depth; l++) {
1374 n = get_child(n, k); 1372 n = get_child(n, k);
diff --git a/drivers/md/dm.c b/drivers/md/dm.c
index d0beef033e2f..1a5e328c443a 100644
--- a/drivers/md/dm.c
+++ b/drivers/md/dm.c
@@ -457,7 +457,7 @@ static int dm_blk_report_zones(struct gendisk *disk, sector_t sector,
457 return -EIO; 457 return -EIO;
458 458
459 tgt = dm_table_find_target(map, sector); 459 tgt = dm_table_find_target(map, sector);
460 if (!dm_target_is_valid(tgt)) { 460 if (!tgt) {
461 ret = -EIO; 461 ret = -EIO;
462 goto out; 462 goto out;
463 } 463 }
@@ -1072,7 +1072,7 @@ static struct dm_target *dm_dax_get_live_target(struct mapped_device *md,
1072 return NULL; 1072 return NULL;
1073 1073
1074 ti = dm_table_find_target(map, sector); 1074 ti = dm_table_find_target(map, sector);
1075 if (!dm_target_is_valid(ti)) 1075 if (!ti)
1076 return NULL; 1076 return NULL;
1077 1077
1078 return ti; 1078 return ti;
@@ -1572,7 +1572,7 @@ static int __split_and_process_non_flush(struct clone_info *ci)
1572 int r; 1572 int r;
1573 1573
1574 ti = dm_table_find_target(ci->map, ci->sector); 1574 ti = dm_table_find_target(ci->map, ci->sector);
1575 if (!dm_target_is_valid(ti)) 1575 if (!ti)
1576 return -EIO; 1576 return -EIO;
1577 1577
1578 if (__process_abnormal_io(ci, ti, &r)) 1578 if (__process_abnormal_io(ci, ti, &r))
@@ -1748,7 +1748,7 @@ static blk_qc_t dm_process_bio(struct mapped_device *md,
1748 1748
1749 if (!ti) { 1749 if (!ti) {
1750 ti = dm_table_find_target(map, bio->bi_iter.bi_sector); 1750 ti = dm_table_find_target(map, bio->bi_iter.bi_sector);
1751 if (unlikely(!ti || !dm_target_is_valid(ti))) { 1751 if (unlikely(!ti)) {
1752 bio_io_error(bio); 1752 bio_io_error(bio);
1753 return ret; 1753 return ret;
1754 } 1754 }
diff --git a/drivers/md/dm.h b/drivers/md/dm.h
index 0475673337f3..d7c4f6606b5f 100644
--- a/drivers/md/dm.h
+++ b/drivers/md/dm.h
@@ -86,11 +86,6 @@ struct target_type *dm_get_immutable_target_type(struct mapped_device *md);
86int dm_setup_md_queue(struct mapped_device *md, struct dm_table *t); 86int dm_setup_md_queue(struct mapped_device *md, struct dm_table *t);
87 87
88/* 88/*
89 * To check the return value from dm_table_find_target().
90 */
91#define dm_target_is_valid(t) ((t)->table)
92
93/*
94 * To check whether the target type is bio-based or not (request-based). 89 * To check whether the target type is bio-based or not (request-based).
95 */ 90 */
96#define dm_target_bio_based(t) ((t)->type->map != NULL) 91#define dm_target_bio_based(t) ((t)->type->map != NULL)