ramdisk: use kmap_atomic() in rd_blkdev_pagecache_IO() We don't actualy need to kmap the blockdev inode's pages at all, because they're ~__GFP_HIGHMEM. But it's future-safe, and cheap. --- 25-akpm/drivers/block/rd.c | 19 +++++++++---------- 1 files changed, 9 insertions(+), 10 deletions(-) diff -puN drivers/block/rd.c~ramdisk-use-kmap_atomic drivers/block/rd.c --- 25/drivers/block/rd.c~ramdisk-use-kmap_atomic 2004-05-18 02:22:01.112108008 -0700 +++ 25-akpm/drivers/block/rd.c 2004-05-18 02:22:49.291783584 -0700 @@ -168,7 +168,7 @@ static struct address_space_operations r static int rd_blkdev_pagecache_IO(int rw, struct bio_vec *vec, sector_t sector, struct address_space *mapping) { - unsigned long index = sector >> (PAGE_CACHE_SHIFT - 9); + pgoff_t index = sector >> (PAGE_CACHE_SHIFT - 9); unsigned int vec_offset = vec->bv_offset; int offset = (sector << 9) & ~PAGE_CACHE_MASK; int size = vec->bv_len; @@ -199,25 +199,24 @@ static int rd_blkdev_pagecache_IO(int rw index++; if (rw == READ) { - src = kmap(page) + offset; - dst = kmap(vec->bv_page) + vec_offset; + src = kmap_atomic(page, KM_USER0) + offset; + dst = kmap_atomic(vec->bv_page, KM_USER1) + vec_offset; } else { - dst = kmap(page) + offset; - src = kmap(vec->bv_page) + vec_offset; + src = kmap_atomic(vec->bv_page, KM_USER0) + vec_offset; + dst = kmap_atomic(page, KM_USER1) + offset; } offset = 0; vec_offset += count; memcpy(dst, src, count); - kunmap(page); - kunmap(vec->bv_page); + kunmap_atomic(src, KM_USER0); + kunmap_atomic(dst, KM_USER1); - if (rw == READ) { + if (rw == READ) flush_dcache_page(vec->bv_page); - } else { + else set_page_dirty(page); - } unlock_page(page); put_page(page); } while (size); _