All of lore.kernel.org
 help / color / mirror / Atom feed
* Patch(2.5.45): move io_restrictions to blkdev.h
@ 2002-11-02 18:51 Adam J. Richter
  2002-11-02 21:40 ` Jens Axboe
  0 siblings, 1 reply; 5+ messages in thread
From: Adam J. Richter @ 2002-11-02 18:51 UTC (permalink / raw)
  To: axboe, thornber; +Cc: linux-kernel

[-- Attachment #1: Type: text/plain, Size: 1427 bytes --]

	This patch makes good on a threat that I posted yesterday
to move struct io_restrictions from <linux/device-mapper.h> to
<linux/blkdev.h>, eliminating duplication of a list of fields in
struct request_queue.

	This change makes it easier to manipulate these parameters as
a group, which should allow simplification of a number of drivers that
currently manipulate a subset of these parameters.  I believe it will
enable a number of clean-ups, but I have deliberately not make most of
those clean-ups in this version, because I would like to first get
this infrastructure adjustment done as reliably as possible, hopefully
for 2.5.46.

	By the way, eventually, this change should also make it easier
to lift the mergability tests out of the block layer and make them
work on gather-scatter DMA in general.

	I am running this patch now.  Well, actually, the ll_rw_blk.c
that I'm including here is different from the one that I use, because
I have a bunch of other changes in the version of that file that I
actually use, but the version in this patch compiles without warnings
and the changes are trivial.

	Jens, can I persuade you to integrate this change?

-- 
Adam J. Richter     __     ______________   575 Oroville Road
adam@yggdrasil.com     \ /                  Milpitas, California 95035
+1 408 309-6081         | g g d r a s i l   United States of America
                         "Free Software For The Rest Of Us."

[-- Attachment #2: bio.diff --]
[-- Type: text/plain, Size: 13628 bytes --]

--- linux-2.5.45/include/linux/device-mapper.h	2002-10-30 16:43:07.000000000 -0800
+++ linux/include/linux/device-mapper.h	2002-11-02 04:11:20.000000000 -0800
@@ -7,6 +7,8 @@
 #ifndef _LINUX_DEVICE_MAPPER_H
 #define _LINUX_DEVICE_MAPPER_H
 
+#include <linux/blkdev.h>
+
 #define DM_DIR "mapper"	/* Slashes not supported */
 #define DM_MAX_TYPE_NAME 16
 #define DM_NAME_LEN 128
@@ -65,15 +67,6 @@
 	dm_status_fn status;
 };
 
-struct io_restrictions {
-	unsigned short		max_sectors;
-	unsigned short		max_phys_segments;
-	unsigned short		max_hw_segments;
-	unsigned short		hardsect_size;
-	unsigned int		max_segment_size;
-	unsigned long		seg_boundary_mask;
-};
-
 struct dm_target {
 	struct dm_table *table;
 	struct target_type *type;
--- linux-2.5.45/include/linux/blkdev.h	2002-10-30 16:42:20.000000000 -0800
+++ linux/include/linux/blkdev.h	2002-11-02 04:57:54.000000000 -0800
@@ -16,6 +16,15 @@
 struct elevator_s;
 typedef struct elevator_s elevator_t;
 
+struct io_restrictions {
+	unsigned short		max_sectors;
+	unsigned short		max_phys_segments;
+	unsigned short		max_hw_segments;
+	unsigned short		hardsect_size;
+	unsigned int		max_segment_size;
+	unsigned long		seg_boundary_mask;
+};
+
 struct request_list {
 	unsigned int count;
 	struct list_head free;
@@ -216,14 +225,9 @@
 	/*
 	 * queue settings
 	 */
-	unsigned short		max_sectors;
-	unsigned short		max_phys_segments;
-	unsigned short		max_hw_segments;
-	unsigned short		hardsect_size;
-	unsigned int		max_segment_size;
+	struct io_restrictions	limits;
 
-	unsigned long		seg_boundary_mask;
 	unsigned int		dma_alignment;
 
 	wait_queue_head_t	queue_wait;
@@ -382,10 +390,10 @@
 {
 	int retval = 512;
 
-	if (q && q->hardsect_size)
-		retval = q->hardsect_size;
+	if (q && q->limits.hardsect_size)
+		retval = q->limits.hardsect_size;
 
 	return retval;
 }
--- linux-2.5.45/include/linux/bio.h	2002-10-30 16:43:36.000000000 -0800
+++ linux/include/linux/bio.h	2002-11-02 05:33:02.000000000 -0800
@@ -165,11 +166,11 @@
 	((((bvec_to_phys((vec1)) + (vec1)->bv_len) | bvec_to_phys((vec2))) & (BIO_VMERGE_BOUNDARY - 1)) == 0)
 #define __BIO_SEG_BOUNDARY(addr1, addr2, mask) \
 	(((addr1) | (mask)) == (((addr2) - 1) | (mask)))
-#define BIOVEC_SEG_BOUNDARY(q, b1, b2) \
-	__BIO_SEG_BOUNDARY(bvec_to_phys((b1)), bvec_to_phys((b2)) + (b2)->bv_len, (q)->seg_boundary_mask)
-#define BIO_SEG_BOUNDARY(q, b1, b2) \
-	BIOVEC_SEG_BOUNDARY((q), __BVEC_END((b1)), __BVEC_START((b2)))
+#define BIOVEC_SEG_BOUNDARY(limits, b1, b2) \
+	__BIO_SEG_BOUNDARY(bvec_to_phys((b1)), bvec_to_phys((b2)) + (b2)->bv_len, (limits)->seg_boundary_mask)
+#define BIO_SEG_BOUNDARY(limits, b1, b2) \
+	BIOVEC_SEG_BOUNDARY((limits), __BVEC_END((b1)), __BVEC_START((b2)))
 
 #define bio_io_error(bio, bytes) bio_endio((bio), (bytes), -EIO)
 
--- linux-2.5.45/drivers/block/ioctl.c	2002-10-30 16:41:39.000000000 -0800
+++ linux/drivers/block/ioctl.c	2002-11-02 05:02:30.000000000 -0800
@@ -147,7 +147,7 @@
 	case BLKSSZGET: /* get block device hardware sector size */
 		return put_int(arg, bdev_hardsect_size(bdev));
 	case BLKSECTGET:
-		return put_ushort(arg, bdev_get_queue(bdev)->max_sectors);
+		return put_ushort(arg, bdev_get_queue(bdev)->limits.max_sectors);
 	case BLKRASET:
 	case BLKFRASET:
 		if(!capable(CAP_SYS_ADMIN))
--- linux-2.5.45/drivers/block/ll_rw_blk.c	2002-10-30 16:41:55.000000000 -0800
+++ linux/drivers/block/ll_rw_blk.c	2002-11-02 07:34:52.000000000 -0800
@@ -213,8 +213,8 @@
 	/*
 	 * set defaults
 	 */
-	q->max_phys_segments = MAX_PHYS_SEGMENTS;
-	q->max_hw_segments = MAX_HW_SEGMENTS;
+	q->limits.max_phys_segments = MAX_PHYS_SEGMENTS;
+	q->limits.max_hw_segments = MAX_HW_SEGMENTS;
 	q->make_request_fn = mfn;
 	q->backing_dev_info.ra_pages = (VM_MAX_READAHEAD * 1024) / PAGE_CACHE_SIZE;
 	q->backing_dev_info.state = 0;
@@ -293,7 +293,7 @@
 		printk("%s: set to minimum %d\n", __FUNCTION__, max_sectors);
 	}
 
-	q->max_sectors = max_sectors;
+	q->limits.max_sectors = max_sectors;
 }
 
 /**
@@ -313,7 +313,7 @@
 		printk("%s: set to minimum %d\n", __FUNCTION__, max_segments);
 	}
 
-	q->max_phys_segments = max_segments;
+	q->limits.max_phys_segments = max_segments;
 }
 
 /**
@@ -334,7 +334,7 @@
 		printk("%s: set to minimum %d\n", __FUNCTION__, max_segments);
 	}
 
-	q->max_hw_segments = max_segments;
+	q->limits.max_hw_segments = max_segments;
 }
 
 /**
@@ -353,7 +353,7 @@
 		printk("%s: set to minimum %d\n", __FUNCTION__, max_size);
 	}
 
-	q->max_segment_size = max_size;
+	q->limits.max_segment_size = max_size;
 }
 
 /**
@@ -369,7 +369,7 @@
  **/
 void blk_queue_hardsect_size(request_queue_t *q, unsigned short size)
 {
-	q->hardsect_size = size;
+	q->limits.hardsect_size = size;
 }
 
 /**
@@ -384,7 +384,7 @@
 		printk("%s: set to minimum %lx\n", __FUNCTION__, mask);
 	}
 
-	q->seg_boundary_mask = mask;
+	q->limits.seg_boundary_mask = mask;
 }
 
 /**
@@ -696,13 +696,13 @@
 		if (bvprv && cluster) {
 			int phys, seg;
 
-			if (seg_size + bv->bv_len > q->max_segment_size) {
+			if (seg_size + bv->bv_len > q->limits.max_segment_size) {
 				nr_phys_segs++;
 				goto new_segment;
 			}
 
 			phys = BIOVEC_PHYS_MERGEABLE(bvprv, bv);
-			seg = BIOVEC_SEG_BOUNDARY(q, bvprv, bv);
+			seg = BIOVEC_SEG_BOUNDARY(&q->limits, bvprv, bv);
 			if (!phys || !seg)
 				nr_phys_segs++;
 			if (!seg)
@@ -737,14 +737,14 @@
 
 	if (!BIOVEC_PHYS_MERGEABLE(__BVEC_END(bio), __BVEC_START(nxt)))
 		return 0;
-	if (bio->bi_size + nxt->bi_size > q->max_segment_size)
+	if (bio->bi_size + nxt->bi_size > q->limits.max_segment_size)
 		return 0;
 
 	/*
 	 * bio and nxt are contigous in memory, check if the queue allows
 	 * these two to be merged into one
 	 */
-	if (BIO_SEG_BOUNDARY(q, bio, nxt))
+	if (BIO_SEG_BOUNDARY(&q->limits, bio, nxt))
 		return 1;
 
 	return 0;
@@ -758,14 +758,14 @@
 
 	if (!BIOVEC_VIRT_MERGEABLE(__BVEC_END(bio), __BVEC_START(nxt)))
 		return 0;
-	if (bio->bi_size + nxt->bi_size > q->max_segment_size)
+	if (bio->bi_size + nxt->bi_size > q->limits.max_segment_size)
 		return 0;
 
 	/*
 	 * bio and nxt are contigous in memory, check if the queue allows
 	 * these two to be merged into one
 	 */
-	if (BIO_SEG_BOUNDARY(q, bio, nxt))
+	if (BIO_SEG_BOUNDARY(&q->limits, bio, nxt))
 		return 1;
 
 	return 0;
@@ -796,12 +796,12 @@
 			int nbytes = bvec->bv_len;
 
 			if (bvprv && cluster) {
-				if (sg[nsegs - 1].length + nbytes > q->max_segment_size)
+				if (sg[nsegs - 1].length + nbytes > q->limits.max_segment_size)
 					goto new_segment;
 
 				if (!BIOVEC_PHYS_MERGEABLE(bvprv, bvec))
 					goto new_segment;
-				if (!BIOVEC_SEG_BOUNDARY(q, bvprv, bvec))
+				if (!BIOVEC_SEG_BOUNDARY(&q->limits, bvprv, bvec))
 					goto new_segment;
 
 				sg[nsegs - 1].length += nbytes;
@@ -832,7 +832,7 @@
 {
 	int nr_phys_segs = bio_phys_segments(q, bio);
 
-	if (req->nr_phys_segments + nr_phys_segs > q->max_phys_segments) {
+	if (req->nr_phys_segments + nr_phys_segs > q->limits.max_phys_segments) {
 		req->flags |= REQ_NOMERGE;
 		q->last_merge = NULL;
 		return 0;
@@ -853,8 +853,8 @@
 	int nr_hw_segs = bio_hw_segments(q, bio);
 	int nr_phys_segs = bio_phys_segments(q, bio);
 
-	if (req->nr_hw_segments + nr_hw_segs > q->max_hw_segments
-	    || req->nr_phys_segments + nr_phys_segs > q->max_phys_segments) {
+	if (req->nr_hw_segments + nr_hw_segs > q->limits.max_hw_segments
+	    || req->nr_phys_segments + nr_phys_segs > q->limits.max_phys_segments) {
 		req->flags |= REQ_NOMERGE;
 		q->last_merge = NULL;
 		return 0;
@@ -872,7 +872,7 @@
 static int ll_back_merge_fn(request_queue_t *q, struct request *req, 
 			    struct bio *bio)
 {
-	if (req->nr_sectors + bio_sectors(bio) > q->max_sectors) {
+	if (req->nr_sectors + bio_sectors(bio) > q->limits.max_sectors) {
 		req->flags |= REQ_NOMERGE;
 		q->last_merge = NULL;
 		return 0;
@@ -887,7 +887,7 @@
 static int ll_front_merge_fn(request_queue_t *q, struct request *req, 
 			     struct bio *bio)
 {
-	if (req->nr_sectors + bio_sectors(bio) > q->max_sectors) {
+	if (req->nr_sectors + bio_sectors(bio) > q->limits.max_sectors) {
 		req->flags |= REQ_NOMERGE;
 		q->last_merge = NULL;
 		return 0;
@@ -915,21 +915,21 @@
 	/*
 	 * Will it become to large?
 	 */
-	if ((req->nr_sectors + next->nr_sectors) > q->max_sectors)
+	if ((req->nr_sectors + next->nr_sectors) > q->limits.max_sectors)
 		return 0;
 
 	total_phys_segments = req->nr_phys_segments + next->nr_phys_segments;
 	if (blk_phys_contig_segment(q, req->biotail, next->bio))
 		total_phys_segments--;
 
-	if (total_phys_segments > q->max_phys_segments)
+	if (total_phys_segments > q->limits.max_phys_segments)
 		return 0;
 
 	total_hw_segments = req->nr_hw_segments + next->nr_hw_segments;
 	if (blk_hw_contig_segment(q, req->biotail, next->bio))
 		total_hw_segments--;
 
-	if (total_hw_segments > q->max_hw_segments)
+	if (total_hw_segments > q->limits.max_hw_segments)
 		return 0;
 
 	/* Merge is OK... */
@@ -1910,11 +1910,11 @@
 			break;
 		}
 
-		if (unlikely(bio_sectors(bio) > q->max_sectors)) {
+		if (unlikely(bio_sectors(bio) > q->limits.max_sectors)) {
 			printk("bio too big device %s (%u > %u)\n", 
 			       bdevname(bio->bi_bdev),
 			       bio_sectors(bio),
-			       q->max_sectors);
+			       q->limits.max_sectors);
 			goto end_io;
 		}
 
--- linux-2.5.45/drivers/md/dm-table.c	2002-10-30 16:42:54.000000000 -0800
+++ linux/drivers/md/dm-table.c	2002-11-02 04:44:06.000000000 -0800
@@ -465,16 +465,17 @@
 	int r = __table_get_device(ti->table, ti, path,
 				   start, len, mode, result);
 	if (!r) {
-		request_queue_t *q = bdev_get_queue((*result)->bdev);
+		request_queue_t *qlim =
+			&bdev_get_queue((*result)->bdev)->limits;
 		struct io_restrictions *rs = &ti->limits;
 
 		/* combine the device limits low */
-		__LOW(&rs->max_sectors, q->max_sectors);
-		__LOW(&rs->max_phys_segments, q->max_phys_segments);
-		__LOW(&rs->max_hw_segments, q->max_hw_segments);
-		__HIGH(&rs->hardsect_size, q->hardsect_size);
-		__LOW(&rs->max_segment_size, q->max_segment_size);
-		__LOW(&rs->seg_boundary_mask, q->seg_boundary_mask);
+		__LOW(&rs->max_sectors, qlim->max_sectors);
+		__LOW(&rs->max_phys_segments, qlim->max_phys_segments);
+		__LOW(&rs->max_hw_segments, qlim->max_hw_segments);
+		__HIGH(&rs->hardsect_size, qlim->hardsect_size);
+		__LOW(&rs->max_segment_size, qlim->max_segment_size);
+		__LOW(&rs->seg_boundary_mask, qlim->seg_boundary_mask);
 	}
 
 	return r;
@@ -703,13 +704,8 @@
 	 * Make sure we obey the optimistic sub devices
 	 * restrictions.
 	 */
-	q->max_sectors = t->limits.max_sectors;
-	q->max_phys_segments = t->limits.max_phys_segments;
-	q->max_hw_segments = t->limits.max_hw_segments;
-	q->hardsect_size = t->limits.hardsect_size;
-	q->max_segment_size = t->limits.max_segment_size;
-	q->seg_boundary_mask = t->limits.seg_boundary_mask;
+	q->limits = t->limits;
 }
 
 unsigned int dm_table_get_num_targets(struct dm_table *t)
--- linux-2.5.45/fs/bio.c	2002-10-30 16:43:00.000000000 -0800
+++ linux/fs/bio.c	2002-11-02 07:50:30.000000000 -0800
@@ -352,14 +352,14 @@
  */
 int bio_get_nr_vecs(struct block_device *bdev)
 {
-	request_queue_t *q = bdev_get_queue(bdev);
+	struct io_restrictions *limit	= &bdev_get_queue(bdev)->limits;
 	int nr_pages;
 
-	nr_pages = ((q->max_sectors << 9) + PAGE_SIZE - 1) >> PAGE_SHIFT;
-	if (nr_pages > q->max_phys_segments)
-		nr_pages = q->max_phys_segments;
-	if (nr_pages > q->max_hw_segments)
-		nr_pages = q->max_hw_segments;
+	nr_pages = ((limit->max_sectors << 9) + PAGE_SIZE - 1) >> PAGE_SHIFT;
+	if (nr_pages > limit->max_phys_segments)
+		nr_pages = limit->max_phys_segments;
+	if (nr_pages > limit->max_hw_segments)
+		nr_pages = limit->max_hw_segments;
 
 	return nr_pages;
 }
@@ -391,7 +391,7 @@
 	if (bio->bi_vcnt >= bio->bi_max_vecs)
 		return 0;
 
-	if (((bio->bi_size + len) >> 9) > q->max_sectors)
+	if (((bio->bi_size + len) >> 9) > q->limits.max_sectors)
 		return 0;
 
 	/*
@@ -399,9 +399,9 @@
 	 * make this too complex.
 	 */
 retry_segments:
-	if (bio_phys_segments(q, bio) >= q->max_phys_segments
-	    || bio_hw_segments(q, bio) >= q->max_hw_segments)
+	if (bio_phys_segments(q, bio) >= q->limits.max_phys_segments
+	    || bio_hw_segments(q, bio) >= q->limits.max_hw_segments)
 		fail_segments = 1;
 
 	if (fail_segments) {
--- linux-2.5.45/drivers/block/cciss.c	2002-10-30 16:43:44.000000000 -0800
+++ linux/drivers/block/cciss.c	2002-11-02 10:45:50.000000000 -0800
@@ -763,7 +763,7 @@
 		drive_info_struct *drv = &(hba[ctlr]->drv[i]);
 		if (!drv->nr_blocks)
 			continue;
-		hba[ctlr]->queue.hardsect_size = drv->block_size;
+		blk_queue_hardsect_size(&hba[ctlr]->queue, drv->block_size);
 		set_capacity(disk, drv->nr_blocks);
 		add_disk(disk);
 	}
@@ -2441,7 +2441,7 @@
 		disk->private_data = drv;
 		if( !(drv->nr_blocks))
 			continue;
-		hba[i]->queue.hardsect_size = drv->block_size;
+		blk_queue_hardsect_size(&hba[i]->queue, drv->block_size);
 		set_capacity(disk, drv->nr_blocks);
 		add_disk(disk);
 	}
--- linux-2.5.45/drivers/block/cpqarray.c	2002-10-30 16:41:56.000000000 -0800
+++ linux/drivers/block/cpqarray.c	2002-11-02 10:48:56.000000000 -0800
@@ -409,7 +409,7 @@
 			disk->fops = &ida_fops; 
 			if (!drv->nr_blks)
 				continue;
-			hba[i]->queue.hardsect_size = drv->blk_size;
+			blk_queue_hardsect_size(&hba[i]->queue, drv->blk_size);
 			set_capacity(disk, drv->nr_blks);
 			disk->queue = &hba[i]->queue;
 			disk->private_data = drv;
@@ -1438,7 +1438,7 @@
 		drv_info_t *drv = &hba[ctlr]->drv[i];
 		if (!drv->nr_blks)
 			continue;
-		hba[ctlr]->queue.hardsect_size = drv->blk_size;
+		blk_queue_hardsect_size(&hba[ctlr]->queue, drv->blk_size);
 		set_capacity(disk, drv->nr_blks);
 		disk->queue = &hba[ctlr]->queue;
 		disk->private_data = drv;

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: Patch(2.5.45): move io_restrictions to blkdev.h
  2002-11-02 18:51 Patch(2.5.45): move io_restrictions to blkdev.h Adam J. Richter
@ 2002-11-02 21:40 ` Jens Axboe
  0 siblings, 0 replies; 5+ messages in thread
From: Jens Axboe @ 2002-11-02 21:40 UTC (permalink / raw)
  To: Adam J. Richter; +Cc: thornber, linux-kernel

On Sat, Nov 02 2002, Adam J. Richter wrote:
> 	This patch makes good on a threat that I posted yesterday
> to move struct io_restrictions from <linux/device-mapper.h> to
> <linux/blkdev.h>, eliminating duplication of a list of fields in
> struct request_queue.

Adam, I generally think the patch is a good idea. I also think it's a
very stupid time to start messing with stuff that is basically trivial
but still touches lost of stuff.

Please leave it alone for a few weeks.

> 	Jens, can I persuade you to integrate this change?

In due time, yes.

-- 
Jens Axboe


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: Patch(2.5.45): move io_restrictions to blkdev.h
@ 2002-11-03  8:48 Adam J. Richter
  2002-11-03 16:23 ` Joe Thornber
  0 siblings, 1 reply; 5+ messages in thread
From: Adam J. Richter @ 2002-11-03  8:48 UTC (permalink / raw)
  To: axboe; +Cc: linux-kernel, thornber

Jens Axboe wrote:
>On Sat, Nov 02 2002, Adam J. Richter wrote:
>> 	This patch makes good on a threat that I posted yesterday
>> to move struct io_restrictions from <linux/device-mapper.h> to
>> <linux/blkdev.h>, eliminating duplication of a list of fields in
>> struct request_queue.

>Adam, I generally think the patch is a good idea. I also think it's a
>very stupid time to start messing with stuff that is basically trivial
>but still touches lost of stuff.

	It's pretty much simple string substitution and it doesn't
touch that many files, but OK.

>Please leave it alone for a few weeks.

>> 	Jens, can I persuade you to integrate this change?

>In due time, yes.

	Great.  The only thing I was going to do that might depend
on this patch is try to port /dev/loop to device mapper, and I may
be able to eliminate the affected code anyhow.

	I've checked in the change and will continue running it in the
meantime.  Unless I hear otherwise or run into a problem with this
patch, I'll plan to resubmit it around November 24.

Adam J. Richter     __     ______________   575 Oroville Road
adam@yggdrasil.com     \ /                  Milpitas, California 95035
+1 408 309-6081         | g g d r a s i l   United States of America
                         "Free Software For The Rest Of Us."



^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: Patch(2.5.45): move io_restrictions to blkdev.h
  2002-11-03  8:48 Adam J. Richter
@ 2002-11-03 16:23 ` Joe Thornber
  0 siblings, 0 replies; 5+ messages in thread
From: Joe Thornber @ 2002-11-03 16:23 UTC (permalink / raw)
  To: Adam J. Richter; +Cc: axboe, linux-kernel

On Sun, Nov 03, 2002 at 12:48:30AM -0800, Adam J. Richter wrote:
> 	Great.  The only thing I was going to do that might depend
> on this patch is try to port /dev/loop to device mapper, and I may
> be able to eliminate the affected code anyhow.

This makes me uneasy, do you mean you want to:

i) make a 'loop' target, if so why ?

ii) or that you want to rewrite loop so that it sits on top of dm -
    ie. you create a set of linear mappings that correspond to the
    file ?   This would only be sensible if there is significant
    simplification/reduction of the loop code, and probably would
    never work because of tail packing.

I'm not keen on either of these ideas.

- Joe

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: Patch(2.5.45): move io_restrictions to blkdev.h
@ 2002-11-03 22:03 Adam J. Richter
  0 siblings, 0 replies; 5+ messages in thread
From: Adam J. Richter @ 2002-11-03 22:03 UTC (permalink / raw)
  To: joe; +Cc: axboe, linux-kernel

>On Sun, Nov 03, 2002 at 12:48:30AM -0800, Adam J. Richter wrote:
>> 	Great.  The only thing I was going to do that might depend
>> on this patch is try to port /dev/loop to device mapper, and I may
>> be able to eliminate the affected code anyhow.

>This makes me uneasy, do you mean you want to:

>i) make a 'loop' target, if so why ?

	I believe I can eliminate some block device initialization
code and also eliminate some ioctls that allow for a lot of number
configured states for a loop device and bloat loop.c with some
features nobody uses (for example, there is an unused facility to
"name" each loop device).  I would like to invent as little new API as
possible.  Also, of much less importance, adopting this change would
relinquish a major device number.

	I was going to have the map function always return 0 (i.e., it
will submit the IO itself).  Given device-mapper with linear mapping,
I don't think anyone will need to use loop just to map a device to a
device with no data transformation, so there is no need for loop
optimize for that case.

	If you want to point out specific technical problems with this
or have other advice, great.  Otherwise, I expect that just trying to
implement it will either show me some problem with it or will result
in a patch that should clarify what I am talking about for you.

	By the way, one change to DM that might be useful for other
targets as well as loop.c would be to move the map function from
target_type to dm_target.  This can potentially be used to eliminate
some branches in the IO path based on configuration options that were
passed to the constructor function.  For loop.c, I am thinking of
file backed versus device backed.  I could also imagine raid schemes
that might optimize their map functions differently for different
segment sizes.

Adam J. Richter     __     ______________   575 Oroville Road
adam@yggdrasil.com     \ /                  Milpitas, California 95035
+1 408 309-6081         | g g d r a s i l   United States of America
                         "Free Software For The Rest Of Us."

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2002-11-03 21:57 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2002-11-02 18:51 Patch(2.5.45): move io_restrictions to blkdev.h Adam J. Richter
2002-11-02 21:40 ` Jens Axboe
  -- strict thread matches above, loose matches on Subject: below --
2002-11-03  8:48 Adam J. Richter
2002-11-03 16:23 ` Joe Thornber
2002-11-03 22:03 Adam J. Richter

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.