Re: [osd-dev] [GIT PULL] exofs/osd tree for 2.6.31

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 06/22/2009 11:50 AM, Boaz Harrosh wrote:
> Linus
> 
> Please pull the following exofs/OSD changes from the git repository at:
> 
>   git://git.open-osd.org/linux-open-osd.git for-linus
> 
> These are a few fixes/cleanups and mainly a new block-device driver
> from Jeff Garzik, that can export an OSD object to block-based users
> like filesystems.
> 
> Boaz Harrosh (5):
>       exofs: Fix bio leak in error handling path (sync read)
>       exofs: Remove IBM copyrights
>       exofs: Avoid using file_fsync()
>       MAINTAINERS: Add osd maintained files (F:)
>       osdblk: Adjust queue limits to lower device's limits
> 
> Jeff Garzik (1):
>       osdblk: a Linux block device for OSD objects
> 
>  MAINTAINERS            |    5 +-
>  drivers/block/Kconfig  |   16 ++
>  drivers/block/Makefile |    1 +
>  drivers/block/osdblk.c |  670 ++++++++++++++++++++++++++++++++++++++++++++++++
>  fs/exofs/common.h      |    4 +-
>  fs/exofs/dir.c         |    4 +-
>  fs/exofs/exofs.h       |    7 +-
>  fs/exofs/file.c        |   21 +-
>  fs/exofs/inode.c       |    7 +-
>  fs/exofs/namei.c       |    4 +-
>  fs/exofs/osd.c         |    4 +-
>  fs/exofs/super.c       |    6 +-
>  fs/exofs/symlink.c     |    4 +-
>  13 files changed, 719 insertions(+), 34 deletions(-)
>  create mode 100644 drivers/block/osdblk.c
> 
> [These patches can be viewed on the web here:
>  http://git.open-osd.org/gitweb.cgi?p=linux-open-osd.git;a=shortlog;h=refs/heads/for-linus
> ]
> 
> Thanks
> Boaz

Hi Linus, Jeff

while testing osdblk I have found some bugs and squashed below patch into
the original osdblk driver.

Linus please see that you have bc47df0 it might take a few minutes to update 

Boaz
---
Subject: [SQUASHME] osdblk: Assorted bug fixes 

I have squashed the below fixes to the original osdblk driver.
It should run much better now

Signed-off-by: Boaz Harrosh <bharrosh@xxxxxxxxxxx>
---

diff --git a/drivers/block/osdblk.c b/drivers/block/osdblk.c
index b07e154..13c1aee 100644
--- a/drivers/block/osdblk.c
+++ b/drivers/block/osdblk.c
@@ -71,6 +71,19 @@
 #define DRV_NAME "osdblk"
 #define PFX DRV_NAME ": "
 
+/* #define _OSDBLK_DEBUG */
+#ifdef _OSDBLK_DEBUG
+#define OSDBLK_DEBUG(fmt, a...) \
+	printk(KERN_NOTICE "osdblk @%s:%d: " fmt, __func__, __LINE__, ##a)
+#else
+#define OSDBLK_DEBUG(fmt, a...) \
+	do { if (0) printk(fmt, ##a); } while (0)
+#endif
+
+MODULE_AUTHOR("Jeff Garzik <jeff@xxxxxxxxxx>");
+MODULE_DESCRIPTION("block device inside an OSD object osdblk.ko");
+MODULE_LICENSE("GPL");
+
 struct osdblk_device;
 
 enum {
@@ -109,7 +122,7 @@ struct osdblk_device {
 };
 
 static struct class *class_osdblk;		/* /sys/class/osdblk */
-static struct mutex ctl_mutex;	/* Serialize open/close/setup/teardown */
+static DEFINE_MUTEX(ctl_mutex);	/* Serialize open/close/setup/teardown */
 static LIST_HEAD(osdblkdev_list);
 
 static struct block_device_operations osdblk_bd_ops = {
@@ -223,8 +236,10 @@ static void osdblk_osd_complete(struct osd_request *or, void *private)
 	struct osd_sense_info osi;
 	int ret = osd_req_decode_sense(or, &osi);
 
-	if (ret)
+	if (ret) {
 		ret = -EIO;
+		OSDBLK_DEBUG("osdblk_osd_complete with err=%d\n", ret);
+	}
 
 	/* complete OSD request */
 	osd_end_request(or);
@@ -250,13 +265,15 @@ static struct bio *bio_chain_clone(struct bio *old_chain, gfp_t gfpmask)
 	struct bio *tmp, *new_chain = NULL, *tail = NULL;
 
 	while (old_chain) {
-		tmp = bio_kmalloc(gfpmask, old_chain->bi_vcnt);
+		tmp = bio_kmalloc(gfpmask, old_chain->bi_max_vecs);
 		if (!tmp)
 			goto err_out;
 
 		__bio_clone(tmp, old_chain);
+		tmp->bi_bdev = NULL;
 		gfpmask &= ~__GFP_WAIT;
 		tmp->bi_next = NULL;
+
 		if (!new_chain)
 			new_chain = tail = tmp;
 		else {
@@ -270,6 +287,7 @@ static struct bio *bio_chain_clone(struct bio *old_chain, gfp_t gfpmask)
 	return new_chain;
 
 err_out:
+	OSDBLK_DEBUG("bio_chain_clone with err\n");
 	bio_chain_put(new_chain);
 	return NULL;
 }
@@ -277,13 +295,14 @@ err_out:
 static void osdblk_rq_fn(struct request_queue *q)
 {
 	struct osdblk_device *osdev = q->queuedata;
-	struct request *rq;
-	struct osdblk_request *orq;
-	struct osd_request *or;
-	struct bio *bio;
-	int do_write, do_flush;
 
 	while (1) {
+		struct request *rq;
+		struct osdblk_request *orq;
+		struct osd_request *or;
+		struct bio *bio;
+		bool do_write, do_flush;
+
 		/* peek at request from block layer */
 		rq = blk_fetch_request(q);
 		if (!rq)
@@ -317,6 +336,7 @@ static void osdblk_rq_fn(struct request_queue *q)
 		or = osd_start_request(osdev->osd, GFP_ATOMIC);
 		if (!or) {
 			bio_chain_put(bio);
+			OSDBLK_DEBUG("osd_start_request with err\n");
 			break;
 		}
 
@@ -336,12 +356,19 @@ static void osdblk_rq_fn(struct request_queue *q)
 			osd_req_read(or, &osdev->obj, blk_rq_pos(rq) * 512ULL,
 				     bio, blk_rq_bytes(rq));
 
+		OSDBLK_DEBUG("%s 0x%x bytes at 0x%llx\n",
+			do_flush ? "flush" : do_write ?
+				"write" : "read", blk_rq_bytes(rq),
+			blk_rq_pos(rq) * 512ULL);
+
 		/* begin OSD command execution */
 		if (osd_async_op(or, osdblk_osd_complete, orq,
 				 osdev->obj_cred)) {
 			osd_end_request(or);
 			blk_requeue_request(q, rq);
 			bio_chain_put(bio);
+			OSDBLK_DEBUG("osd_execute_request_async with err\n");
+			break;
 		}
 
 		/* remove the special 'flush' marker, now that the command
@@ -390,7 +417,7 @@ static int osdblk_init_disk(struct osdblk_device *osdev)
 	if (!disk)
 		return -ENOMEM;
 
-	sprintf(disk->disk_name, DRV_NAME "/%d", osdev->id);
+	sprintf(disk->disk_name, DRV_NAME "%d", osdev->id);
 	disk->major = osdev->major;
 	disk->first_minor = 0;
 	disk->fops = &osdblk_bd_ops;
@@ -428,9 +455,12 @@ static int osdblk_init_disk(struct osdblk_device *osdev)
 	osdev->q = q;
 
 	/* finally, announce the disk to the world */
-	set_capacity(disk, obj_size);
+	set_capacity(disk, obj_size / 512ULL);
 	add_disk(disk);
 
+	printk(KERN_INFO "%s: Added of size 0x%llx\n",
+		disk->disk_name, (unsigned long long)obj_size);
+
 	return 0;
 }
 
@@ -544,7 +574,7 @@ static ssize_t class_osdblk_add(struct class *c, const char *buf, size_t count)
 	if (rc)
 		goto err_out_blkdev;
 
-	return 0;
+	return count;
 
 err_out_blkdev:
 	unregister_blkdev(osdev->major, osdev->name);
@@ -557,6 +587,7 @@ err_out_slot:
 
 	kfree(osdev);
 err_out_mod:
+	OSDBLK_DEBUG("Error adding device %s\n", buf);
 	module_put(THIS_MODULE);
 	return rc;
 }
@@ -604,7 +635,7 @@ static ssize_t class_osdblk_remove(struct class *c, const char *buf,
 	/* release module ref */
 	module_put(THIS_MODULE);
 
-	return 0;
+	return count;
 }
 
 static struct class_attribute class_osdblk_attrs[] = {
diff --git a/drivers/scsi/osd/osd_initiator.c b/drivers/scsi/osd/osd_initiator.c
index 7a117c1..da0e35f 100644
--- a/drivers/scsi/osd/osd_initiator.c
+++ b/drivers/scsi/osd/osd_initiator.c
@@ -441,7 +441,7 @@ void osd_end_request(struct osd_request *or)
 {
 	struct request *rq = or->request;
 	/* IMPORTANT: make sure this agrees with osd_execute_request_async */
-	bool is_async = (or->request->end_io_data == or);
+	bool is_async = (rq->end_io_data == or);
 
 	_osd_free_seg(or, &or->set_attr);
 	_osd_free_seg(or, &or->enc_get_attr);

--
To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Ext4 Filesystem]     [Union Filesystem]     [Filesystem Testing]     [Ceph Users]     [Ecryptfs]     [AutoFS]     [Kernel Newbies]     [Share Photos]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux Cachefs]     [Reiser Filesystem]     [Linux RAID]     [Samba]     [Device Mapper]     [CEPH Development]
  Powered by Linux