lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date:	Tue,  4 Aug 2015 09:11:10 +0200
From:	Christoph Hellwig <hch@....de>
To:	Jens Axboe <axboe@...com>
Cc:	linux-scsi@...r.kernel.org, linux-nvme@...ts.infradead.org,
	dm-devel@...hat.com, linux-api@...r.kernel.org,
	linux-kernel@...r.kernel.org
Subject: [PATCH 5/6] dm: split out a helper to find the ioctl target

We want to reuse this code for the persistent reservation handling,
so move it into a helper.

Signed-off-by: Christoph Hellwig <hch@....de>
---
 drivers/md/dm.c | 50 ++++++++++++++++++++++++++++++++------------------
 1 file changed, 32 insertions(+), 18 deletions(-)

diff --git a/drivers/md/dm.c b/drivers/md/dm.c
index c68eb91..8dfc760 100644
--- a/drivers/md/dm.c
+++ b/drivers/md/dm.c
@@ -556,18 +556,16 @@ static int dm_blk_getgeo(struct block_device *bdev, struct hd_geometry *geo)
 	return dm_get_geometry(md, geo);
 }
 
-static int dm_blk_ioctl(struct block_device *bdev, fmode_t mode,
-			unsigned int cmd, unsigned long arg)
+static int dm_get_ioctl_table(struct mapped_device *md,
+		struct dm_target **tgt, struct block_device **bdev,
+		fmode_t *mode, int *srcu_idx)
 {
-	struct mapped_device *md = bdev->bd_disk->private_data;
-	int srcu_idx;
 	struct dm_table *map;
-	struct dm_target *tgt;
-	int r = -ENOTTY;
+	int r;
 
 retry:
-	map = dm_get_live_table(md, &srcu_idx);
-
+	r = -ENOTTY;
+	map = dm_get_live_table(md, srcu_idx);
 	if (!map || !dm_table_get_size(map))
 		goto out;
 
@@ -575,8 +573,9 @@ retry:
 	if (dm_table_get_num_targets(map) != 1)
 		goto out;
 
-	tgt = dm_table_get_target(map, 0);
-	if (!tgt->type->ioctl)
+	*tgt = dm_table_get_target(map, 0);
+
+	if (!(*tgt)->type->ioctl)
 		goto out;
 
 	if (dm_suspended_md(md)) {
@@ -584,10 +583,32 @@ retry:
 		goto out;
 	}
 
-	r = tgt->type->ioctl(tgt, &bdev, &mode);
+	r = (*tgt)->type->ioctl(*tgt, bdev, mode);
 	if (r < 0)
 		goto out;
 
+	return r;
+
+out:
+	dm_put_live_table(md, *srcu_idx);
+	if (r == -ENOTCONN) {
+		msleep(10);
+		goto retry;
+	}
+	return r;
+}
+
+static int dm_blk_ioctl(struct block_device *bdev, fmode_t mode,
+			unsigned int cmd, unsigned long arg)
+{
+	struct mapped_device *md = bdev->bd_disk->private_data;
+	struct dm_target *tgt;
+	int srcu_idx, r;
+
+	r = dm_get_ioctl_table(md, &tgt, &bdev, &mode, &srcu_idx);
+	if (r < 0)
+		return r;
+
 	if (r > 0) {
 		r = scsi_verify_blk_ioctl(NULL, cmd);
 		if (r)
@@ -595,15 +616,8 @@ retry:
 	}
 
 	r =  __blkdev_driver_ioctl(bdev, mode, cmd, arg);
-
 out:
 	dm_put_live_table(md, srcu_idx);
-
-	if (r == -ENOTCONN) {
-		msleep(10);
-		goto retry;
-	}
-
 	return r;
 }
 
-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ