All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 2/2] pnfsblock: iterating all local block disks instead of only scsi disks when initializing mount point.
@ 2010-05-14  8:48 Tao Guo
  0 siblings, 0 replies; only message in thread
From: Tao Guo @ 2010-05-14  8:48 UTC (permalink / raw)
  To: linux-nfs; +Cc: Fred Isaman, Benny Halevy

So we can use virtual block devices like MD/DM in blocklayoutdriver.

Signed-off-by: Huang Haoi <huanghao-U4AKAne5IzAR5TUyvShJeg@public.gmane.org>
---
 fs/nfs/blocklayout/blocklayout.c    |   12 ++--
 fs/nfs/blocklayout/blocklayout.h    |    3 +-
 fs/nfs/blocklayout/blocklayoutdev.c |  116 +++++++++++++++--------------------
 fs/nfs/blocklayout/blocklayoutdm.c  |    2 +-
 4 files changed, 57 insertions(+), 76 deletions(-)

diff --git a/fs/nfs/blocklayout/blocklayout.c b/fs/nfs/blocklayout/blocklayout.c
index 918e6d6..688984f 100644
--- a/fs/nfs/blocklayout/blocklayout.c
+++ b/fs/nfs/blocklayout/blocklayout.c
@@ -765,7 +765,7 @@ bl_initialize_mountpoint(struct nfs_server *server, const struct nfs_fh *fh)
 	struct pnfs_mount_type *mtype = NULL;
 	struct pnfs_devicelist *dlist = NULL;
 	struct pnfs_block_dev *bdev;
-	LIST_HEAD(scsi_disklist);
+	LIST_HEAD(block_disklist);
 	int status, i;
 
 	dprintk("%s enter\n", __func__);
@@ -783,10 +783,10 @@ bl_initialize_mountpoint(struct nfs_server *server, const struct nfs_fh *fh)
 	spin_lock_init(&b_mt_id->bm_lock);
 	INIT_LIST_HEAD(&b_mt_id->bm_devlist);
 
-	/* Construct a list of all visible scsi disks that have not been
+	/* Construct a list of all visible block disks that have not been
 	 * claimed.
 	 */
-	status =  nfs4_blk_create_scsi_disk_list(&scsi_disklist);
+	status =  nfs4_blk_create_block_disk_list(&block_disklist);
 	if (status < 0)
 		goto out_error;
 
@@ -804,13 +804,13 @@ bl_initialize_mountpoint(struct nfs_server *server, const struct nfs_fh *fh)
 		/* For each device returned in dlist, call GETDEVICEINFO, and
 		 * decode the opaque topology encoding to create a flat
 		 * volume topology, matching VOLUME_SIMPLE disk signatures
-		 * to disks in the visible scsi disk list.
+		 * to disks in the visible block disk list.
 		 * Construct an LVM meta device from the flat volume topology.
 		 */
 		for (i = 0; i < dlist->num_devs; i++) {
 			bdev = nfs4_blk_get_deviceinfo(server, fh,
 						     &dlist->dev_id[i],
-						     &scsi_disklist);
+						     &block_disklist);
 			if (!bdev)
 				goto out_error;
 			spin_lock(&b_mt_id->bm_lock);
@@ -823,7 +823,7 @@ bl_initialize_mountpoint(struct nfs_server *server, const struct nfs_fh *fh)
 	status = 0;
  out_return:
 	kfree(dlist);
-	nfs4_blk_destroy_disk_list(&scsi_disklist);
+	nfs4_blk_destroy_disk_list(&block_disklist);
 	return status;
 
  out_error:
diff --git a/fs/nfs/blocklayout/blocklayout.h b/fs/nfs/blocklayout/blocklayout.h
index 286adc9..0efed8d 100644
--- a/fs/nfs/blocklayout/blocklayout.h
+++ b/fs/nfs/blocklayout/blocklayout.h
@@ -44,7 +44,6 @@
 #define SetPagePnfsErr(page)	set_bit(PG_pnfserr, &(page)->flags)
 #define ClearPagePnfsErr(page)	clear_bit(PG_pnfserr, &(page)->flags)
 
-extern struct class shost_class; /* exported from drivers/scsi/hosts.c */
 extern int dm_dev_create(struct dm_ioctl *param); /* from dm-ioctl.c */
 extern int dm_dev_remove(struct dm_ioctl *param); /* from dm-ioctl.c */
 extern int dm_do_resume(struct dm_ioctl *param);
@@ -250,7 +249,7 @@ struct pnfs_block_dev *nfs4_blk_decode_device(struct nfs_server *server,
 					      struct list_head *sdlist);
 int nfs4_blk_process_layoutget(struct pnfs_layout_type *lo,
 			       struct nfs4_pnfs_layoutget_res *lgr);
-int nfs4_blk_create_scsi_disk_list(struct list_head *);
+int nfs4_blk_create_block_disk_list(struct list_head *);
 void nfs4_blk_destroy_disk_list(struct list_head *);
 /* blocklayoutdm.c */
 struct pnfs_block_dev *nfs4_blk_init_metadev(struct nfs_server *server,
diff --git a/fs/nfs/blocklayout/blocklayoutdev.c b/fs/nfs/blocklayout/blocklayoutdev.c
index 4f45523..ef39c36 100644
--- a/fs/nfs/blocklayout/blocklayoutdev.c
+++ b/fs/nfs/blocklayout/blocklayoutdev.c
@@ -32,15 +32,14 @@
 #include <linux/module.h>
 #include <linux/buffer_head.h> /* __bread */
 
-#include <scsi/scsi.h>
-#include <scsi/scsi_device.h>
-#include <scsi/scsi_host.h>
+#include <linux/genhd.h>
+#include <linux/blkdev.h>
 
 #include "blocklayout.h"
 
 #define NFSDBG_FACILITY         NFSDBG_PNFS_LD
 
-#define MAX_VOLS  256  /* Maximum number of SCSI disks.  Totally arbitrary */
+#define MAX_VOLS  256  /* Maximum number of block disks.  Totally arbitrary */
 
 uint32_t *blk_overflow(uint32_t *p, uint32_t *end, size_t nbytes)
 {
@@ -78,7 +77,7 @@ int nfs4_blkdev_put(struct block_device *bdev)
 	return blkdev_put(bdev, FMODE_READ);
 }
 
-/* Add a visible, claimed (by us!) scsi disk to the device list */
+/* Add a visible, claimed (by us!) block disk to the device list */
 static int alloc_add_disk(struct block_device *blk_dev, struct list_head *dlist)
 {
 	struct visible_block_device *vis_dev;
@@ -96,17 +95,16 @@ static int alloc_add_disk(struct block_device *blk_dev, struct list_head *dlist)
 	return 0;
 }
 
-/* Walk the list of scsi_devices. Add disks that can be opened and claimed
+/* Walk the list of block_devices. Add disks that can be opened and claimed
  * to the device list
  */
 static int
-nfs4_blk_add_scsi_disk(struct Scsi_Host *shost,
+nfs4_blk_add_block_disk(struct device *cdev,
 		       int index, struct list_head *dlist)
 {
 	static char *claim_ptr = "I belong to pnfs block driver";
 	struct block_device *bdev;
 	struct gendisk *gd;
-	struct scsi_device *sdev;
 	unsigned int major, minor, ret = 0;
 	dev_t dev;
 
@@ -115,62 +113,49 @@ nfs4_blk_add_scsi_disk(struct Scsi_Host *shost,
 		dprintk("%s MAX_VOLS hit\n", __func__);
 		return -ENOSPC;
 	}
-	dprintk("%s 1 \n", __func__);
-	index--;
-	shost_for_each_device(sdev, shost) {
-		dprintk("%s 2\n", __func__);
-		/* Need to do this check before bumping index */
-		if (sdev->type != TYPE_DISK)
-			continue;
-		dprintk("%s 3 index %d \n", __func__, index);
-		if (++index >= MAX_VOLS) {
-			scsi_device_put(sdev);
-			break;
-		}
-		major = (!(index >> 4) ? SCSI_DISK0_MAJOR :
-			 SCSI_DISK1_MAJOR-1 + (index  >> 4));
-		minor =  ((index << 4) & 255);
-
-		dprintk("%s SCSI device %d:%d \n", __func__, major, minor);
-
-		dev = MKDEV(major, minor);
-		bdev = nfs4_blkdev_get(dev);
-		if (!bdev) {
-			dprintk("%s: failed to open device %d:%d\n",
-					__func__, major, minor);
-			continue;
-		}
-		gd = bdev->bd_disk;
-
-		dprintk("%s 4\n", __func__);
-
-		if (bd_claim(bdev, claim_ptr)) {
-			dprintk("%s: failed to claim device %d:%d\n",
-				__func__, gd->major, gd->first_minor);
-			blkdev_put(bdev, FMODE_READ);
-			continue;
-		}
+	gd = dev_to_disk(cdev);
+	if (gd == NULL || get_capacity(gd) == 0 ||
+	    (gd->flags & GENHD_FL_SUPPRESS_PARTITION_INFO)) /* Skip ramdisks */
+		goto out;
 
-		ret = alloc_add_disk(bdev, dlist);
-		if (ret < 0)
-			goto out_err;
-		dprintk("%s ADDED DEVICE capacity %ld, bd_block_size %d\n",
-					__func__,
-					(unsigned long)get_capacity(gd),
-					bdev->bd_block_size);
+	dev = cdev->devt;
+	major = MAJOR(dev);
+	minor = MINOR(dev);
+	bdev = nfs4_blkdev_get(dev);
+	if (!bdev) {
+		dprintk("%s: failed to open device %d:%d\n",
+			__func__, major, minor);
+		goto out;
+	}
 
+	if (bd_claim(bdev, claim_ptr)) {
+		dprintk("%s: failed to claim device %d:%d\n",
+			 __func__, major, minor);
+		blkdev_put(bdev, FMODE_READ);
+		goto out;
 	}
+
+	ret = alloc_add_disk(bdev, dlist);
+	if (ret < 0)
+		goto out_err;
 	index++;
+	dprintk("%s ADDED DEVICE %d:%d capacity %ld, bd_block_size %d\n",
+		__func__, major, minor,
+		(unsigned long)get_capacity(gd),
+		bdev->bd_block_size);
+
+out:
 	dprintk("%s returns index %d \n", __func__, index);
 	return index;
 
 out_err:
-	dprintk("%s Can't add disk to list. ERROR: %d\n", __func__, ret);
+	dprintk("%s Can't add disk %d:%d to list. ERROR: %d\n",
+			__func__, major, minor, ret);
 	nfs4_blkdev_put(bdev);
 	return ret;
 }
 
-/* Destroy the temporary scsi disk list */
+/* Destroy the temporary block disk list */
 void nfs4_blk_destroy_disk_list(struct list_head *dlist)
 {
 	struct visible_block_device *vis_dev;
@@ -189,20 +174,18 @@ void nfs4_blk_destroy_disk_list(struct list_head *dlist)
 	}
 }
 
-struct nfs4_blk_scsi_disk_list_ctl {
+struct nfs4_blk_block_disk_list_ctl {
 	struct list_head *dlist;
 	int index;
 };
 
-static int nfs4_blk_iter_scsi_disk_list(struct device *cdev, void *data)
+static int nfs4_blk_iter_block_disk_list(struct device *cdev, void *data)
 {
-	struct Scsi_Host *shost;
-	struct nfs4_blk_scsi_disk_list_ctl *lc = data;
+	struct nfs4_blk_block_disk_list_ctl *lc = data;
 	int ret;
 
 	dprintk("%s enter\n", __func__);
-	shost = class_to_shost(cdev);
-	ret = nfs4_blk_add_scsi_disk(shost, lc->index, lc->dlist);
+	ret = nfs4_blk_add_block_disk(cdev, lc->index, lc->dlist);
 	dprintk("%s 1 ret %d\n", __func__, ret);
 	if (ret >= 0) {
 		lc->index = ret;
@@ -212,22 +195,21 @@ static int nfs4_blk_iter_scsi_disk_list(struct device *cdev, void *data)
 }
 
 /*
- * Create a temporary list of all SCSI disks host can see, and that have not
+ * Create a temporary list of all block disks host can see, and that have not
  * yet been claimed.
- * shost_class: list of all registered scsi_hosts
+ * block_class: list of all registered block disks.
  * returns -errno on error, and #of devices found on success.
- * XXX Loosely emulate scsi_host_lookup from scsi/host.c
 */
-int nfs4_blk_create_scsi_disk_list(struct list_head *dlist)
+int nfs4_blk_create_block_disk_list(struct list_head *dlist)
 {
-	struct nfs4_blk_scsi_disk_list_ctl lc = {
+	struct nfs4_blk_block_disk_list_ctl lc = {
 		.dlist = dlist,
 		.index = 0,
 	};
 
 	dprintk("%s enter\n", __func__);
-	return class_for_each_device(&shost_class, NULL,
-				     &lc, nfs4_blk_iter_scsi_disk_list);
+	return class_for_each_device(&block_class, NULL,
+				     &lc, nfs4_blk_iter_block_disk_list);
 }
 /* We are given an array of XDR encoded array indices, each of which should
  * refer to a previously decoded device.  Translate into a list of pointers
@@ -361,7 +343,7 @@ out_err:
 
 /*
  * map_sig_to_device()
- * Given a signature, walk the list of visible scsi disks searching for
+ * Given a signature, walk the list of visible block disks searching for
  * a match. Returns True if mapping was done, False otherwise.
  *
  * While we're at it, fill in the vol->bv_size.
diff --git a/fs/nfs/blocklayout/blocklayoutdm.c b/fs/nfs/blocklayout/blocklayoutdm.c
index d70f6b2..3d15de0 100644
--- a/fs/nfs/blocklayout/blocklayoutdm.c
+++ b/fs/nfs/blocklayout/blocklayoutdm.c
@@ -257,7 +257,7 @@ static int nfs4_blk_resolve(int root, struct pnfs_blk_volume *vols,
  * Create an LVM dm device table that represents the volume topology returned
  * by GETDEVICELIST or GETDEVICEINFO.
  *
- * vols:  topology with VOLUME_SIMPLEs mapped to visable scsi disks.
+ * vols:  topology with VOLUME_SIMPLEs mapped to visable block disks.
  * size:  number of volumes in vols.
  */
 int nfs4_blk_flatten(struct pnfs_blk_volume *vols, int size,
-- 
1.6.3.3


^ permalink raw reply related	[flat|nested] only message in thread

only message in thread, other threads:[~2010-05-14  9:51 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-05-14  8:48 [PATCH 2/2] pnfsblock: iterating all local block disks instead of only scsi disks when initializing mount point Tao Guo

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.