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