From bde85a7cc086d7e7ef01c7292d3192f3b8599190 Mon Sep 17 00:00:00 2001 From: Ben Gras Date: Tue, 19 Nov 2013 15:59:52 +0000 Subject: [PATCH] libminixfs: allow non-pagesize-multiple FSes . then peek & mmap doesn't work though Change-Id: Iecb1c8090f5e0be28da8f5181bb35084eb18f67b --- lib/libminixfs/cache.c | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/lib/libminixfs/cache.c b/lib/libminixfs/cache.c index 02d496aa9..b7af1bdbb 100644 --- a/lib/libminixfs/cache.c +++ b/lib/libminixfs/cache.c @@ -161,8 +161,12 @@ free_unused_blocks(void) static void lmfs_alloc_block(struct buf *bp) { + int len; ASSERT(!bp->data); ASSERT(bp->lmfs_bytes == 0); + + len = roundup(fs_block_size, PAGE_SIZE); + if((bp->data = minix_mmap(0, fs_block_size, PROT_READ|PROT_WRITE, MAP_PREALLOC|MAP_ANON, -1, 0)) == MAP_FAILED) { free_unused_blocks(); @@ -191,9 +195,12 @@ void minix_munmap_t(void *a, int len) assert(a); assert(a != MAP_FAILED); assert(len > 0); - assert(!(len % PAGE_SIZE)); assert(!(av % PAGE_SIZE)); + len = roundup(len, PAGE_SIZE); + + assert(!(len % PAGE_SIZE)); + if(minix_munmap(a, len) < 0) panic("libminixfs cache: munmap failed"); } @@ -638,9 +645,8 @@ void lmfs_rw_scattered( } assert(dev != NO_DEV); - assert(!(fs_block_size % PAGE_SIZE)); assert(fs_block_size > 0); - iov_per_block = fs_block_size / PAGE_SIZE; + iov_per_block = roundup(fs_block_size, PAGE_SIZE) / PAGE_SIZE; /* (Shell) sort buffers on lmfs_blocknr. */ gap = 1; @@ -669,19 +675,24 @@ void lmfs_rw_scattered( int r; for (iop = iovec; nblocks < bufqsize; nblocks++) { int p; - vir_bytes vdata; + vir_bytes vdata, blockrem; bp = bufq[nblocks]; if (bp->lmfs_blocknr != (block_t) bufq[0]->lmfs_blocknr + nblocks) break; if(niovecs >= NR_IOREQS-iov_per_block) break; vdata = (vir_bytes) bp->data; + blockrem = fs_block_size; for(p = 0; p < iov_per_block; p++) { + vir_bytes chunk = blockrem < PAGE_SIZE ? blockrem : PAGE_SIZE; iop->iov_addr = vdata; - iop->iov_size = PAGE_SIZE; + iop->iov_size = chunk; vdata += PAGE_SIZE; + blockrem -= chunk; iop++; niovecs++; } + assert(p == iov_per_block); + assert(blockrem == 0); } assert(nblocks > 0); @@ -825,7 +836,7 @@ void lmfs_set_blocksize(int new_block_size, int major) vmcache = 0; - if(may_use_vmcache) + if(may_use_vmcache && !(new_block_size % PAGE_SIZE)) vmcache = 1; } @@ -932,6 +943,10 @@ int lmfs_do_bpeek(message *m) assert(fs_block_size > 0); assert(dev != NO_DEV); + if(!vmcache) { return ENXIO; } + + assert(!(fs_block_size % PAGE_SIZE)); + if((extra=(pos % fs_block_size))) { pos -= extra; len += extra;