Skip to content

Commit 15cb6f3

Browse files
committed
dm writecache: further writecache_map() cleanup
Factor out writecache_map_flush() and writecache_map_discard() from writecache_map(). Also eliminate the various goto labels in writecache_map(). Signed-off-by: Mike Snitzer <[email protected]>
1 parent 4d020b3 commit 15cb6f3

File tree

1 file changed

+43
-32
lines changed

1 file changed

+43
-32
lines changed

drivers/md/dm-writecache.c

Lines changed: 43 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1447,31 +1447,52 @@ static enum wc_map_op writecache_map_write(struct dm_writecache *wc, struct bio
14471447
return WC_MAP_SUBMIT;
14481448
}
14491449

1450+
static enum wc_map_op writecache_map_flush(struct dm_writecache *wc, struct bio *bio)
1451+
{
1452+
if (writecache_has_error(wc))
1453+
return WC_MAP_ERROR;
1454+
1455+
if (WC_MODE_PMEM(wc)) {
1456+
writecache_flush(wc);
1457+
if (writecache_has_error(wc))
1458+
return WC_MAP_ERROR;
1459+
else if (unlikely(wc->cleaner) || unlikely(wc->metadata_only))
1460+
return WC_MAP_REMAP_ORIGIN;
1461+
return WC_MAP_SUBMIT;
1462+
}
1463+
/* SSD: */
1464+
if (dm_bio_get_target_bio_nr(bio))
1465+
return WC_MAP_REMAP_ORIGIN;
1466+
writecache_offload_bio(wc, bio);
1467+
return WC_MAP_RETURN;
1468+
}
1469+
1470+
static enum wc_map_op writecache_map_discard(struct dm_writecache *wc, struct bio *bio)
1471+
{
1472+
if (writecache_has_error(wc))
1473+
return WC_MAP_ERROR;
1474+
1475+
if (WC_MODE_PMEM(wc)) {
1476+
writecache_discard(wc, bio->bi_iter.bi_sector, bio_end_sector(bio));
1477+
return WC_MAP_REMAP_ORIGIN;
1478+
}
1479+
/* SSD: */
1480+
writecache_offload_bio(wc, bio);
1481+
return WC_MAP_RETURN;
1482+
}
1483+
14501484
static int writecache_map(struct dm_target *ti, struct bio *bio)
14511485
{
14521486
struct dm_writecache *wc = ti->private;
1453-
enum wc_map_op map_op = WC_MAP_ERROR;
1487+
enum wc_map_op map_op;
14541488

14551489
bio->bi_private = NULL;
14561490

14571491
wc_lock(wc);
14581492

14591493
if (unlikely(bio->bi_opf & REQ_PREFLUSH)) {
1460-
if (writecache_has_error(wc))
1461-
goto unlock_error;
1462-
if (WC_MODE_PMEM(wc)) {
1463-
writecache_flush(wc);
1464-
if (writecache_has_error(wc))
1465-
goto unlock_error;
1466-
if (unlikely(wc->cleaner) || unlikely(wc->metadata_only))
1467-
goto unlock_remap_origin;
1468-
goto unlock_submit;
1469-
} else {
1470-
if (dm_bio_get_target_bio_nr(bio))
1471-
goto unlock_remap_origin;
1472-
writecache_offload_bio(wc, bio);
1473-
goto unlock_return;
1474-
}
1494+
map_op = writecache_map_flush(wc, bio);
1495+
goto done;
14751496
}
14761497

14771498
bio->bi_iter.bi_sector = dm_target_offset(ti, bio->bi_iter.bi_sector);
@@ -1481,29 +1502,22 @@ static int writecache_map(struct dm_target *ti, struct bio *bio)
14811502
DMERR("I/O is not aligned, sector %llu, size %u, block size %u",
14821503
(unsigned long long)bio->bi_iter.bi_sector,
14831504
bio->bi_iter.bi_size, wc->block_size);
1484-
goto unlock_error;
1505+
map_op = WC_MAP_ERROR;
1506+
goto done;
14851507
}
14861508

14871509
if (unlikely(bio_op(bio) == REQ_OP_DISCARD)) {
1488-
if (writecache_has_error(wc))
1489-
goto unlock_error;
1490-
if (WC_MODE_PMEM(wc)) {
1491-
writecache_discard(wc, bio->bi_iter.bi_sector, bio_end_sector(bio));
1492-
goto unlock_remap_origin;
1493-
} else {
1494-
writecache_offload_bio(wc, bio);
1495-
goto unlock_return;
1496-
}
1510+
map_op = writecache_map_discard(wc, bio);
1511+
goto done;
14971512
}
14981513

14991514
if (bio_data_dir(bio) == READ)
15001515
map_op = writecache_map_read(wc, bio);
15011516
else
15021517
map_op = writecache_map_write(wc, bio);
1503-
1518+
done:
15041519
switch (map_op) {
15051520
case WC_MAP_REMAP_ORIGIN:
1506-
unlock_remap_origin:
15071521
if (likely(wc->pause != 0)) {
15081522
if (bio_op(bio) == REQ_OP_WRITE) {
15091523
dm_iot_io_begin(&wc->iot, 1);
@@ -1515,26 +1529,23 @@ static int writecache_map(struct dm_target *ti, struct bio *bio)
15151529
return DM_MAPIO_REMAPPED;
15161530

15171531
case WC_MAP_REMAP:
1518-
unlock_remap:
15191532
/* make sure that writecache_end_io decrements bio_in_progress: */
15201533
bio->bi_private = (void *)1;
15211534
atomic_inc(&wc->bio_in_progress[bio_data_dir(bio)]);
15221535
wc_unlock(wc);
15231536
return DM_MAPIO_REMAPPED;
15241537

15251538
case WC_MAP_SUBMIT:
1526-
unlock_submit:
15271539
wc_unlock(wc);
15281540
bio_endio(bio);
15291541
return DM_MAPIO_SUBMITTED;
15301542

15311543
case WC_MAP_RETURN:
1532-
unlock_return:
15331544
wc_unlock(wc);
15341545
return DM_MAPIO_SUBMITTED;
15351546

15361547
case WC_MAP_ERROR:
1537-
unlock_error:
1548+
default:
15381549
wc_unlock(wc);
15391550
bio_io_error(bio);
15401551
return DM_MAPIO_SUBMITTED;

0 commit comments

Comments
 (0)