[PATCH] v2.5.1-pre10-01_kvec.diff

Benjamin LaHaise (bcrl@redhat.com)
Wed, 12 Dec 2001 13:47:54 -0500


Hello again,

This patch follows on top of 00_kvec.diff to rename the bio_vec users to
kveclets since nobody objected. It still boots on my test box...

-ben

... v2.5.1-pre10-01_kvec.diff ...

diff -urN 00_kvec-v2.5.1-pre10/drivers/block/ll_rw_blk.c 01_kvec-v2.5.1-pre10/drivers/block/ll_rw_blk.c
--- 00_kvec-v2.5.1-pre10/drivers/block/ll_rw_blk.c Tue Dec 11 22:18:55 2001
+++ 01_kvec-v2.5.1-pre10/drivers/block/ll_rw_blk.c Wed Dec 12 13:38:59 2001
@@ -318,7 +318,7 @@

void blk_recount_segments(request_queue_t *q, struct bio *bio)
{
- struct bio_vec *bv, *bvprv = NULL;
+ struct kveclet *bv, *bvprv = NULL;
int i, nr_segs, seg_size, cluster;

if (unlikely(!bio->bi_io_vec))
@@ -328,14 +328,14 @@
seg_size = nr_segs = 0;
bio_for_each_segment(bv, bio, i) {
if (bvprv && cluster) {
- if (seg_size + bv->bv_len > q->max_segment_size)
+ if (seg_size + bv->length > q->max_segment_size)
goto new_segment;
if (!BIOVEC_MERGEABLE(bvprv, bv))
goto new_segment;
if (!BIOVEC_SEG_BOUNDARY(q, bvprv, bv))
goto new_segment;

- seg_size += bv->bv_len;
+ seg_size += bv->length;
bvprv = bv;
continue;
}
@@ -377,7 +377,7 @@
*/
int blk_rq_map_sg(request_queue_t *q, struct request *rq, struct scatterlist *sg)
{
- struct bio_vec *bvec, *bvprv;
+ struct kveclet *bvec, *bvprv;
struct bio *bio;
int nsegs, i, cluster;

@@ -393,7 +393,7 @@
* for each segment in bio
*/
bio_for_each_segment(bvec, bio, i) {
- int nbytes = bvec->bv_len;
+ int nbytes = bvec->length;

if (bvprv && cluster) {
if (sg[nsegs - 1].length + nbytes > q->max_segment_size)
@@ -413,9 +413,9 @@
}

sg[nsegs].address = NULL;
- sg[nsegs].page = bvec->bv_page;
+ sg[nsegs].page = bvec->page;
sg[nsegs].length = nbytes;
- sg[nsegs].offset = bvec->bv_offset;
+ sg[nsegs].offset = bvec->offset;

nsegs++;
}
@@ -964,7 +964,7 @@

sector = bio->bi_sector;
nr_sectors = bio_sectors(bio);
- cur_nr_sectors = bio_iovec(bio)->bv_len >> 9;
+ cur_nr_sectors = bio_iovec(bio)->length >> 9;
rw = bio_data_dir(bio);

/*
@@ -1303,9 +1303,9 @@

bio->bi_sector = bh->b_blocknr * (bh->b_size >> 9);
bio->bi_dev = bh->b_dev;
- bio->bi_io_vec[0].bv_page = bh->b_page;
- bio->bi_io_vec[0].bv_len = bh->b_size;
- bio->bi_io_vec[0].bv_offset = bh_offset(bh);
+ bio->bi_io_vec[0].page = bh->b_page;
+ bio->bi_io_vec[0].length = bh->b_size;
+ bio->bi_io_vec[0].offset = bh_offset(bh);

bio->bi_vcnt = 1;
bio->bi_idx = 0;
@@ -1434,7 +1434,7 @@
rq->sector = rq->hard_sector;
rq->nr_sectors = rq->hard_nr_sectors;

- rq->current_nr_sectors = bio_iovec(rq->bio)->bv_len >> 9;
+ rq->current_nr_sectors = bio_iovec(rq->bio)->length >> 9;
rq->hard_cur_sectors = rq->current_nr_sectors;

/*
@@ -1476,9 +1476,9 @@

total_nsect = 0;
while ((bio = req->bio)) {
- nsect = bio_iovec(bio)->bv_len >> 9;
+ nsect = bio_iovec(bio)->length >> 9;

- BIO_BUG_ON(bio_iovec(bio)->bv_len > bio->bi_size);
+ BIO_BUG_ON(bio_iovec(bio)->length > bio->bi_size);

/*
* not a complete bvec done
@@ -1487,8 +1487,8 @@
int residual = (nsect - nr_sectors) << 9;

bio->bi_size -= residual;
- bio_iovec(bio)->bv_offset += residual;
- bio_iovec(bio)->bv_len -= residual;
+ bio_iovec(bio)->offset += residual;
+ bio_iovec(bio)->length -= residual;
blk_recalc_request(req, nr_sectors);
return 1;
}
@@ -1496,7 +1496,7 @@
/*
* account transfer
*/
- bio->bi_size -= bio_iovec(bio)->bv_len;
+ bio->bi_size -= bio_iovec(bio)->length;
bio->bi_idx++;

nr_sectors -= nsect;
diff -urN 00_kvec-v2.5.1-pre10/drivers/block/loop.c 01_kvec-v2.5.1-pre10/drivers/block/loop.c
--- 00_kvec-v2.5.1-pre10/drivers/block/loop.c Tue Dec 11 22:18:55 2001
+++ 01_kvec-v2.5.1-pre10/drivers/block/loop.c Wed Dec 12 13:38:59 2001
@@ -335,7 +335,7 @@
if (bio && bio->bi_end_io == loop_end_io_transfer) {
int i;
for (i = 0; i < bio->bi_vcnt; i++)
- __free_page(bio->bi_io_vec[i].bv_page);
+ __free_page(bio->bi_io_vec[i].page);

bio_put(bio);
}
@@ -496,15 +496,15 @@
struct bio *rbh)
{
unsigned long IV = loop_get_iv(lo, rbh->bi_sector);
- struct bio_vec *to;
+ struct kveclet *to;
char *vto, *vfrom;
int ret = 0, i;

bio_for_each_segment(to, bio, i) {
- vfrom = page_address(rbh->bi_io_vec[i].bv_page) + rbh->bi_io_vec[i].bv_offset;
- vto = page_address(to->bv_page) + to->bv_offset;
+ vfrom = page_address(rbh->bi_io_vec[i].page) + rbh->bi_io_vec[i].offset;
+ vto = page_address(to->page) + to->offset;
ret |= lo_do_transfer(lo, bio_data_dir(bio), vto, vfrom,
- to->bv_len, IV);
+ to->length, IV);
}

return ret;
diff -urN 00_kvec-v2.5.1-pre10/drivers/block/nbd.c 01_kvec-v2.5.1-pre10/drivers/block/nbd.c
--- 00_kvec-v2.5.1-pre10/drivers/block/nbd.c Tue Dec 11 22:18:55 2001
+++ 01_kvec-v2.5.1-pre10/drivers/block/nbd.c Wed Dec 12 13:38:59 2001
@@ -173,13 +173,13 @@
* whether to set MSG_MORE or not...
*/
rq_for_each_bio(bio, req) {
- struct bio_vec *bvec;
+ struct kveclet *bvec;
bio_for_each_segment(bvec, bio, i) {
flags = 0;
if ((i < (bio->bi_vcnt - 1)) || bio->bi_next)
flags = MSG_MORE;
DEBUG("data, ");
- result = nbd_xmit(1, sock, page_address(bvec->bv_page) + bvec->bv_offset, bvec->bv_len, flags);
+ result = nbd_xmit(1, sock, page_address(bvec->page) + bvec->offset, bvec->length, flags);
if (result <= 0)
FAIL("Send data failed.");
}
diff -urN 00_kvec-v2.5.1-pre10/drivers/block/rd.c 01_kvec-v2.5.1-pre10/drivers/block/rd.c
--- 00_kvec-v2.5.1-pre10/drivers/block/rd.c Tue Dec 11 22:18:55 2001
+++ 01_kvec-v2.5.1-pre10/drivers/block/rd.c Wed Dec 12 13:38:59 2001
@@ -228,7 +228,7 @@
commit_write: ramdisk_commit_write,
};

-static int rd_blkdev_pagecache_IO(int rw, struct bio_vec *vec,
+static int rd_blkdev_pagecache_IO(int rw, struct kveclet *vec,
sector_t sector, int minor)
{
struct address_space * mapping;
@@ -240,7 +240,7 @@

index = sector >> (PAGE_CACHE_SHIFT - 9);
offset = (sector << 9) & ~PAGE_CACHE_MASK;
- size = vec->bv_len;
+ size = vec->length;

do {
int count;
@@ -277,18 +277,18 @@
if (rw == READ) {
src = kmap(page);
src += offset;
- dst = kmap(vec->bv_page) + vec->bv_offset;
+ dst = kmap(vec->page) + vec->offset;
} else {
dst = kmap(page);
dst += offset;
- src = kmap(vec->bv_page) + vec->bv_offset;
+ src = kmap(vec->page) + vec->offset;
}
offset = 0;

memcpy(dst, src, count);

kunmap(page);
- kunmap(vec->bv_page);
+ kunmap(vec->page);

if (rw == READ) {
flush_dcache_page(page);
@@ -306,7 +306,7 @@

static int rd_blkdev_bio_IO(struct bio *bio, unsigned int minor)
{
- struct bio_vec *bvec;
+ struct kveclet *bvec;
sector_t sector;
int ret = 0, i, rw;

@@ -314,7 +314,7 @@
rw = bio_data_dir(bio);
bio_for_each_segment(bvec, bio, i) {
ret |= rd_blkdev_pagecache_IO(rw, bvec, sector, minor);
- sector += bvec->bv_len >> 9;
+ sector += bvec->length >> 9;
}

return ret;
diff -urN 00_kvec-v2.5.1-pre10/drivers/md/lvm.c 01_kvec-v2.5.1-pre10/drivers/md/lvm.c
--- 00_kvec-v2.5.1-pre10/drivers/md/lvm.c Tue Dec 11 22:18:55 2001
+++ 01_kvec-v2.5.1-pre10/drivers/md/lvm.c Wed Dec 12 13:38:59 2001
@@ -1,5 +1,5 @@
/*
- * kernel/lvm.c
+ * linux/drivers/md/lvm.c
*
* Copyright (C) 1997 - 2000 Heinz Mauelshagen, Sistina Software
*
@@ -1043,7 +1043,7 @@

memset(&bio,0,sizeof(bio));
bio.bi_dev = inode->i_rdev;
- bio.bi_io_vec.bv_len = lvm_get_blksize(bio.bi_dev);
+ bio.bi_io_vec.length = lvm_get_blksize(bio.bi_dev);
bio.bi_sector = block * bio_sectors(&bio);
bio.bi_rw = READ;
if ((err=lvm_map(&bio)) < 0) {
diff -urN 00_kvec-v2.5.1-pre10/drivers/scsi/ide-scsi.c 01_kvec-v2.5.1-pre10/drivers/scsi/ide-scsi.c
--- 00_kvec-v2.5.1-pre10/drivers/scsi/ide-scsi.c Tue Dec 11 22:18:56 2001
+++ 01_kvec-v2.5.1-pre10/drivers/scsi/ide-scsi.c Wed Dec 12 13:38:59 2001
@@ -718,9 +718,9 @@
offset = (unsigned long) sg->address & ~PAGE_MASK;
}

- bh->bi_io_vec[0].bv_page = page;
- bh->bi_io_vec[0].bv_len = sg->length;
- bh->bi_io_vec[0].bv_offset = offset;
+ bh->bi_io_vec[0].page = page;
+ bh->bi_io_vec[0].length = sg->length;
+ bh->bi_io_vec[0].offset = offset;
bh->bi_size = sg->length;
bh = bh->bi_next;
/*
@@ -736,9 +736,9 @@
#if IDESCSI_DEBUG_LOG
printk ("ide-scsi: %s: building DMA table for a single buffer (%dkB)\n", drive->name, pc->request_transfer >> 10);
#endif /* IDESCSI_DEBUG_LOG */
- bh->bi_io_vec[0].bv_page = virt_to_page(pc->scsi_cmd->request_buffer);
- bh->bi_io_vec[0].bv_len = pc->request_transfer;
- bh->bi_io_vec[0].bv_offset = (unsigned long) pc->scsi_cmd->request_buffer & ~PAGE_MASK;
+ bh->bi_io_vec[0].page = virt_to_page(pc->scsi_cmd->request_buffer);
+ bh->bi_io_vec[0].length = pc->request_transfer;
+ bh->bi_io_vec[0].offset = (unsigned long) pc->scsi_cmd->request_buffer & ~PAGE_MASK;
bh->bi_size = pc->request_transfer;
}
return first_bh;
diff -urN 00_kvec-v2.5.1-pre10/drivers/scsi/scsi_merge.c 01_kvec-v2.5.1-pre10/drivers/scsi/scsi_merge.c
--- 00_kvec-v2.5.1-pre10/drivers/scsi/scsi_merge.c Tue Dec 11 22:18:56 2001
+++ 01_kvec-v2.5.1-pre10/drivers/scsi/scsi_merge.c Wed Dec 12 13:38:59 2001
@@ -138,7 +138,7 @@
int reqsize = 0;
int i;
struct bio *bio;
- struct bio_vec *bvec;
+ struct kveclet *bvec;

if (remainder)
reqsize = *remainder;
@@ -201,7 +201,7 @@
#ifdef DMA_CHUNK_SIZE

#define MERGEABLE_BUFFERS(X,Y) \
- ((((bvec_to_phys(__BVEC_END((X))) + __BVEC_END((X))->bv_len) | bio_to_phys((Y))) & (DMA_CHUNK_SIZE - 1)) == 0)
+ ((((bvec_to_phys(__BVEC_END((X))) + __BVEC_END((X))->length) | bio_to_phys((Y))) & (DMA_CHUNK_SIZE - 1)) == 0)

static inline int scsi_new_mergeable(request_queue_t * q,
struct request * req,
diff -urN 00_kvec-v2.5.1-pre10/fs/bio.c 01_kvec-v2.5.1-pre10/fs/bio.c
--- 00_kvec-v2.5.1-pre10/fs/bio.c Tue Dec 11 22:18:56 2001
+++ 01_kvec-v2.5.1-pre10/fs/bio.c Wed Dec 12 13:43:12 2001
@@ -58,10 +58,10 @@
kmem_cache_free(data, ptr);
}

-static inline struct bio_vec *bvec_alloc(int gfp_mask, int nr, int *idx)
+static inline struct kveclet *bvec_alloc(int gfp_mask, int nr, int *idx)
{
struct biovec_pool *bp;
- struct bio_vec *bvl;
+ struct kveclet *bvl;

/*
* see comment near bvec_pool_sizes define!
@@ -130,7 +130,7 @@
struct bio *bio_alloc(int gfp_mask, int nr_iovecs)
{
struct bio *bio = mempool_alloc(bio_pool, gfp_mask);
- struct bio_vec *bvl = NULL;
+ struct kveclet *bvl = NULL;

if (unlikely(!bio))
return NULL;
@@ -237,7 +237,7 @@
{
struct bio *b = bio_alloc(gfp_mask, bio->bi_vcnt);
unsigned long flags = 0; /* gcc silly */
- struct bio_vec *bv;
+ struct kveclet *bv;
int i;

if (unlikely(!b))
@@ -247,15 +247,15 @@
* iterate iovec list and alloc pages + copy data
*/
__bio_for_each_segment(bv, bio, i, 0) {
- struct bio_vec *bbv = &b->bi_io_vec[i];
+ struct kveclet *bbv = &b->bi_io_vec[i];
char *vfrom, *vto;

- bbv->bv_page = alloc_page(gfp_mask);
- if (bbv->bv_page == NULL)
+ bbv->page = alloc_page(gfp_mask);
+ if (bbv->page == NULL)
goto oom;

- bbv->bv_len = bv->bv_len;
- bbv->bv_offset = bv->bv_offset;
+ bbv->length = bv->length;
+ bbv->offset = bv->offset;

/*
* if doing a copy for a READ request, no need
@@ -265,18 +265,18 @@
continue;

if (gfp_mask & __GFP_WAIT) {
- vfrom = kmap(bv->bv_page);
- vto = kmap(bbv->bv_page);
+ vfrom = kmap(bv->page);
+ vto = kmap(bbv->page);
} else {
local_irq_save(flags);
- vfrom = kmap_atomic(bv->bv_page, KM_BIO_IRQ);
- vto = kmap_atomic(bbv->bv_page, KM_BIO_IRQ);
+ vfrom = kmap_atomic(bv->page, KM_BIO_IRQ);
+ vto = kmap_atomic(bbv->page, KM_BIO_IRQ);
}

- memcpy(vto + bbv->bv_offset, vfrom + bv->bv_offset, bv->bv_len);
+ memcpy(vto + bbv->offset, vfrom + bv->offset, bv->length);
if (gfp_mask & __GFP_WAIT) {
- kunmap(bbv->bv_page);
- kunmap(bv->bv_page);
+ kunmap(bbv->page);
+ kunmap(bv->page);
} else {
kunmap_atomic(vto, KM_BIO_IRQ);
kunmap_atomic(vfrom, KM_BIO_IRQ);
@@ -295,7 +295,7 @@

oom:
while (--i >= 0)
- __free_page(b->bi_io_vec[i].bv_page);
+ __free_page(b->bi_io_vec[i].page);

mempool_free(b, bio_pool);
return NULL;
@@ -347,7 +347,7 @@
void ll_rw_kio(int rw, struct kiobuf *kio, kdev_t dev, sector_t sector)
{
int i, offset, size, err, map_i, total_nr_pages, nr_pages;
- struct bio_vec *bvec;
+ struct kveclet *bvec;
struct bio *bio;

err = 0;
@@ -410,9 +410,9 @@
bio->bi_vcnt++;
bio->bi_size += nbytes;

- bvec->bv_page = kio->maplist[map_i];
- bvec->bv_len = nbytes;
- bvec->bv_offset = offset;
+ bvec->page = kio->maplist[map_i];
+ bvec->length = nbytes;
+ bvec->offset = offset;

/*
* kiobuf only has an offset into the first page
@@ -468,7 +468,7 @@
for (i = 0; i < BIOVEC_NR_POOLS; i++) {
struct biovec_pool *bp = bvec_array + i;

- size = bvec_pool_sizes[i] * sizeof(struct bio_vec);
+ size = bvec_pool_sizes[i] * sizeof(struct kveclet);

printk("biovec: init pool %d, %d entries, %d bytes\n", i,
bvec_pool_sizes[i], size);
diff -urN 00_kvec-v2.5.1-pre10/include/asm-i386/io.h 01_kvec-v2.5.1-pre10/include/asm-i386/io.h
--- 00_kvec-v2.5.1-pre10/include/asm-i386/io.h Tue Dec 11 22:18:56 2001
+++ 01_kvec-v2.5.1-pre10/include/asm-i386/io.h Wed Dec 12 13:39:29 2001
@@ -109,7 +109,7 @@
* constraints.
*/
#define BIOVEC_MERGEABLE(vec1, vec2) \
- ((bvec_to_phys((vec1)) + (vec1)->bv_len) == bvec_to_phys((vec2)))
+ ((bvec_to_phys((vec1)) + (vec1)->length) == bvec_to_phys((vec2)))

/*
* readX/writeX() are used to access memory mapped devices. On some
diff -urN 00_kvec-v2.5.1-pre10/include/asm-sparc64/io.h 01_kvec-v2.5.1-pre10/include/asm-sparc64/io.h
--- 00_kvec-v2.5.1-pre10/include/asm-sparc64/io.h Tue Dec 11 22:18:56 2001
+++ 01_kvec-v2.5.1-pre10/include/asm-sparc64/io.h Wed Dec 12 13:38:59 2001
@@ -22,7 +22,7 @@
#define page_to_phys(page) ((((page) - mem_map) << PAGE_SHIFT)+phys_base)

#define BIOVEC_MERGEABLE(vec1, vec2) \
- ((((bvec_to_phys((vec1)) + (vec1)->bv_len) | bvec_to_phys((vec2))) & (DMA_CHUNK_SIZE - 1)) == 0)
+ ((((bvec_to_phys((vec1)) + (vec1)->length) | bvec_to_phys((vec2))) & (DMA_CHUNK_SIZE - 1)) == 0)

/* Different PCI controllers we support have their PCI MEM space
* mapped to an either 2GB (Psycho) or 4GB (Sabre) aligned area,
diff -urN 00_kvec-v2.5.1-pre10/include/linux/bio.h 01_kvec-v2.5.1-pre10/include/linux/bio.h
--- 00_kvec-v2.5.1-pre10/include/linux/bio.h Tue Dec 11 22:18:56 2001
+++ 01_kvec-v2.5.1-pre10/include/linux/bio.h Wed Dec 12 13:39:26 2001
@@ -20,6 +20,10 @@
#ifndef __LINUX_BIO_H
#define __LINUX_BIO_H

+#ifndef __LINUX__KIOVEC_H
+#include <linux/kiovec.h>
+#endif
+
#define BIO_DEBUG

#ifdef BIO_DEBUG
@@ -31,15 +35,6 @@
#define BIO_MAX_SECTORS 128

/*
- * was unsigned short, but we might as well be ready for > 64kB I/O pages
- */
-struct bio_vec {
- struct page *bv_page;
- unsigned int bv_len;
- unsigned int bv_offset;
-};
-
-/*
* weee, c forward decl...
*/
struct bio;
@@ -59,14 +54,14 @@
* top bits priority
*/

- unsigned short bi_vcnt; /* how many bio_vec's */
+ unsigned short bi_vcnt; /* how many kveclet's */
unsigned short bi_idx; /* current index into bvl_vec */
unsigned short bi_hw_seg; /* actual mapped segments */
unsigned int bi_size; /* residual I/O count */
unsigned int bi_max; /* max bvl_vecs we can hold,
used as index into pool */

- struct bio_vec *bi_io_vec; /* the actual vec list */
+ struct kveclet *bi_io_vec; /* the actual vec list */

bio_end_io_t *bi_end_io;
atomic_t bi_cnt; /* pin count */
@@ -102,8 +97,8 @@
*/
#define bio_iovec_idx(bio, idx) (&((bio)->bi_io_vec[(idx)]))
#define bio_iovec(bio) bio_iovec_idx((bio), (bio)->bi_idx)
-#define bio_page(bio) bio_iovec((bio))->bv_page
-#define bio_offset(bio) bio_iovec((bio))->bv_offset
+#define bio_page(bio) bio_iovec((bio))->page
+#define bio_offset(bio) bio_iovec((bio))->offset
#define bio_sectors(bio) ((bio)->bi_size >> 9)
#define bio_data(bio) (page_address(bio_page((bio))) + bio_offset((bio)))
#define bio_barrier(bio) ((bio)->bi_rw & (1 << BIO_BARRIER))
@@ -112,7 +107,7 @@
* will die
*/
#define bio_to_phys(bio) (page_to_phys(bio_page((bio))) + (unsigned long) bio_offset((bio)))
-#define bvec_to_phys(bv) (page_to_phys((bv)->bv_page) + (unsigned long) (bv)->bv_offset)
+#define bvec_to_phys(bv) (page_to_phys((bv)->page) + (unsigned long) (bv)->offset)

/*
* queues that have highmem support enabled may still need to revert to
@@ -120,9 +115,9 @@
* permanent PIO fall back, user is probably better off disabling highmem
* I/O completely on that queue (see ide-dma for example)
*/
-#define __bio_kmap(bio, idx) (kmap(bio_iovec_idx((bio), (idx))->bv_page) + bio_iovec_idx((bio), (idx))->bv_offset)
+#define __bio_kmap(bio, idx) (kmap(bio_iovec_idx((bio), (idx))->page) + bio_iovec_idx((bio), (idx))->offset)
#define bio_kmap(bio) __bio_kmap((bio), (bio)->bi_idx)
-#define __bio_kunmap(bio, idx) kunmap(bio_iovec_idx((bio), (idx))->bv_page)
+#define __bio_kunmap(bio, idx) kunmap(bio_iovec_idx((bio), (idx))->page)
#define bio_kunmap(bio) __bio_kunmap((bio), (bio)->bi_idx)

/*
@@ -135,7 +130,7 @@
#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)
+ __BIO_SEG_BOUNDARY(bvec_to_phys((b1)), bvec_to_phys((b2)) + (b2)->length, (q)->seg_boundary_mask)
#define BIO_SEG_BOUNDARY(q, b1, b2) \
BIOVEC_SEG_BOUNDARY((q), __BVEC_END((b1)), __BVEC_START((b2)))

diff -urN 00_kvec-v2.5.1-pre10/mm/highmem.c 01_kvec-v2.5.1-pre10/mm/highmem.c
--- 00_kvec-v2.5.1-pre10/mm/highmem.c Tue Dec 11 22:18:56 2001
+++ 01_kvec-v2.5.1-pre10/mm/highmem.c Wed Dec 12 13:40:48 2001
@@ -226,7 +226,7 @@
{
unsigned char *vto, *vfrom;
unsigned long flags;
- struct bio_vec *tovec, *fromvec;
+ struct kveclet *tovec, *fromvec;
int i;

__bio_for_each_segment(tovec, to, i, 0) {
@@ -235,14 +235,14 @@
/*
* not bounced
*/
- if (tovec->bv_page == fromvec->bv_page)
+ if (tovec->page == fromvec->page)
continue;

- vfrom = page_address(fromvec->bv_page) + fromvec->bv_offset;
+ vfrom = page_address(fromvec->page) + fromvec->offset;

local_irq_save(flags);
- vto = kmap_atomic(tovec->bv_page, KM_BOUNCE_READ);
- memcpy(vto + tovec->bv_offset, vfrom, tovec->bv_len);
+ vto = kmap_atomic(tovec->page, KM_BOUNCE_READ);
+ memcpy(vto + tovec->offset, vfrom, tovec->length);
kunmap_atomic(vto, KM_BOUNCE_READ);
local_irq_restore(flags);
}
@@ -251,7 +251,7 @@
static inline int bounce_end_io (struct bio *bio, int nr_sectors)
{
struct bio *bio_orig = bio->bi_private;
- struct bio_vec *bvec, *org_vec;
+ struct kveclet *bvec, *org_vec;
int ret, i;

if (!test_bit(BIO_UPTODATE, &bio->bi_flags))
@@ -264,10 +264,10 @@
*/
__bio_for_each_segment(bvec, bio, i, 0) {
org_vec = &bio_orig->bi_io_vec[i];
- if (bvec->bv_page == org_vec->bv_page)
+ if (bvec->page == org_vec->page)
continue;

- mempool_free(bvec->bv_page, page_pool);
+ mempool_free(bvec->page, page_pool);
}

out_eio:
@@ -297,12 +297,12 @@
struct page *page;
struct bio *bio = NULL;
int i, rw = bio_data_dir(*bio_orig);
- struct bio_vec *to, *from;
+ struct kveclet *to, *from;

BUG_ON((*bio_orig)->bi_idx);

bio_for_each_segment(from, *bio_orig, i) {
- page = from->bv_page;
+ page = from->page;

/*
* is destination page below bounce pfn?
@@ -318,17 +318,17 @@

to = &bio->bi_io_vec[i];

- to->bv_page = mempool_alloc(page_pool, GFP_NOHIGHIO);
- to->bv_len = from->bv_len;
- to->bv_offset = from->bv_offset;
+ to->page = mempool_alloc(page_pool, GFP_NOHIGHIO);
+ to->length = from->length;
+ to->offset = from->offset;

if (rw & WRITE) {
char *vto, *vfrom;

- vto = page_address(to->bv_page) + to->bv_offset;
- vfrom = kmap(from->bv_page) + from->bv_offset;
- memcpy(vto, vfrom, to->bv_len);
- kunmap(from->bv_page);
+ vto = page_address(to->page) + to->offset;
+ vfrom = kmap(from->page) + from->offset;
+ memcpy(vto, vfrom, to->length);
+ kunmap(from->page);
}
}

@@ -344,10 +344,10 @@
*/
bio_for_each_segment(from, *bio_orig, i) {
to = &bio->bi_io_vec[i];
- if (!to->bv_page) {
- to->bv_page = from->bv_page;
- to->bv_len = from->bv_len;
- to->bv_offset = to->bv_offset;
+ if (!to->page) {
+ to->page = from->page;
+ to->length = from->length;
+ to->offset = to->offset;
}
}

diff -urN 00_kvec-v2.5.1-pre10/mm/memory.c 01_kvec-v2.5.1-pre10/mm/memory.c
--- 00_kvec-v2.5.1-pre10/mm/memory.c Wed Dec 12 13:17:06 2001
+++ 01_kvec-v2.5.1-pre10/mm/memory.c Wed Dec 12 13:38:59 2001
@@ -1455,14 +1455,14 @@
int i;
int datain = (rw == READ);
unsigned nr_pages;
+ const int mask = PAGE_SIZE - 1;

end = ptr + len;
if (end < ptr)
return ERR_PTR(-EINVAL);

- nr_pages = (ptr + len + PAGE_SIZE - 1) >> PAGE_SHIFT;
- nr_pages -= ptr >> PAGE_SHIFT;
- nr_pages ++;
+ nr_pages = ((ptr & mask) + len + mask) >> PAGE_SHIFT;
+ nr_pages ++; /* Padding for NULL page */
vec = kmalloc(sizeof(struct kvec) + nr_pages * sizeof(struct kveclet),
GFP_KERNEL);
if (!vec)
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/