On 24.07.23 11:02, Konstantin Khorenko wrote:
Implement intermediate find_hole() on device-mapper layer. Do some simple
checks, add new function to target_type, so any dm devices may realize it

https://jira.vzint.dev/browse/PSBM-145746
Signed-off-by: Andrey Zhadchenko <andrey.zhadche...@virtuozzo.com>
---
  drivers/md/dm.c               | 39 +++++++++++++++++++++++++++++++++++
  include/linux/device-mapper.h |  4 ++++
  2 files changed, 43 insertions(+)

diff --git a/drivers/md/dm.c b/drivers/md/dm.c
index c6e16ee81281..38f810ca8829 100644
--- a/drivers/md/dm.c
+++ b/drivers/md/dm.c
@@ -480,6 +480,43 @@ static int dm_blk_ioctl(struct block_device *bdev, fmode_t mode,
      return r;
  }
 +static loff_t dm_find_hole(struct block_device *bdev, loff_t offset, int whence)
+{
+    struct mapped_device *md = bdev->bd_disk->private_data;
+    struct dm_table *table;
+    struct dm_target *ti;
+    loff_t ret = -ENOTTY;
+    int srcu_idx;
+
+    table = dm_get_live_table(md, &srcu_idx);
+    if (!table || !dm_table_get_size(table))
+        goto out;
+
+    /*
+     * For now we only support devices that have a single target.
+     * But probably it is not hard to break it to a few requests to a different
+     * targets
+     */
+    if (table->num_targets != 1)
+        goto out;

Do we need an error message here ?

+
+    ti = dm_table_get_target(table, 0);
+
+    if (dm_suspended_md(md)) {
+        ret = -EAGAIN;
+        goto out;
+    }
+
+    if (!ti->type->find_hole)
+        return -EINVAL;


mixing goto and return - on error dm_put_live_table call will be missed

+
+    ret = ti->type->find_hole(ti, offset, whence);
+
+out:
+    dm_put_live_table(md, srcu_idx);
+    return ret;
+}
+

--
Regards,
Alexander Atanasov

_______________________________________________
Devel mailing list
Devel@openvz.org
https://lists.openvz.org/mailman/listinfo/devel

Reply via email to