diff options
author | Dan Williams <dan.j.williams@intel.com> | 2017-05-29 22:02:52 +0200 |
---|---|---|
committer | Dan Williams <dan.j.williams@intel.com> | 2017-06-15 23:34:59 +0200 |
commit | abebfbe2f7315dd3ec9a0c69596a76e32beb5749 (patch) | |
tree | e0b8a531424d7625e19a82a9151fa64a0a30671b /drivers/md/dm.c | |
parent | dax, pmem: introduce an optional 'flush' dax_operation (diff) | |
download | linux-abebfbe2f7315dd3ec9a0c69596a76e32beb5749.tar.xz linux-abebfbe2f7315dd3ec9a0c69596a76e32beb5749.zip |
dm: add ->flush() dax operation support
Allow device-mapper to route flush operations to the
per-target implementation. In order for the device stacking to work we
need a dax_dev and a pgoff relative to that device. This gives each
layer of the stack the information it needs to look up the operation
pointer for the next level.
This conceptually allows for an array of mixed device drivers with
varying flush implementations.
Reviewed-by: Toshi Kani <toshi.kani@hpe.com>
Reviewed-by: Mike Snitzer <snitzer@redhat.com>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Diffstat (limited to 'drivers/md/dm.c')
-rw-r--r-- | drivers/md/dm.c | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/drivers/md/dm.c b/drivers/md/dm.c index 7faaceb52819..09b3efdc8abf 100644 --- a/drivers/md/dm.c +++ b/drivers/md/dm.c @@ -994,6 +994,24 @@ static size_t dm_dax_copy_from_iter(struct dax_device *dax_dev, pgoff_t pgoff, return ret; } +static void dm_dax_flush(struct dax_device *dax_dev, pgoff_t pgoff, void *addr, + size_t size) +{ + struct mapped_device *md = dax_get_private(dax_dev); + sector_t sector = pgoff * PAGE_SECTORS; + struct dm_target *ti; + int srcu_idx; + + ti = dm_dax_get_live_target(md, sector, &srcu_idx); + + if (!ti) + goto out; + if (ti->type->dax_flush) + ti->type->dax_flush(ti, pgoff, addr, size); + out: + dm_put_live_table(md, srcu_idx); +} + /* * A target may call dm_accept_partial_bio only from the map routine. It is * allowed for all bio types except REQ_PREFLUSH. @@ -2885,6 +2903,7 @@ static const struct block_device_operations dm_blk_dops = { static const struct dax_operations dm_dax_ops = { .direct_access = dm_dax_direct_access, .copy_from_iter = dm_dax_copy_from_iter, + .flush = dm_dax_flush, }; /* |