Hi Daniel, It is very cumbersome to deal with small (512, 1024 or 2048) blocksize. I used fixed size (4096 bytes) block to save the exception list. If the blocksize is 512 byte, I have to invoke __getblk() 8 times to read the exception list. And what more cumbersome is, my exception list struct might scatter in 8 non-continuous memory segments. In my code, each exception is presented by a 6-bytes struct. 4K block can present an exception list containing at most about 670 exceptions. If I used 512 bytes block to present an exception list, the number is just about 80. That is too small. So, it's really a big favor to me if __getblk() could read 4K buffer head in any case. PS: There is no other kernel component have the demand like my case? I am learning ext FS code now. Regards. Cong Meng. On Fri, Oct 8, 2010 at 5:31 AM, Daniel Phillips <phillips@xxxxxxxxx> wrote: > Hi Meng, > > The patch looks sensible, however the question is: why do you want to > do this? Would it not be better to generalize your metadata format to > accomodate the device's native blocksize? > > Regards, > > Daniel > >> a kernel patch >> -------------- >> Now, dm-snap-mv highly depends on a kernel patch below, which make __getblk() >> can get a 4K buffer head while block size of the disk is NOT 4K. >> >> Signed-off-by: Cong Meng <mcpacino@xxxxxxxxx> >> --- >> fs/buffer.c | 7 ++----- >> 1 files changed, 2 insertions(+), 5 deletions(-) >> >> diff --git a/fs/buffer.c b/fs/buffer.c >> index 3e7dca2..f7f9d33 100644 >> --- a/fs/buffer.c >> +++ b/fs/buffer.c >> @@ -1051,10 +1051,7 @@ grow_buffers(struct block_device *bdev, sector_t block, int size) >> pgoff_t index; >> int sizebits; >> >> - sizebits = -1; >> - do { >> - sizebits++; >> - } while ((size << sizebits) < PAGE_SIZE); >> + sizebits = PAGE_CACHE_SHIFT - bdev->bd_inode->i_blkbits; >> >> index = block >> sizebits; >> >> @@ -2924,7 +2921,7 @@ int submit_bh(int rw, struct buffer_head * bh) >> */ >> bio = bio_alloc(GFP_NOIO, 1); >> >> - bio->bi_sector = bh->b_blocknr * (bh->b_size >> 9); >> + bio->bi_sector = bh->b_blocknr << (bh->b_bdev->bd_inode->i_blkbits - 9); >> bio->bi_bdev = bh->b_bdev; >> bio->bi_io_vec[0].bv_page = bh->b_page; >> bio->bi_io_vec[0].bv_len = bh->b_size; > -- dm-devel mailing list dm-devel@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/dm-devel