Merge branch 'for-upstream' of git://git.kernel.org/pub/scm/linux/kernel/git/bluetoot...
[linux-2.6-microblaze.git] / drivers / md / dm.c
index 21c0207..db9e461 100644 (file)
@@ -1199,6 +1199,35 @@ static size_t dm_dax_copy_to_iter(struct dax_device *dax_dev, pgoff_t pgoff,
        return ret;
 }
 
+static int dm_dax_zero_page_range(struct dax_device *dax_dev, pgoff_t pgoff,
+                                 size_t nr_pages)
+{
+       struct mapped_device *md = dax_get_private(dax_dev);
+       sector_t sector = pgoff * PAGE_SECTORS;
+       struct dm_target *ti;
+       int ret = -EIO;
+       int srcu_idx;
+
+       ti = dm_dax_get_live_target(md, sector, &srcu_idx);
+
+       if (!ti)
+               goto out;
+       if (WARN_ON(!ti->type->dax_zero_page_range)) {
+               /*
+                * ->zero_page_range() is mandatory dax operation. If we are
+                *  here, something is wrong.
+                */
+               dm_put_live_table(md, srcu_idx);
+               goto out;
+       }
+       ret = ti->type->dax_zero_page_range(ti, pgoff, nr_pages);
+
+ out:
+       dm_put_live_table(md, srcu_idx);
+
+       return ret;
+}
+
 /*
  * A target may call dm_accept_partial_bio only from the map routine.  It is
  * allowed for all bio types except REQ_PREFLUSH, REQ_OP_ZONE_RESET,
@@ -1969,7 +1998,7 @@ static struct mapped_device *alloc_dev(int minor)
        if (IS_ENABLED(CONFIG_DAX_DRIVER)) {
                md->dax_dev = alloc_dax(md, md->disk->disk_name,
                                        &dm_dax_ops, 0);
-               if (!md->dax_dev)
+               if (IS_ERR(md->dax_dev))
                        goto bad;
        }
 
@@ -3200,6 +3229,7 @@ static const struct dax_operations dm_dax_ops = {
        .dax_supported = dm_dax_supported,
        .copy_from_iter = dm_dax_copy_from_iter,
        .copy_to_iter = dm_dax_copy_to_iter,
+       .zero_page_range = dm_dax_zero_page_range,
 };
 
 /*