libminixfs: allow non-pagesize-multiple FSes

. then peek & mmap doesn't work though

Change-Id: Iecb1c8090f5e0be28da8f5181bb35084eb18f67b
This commit is contained in:
Ben Gras 2013-11-19 15:59:52 +00:00
parent dff4ddaa7c
commit bde85a7cc0

View File

@ -161,8 +161,12 @@ free_unused_blocks(void)
static void static void
lmfs_alloc_block(struct buf *bp) lmfs_alloc_block(struct buf *bp)
{ {
int len;
ASSERT(!bp->data); ASSERT(!bp->data);
ASSERT(bp->lmfs_bytes == 0); ASSERT(bp->lmfs_bytes == 0);
len = roundup(fs_block_size, PAGE_SIZE);
if((bp->data = minix_mmap(0, fs_block_size, if((bp->data = minix_mmap(0, fs_block_size,
PROT_READ|PROT_WRITE, MAP_PREALLOC|MAP_ANON, -1, 0)) == MAP_FAILED) { PROT_READ|PROT_WRITE, MAP_PREALLOC|MAP_ANON, -1, 0)) == MAP_FAILED) {
free_unused_blocks(); free_unused_blocks();
@ -191,9 +195,12 @@ void minix_munmap_t(void *a, int len)
assert(a); assert(a);
assert(a != MAP_FAILED); assert(a != MAP_FAILED);
assert(len > 0); assert(len > 0);
assert(!(len % PAGE_SIZE));
assert(!(av % PAGE_SIZE)); assert(!(av % PAGE_SIZE));
len = roundup(len, PAGE_SIZE);
assert(!(len % PAGE_SIZE));
if(minix_munmap(a, len) < 0) if(minix_munmap(a, len) < 0)
panic("libminixfs cache: munmap failed"); panic("libminixfs cache: munmap failed");
} }
@ -638,9 +645,8 @@ void lmfs_rw_scattered(
} }
assert(dev != NO_DEV); assert(dev != NO_DEV);
assert(!(fs_block_size % PAGE_SIZE));
assert(fs_block_size > 0); 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. */ /* (Shell) sort buffers on lmfs_blocknr. */
gap = 1; gap = 1;
@ -669,19 +675,24 @@ void lmfs_rw_scattered(
int r; int r;
for (iop = iovec; nblocks < bufqsize; nblocks++) { for (iop = iovec; nblocks < bufqsize; nblocks++) {
int p; int p;
vir_bytes vdata; vir_bytes vdata, blockrem;
bp = bufq[nblocks]; bp = bufq[nblocks];
if (bp->lmfs_blocknr != (block_t) bufq[0]->lmfs_blocknr + nblocks) if (bp->lmfs_blocknr != (block_t) bufq[0]->lmfs_blocknr + nblocks)
break; break;
if(niovecs >= NR_IOREQS-iov_per_block) break; if(niovecs >= NR_IOREQS-iov_per_block) break;
vdata = (vir_bytes) bp->data; vdata = (vir_bytes) bp->data;
blockrem = fs_block_size;
for(p = 0; p < iov_per_block; p++) { for(p = 0; p < iov_per_block; p++) {
vir_bytes chunk = blockrem < PAGE_SIZE ? blockrem : PAGE_SIZE;
iop->iov_addr = vdata; iop->iov_addr = vdata;
iop->iov_size = PAGE_SIZE; iop->iov_size = chunk;
vdata += PAGE_SIZE; vdata += PAGE_SIZE;
blockrem -= chunk;
iop++; iop++;
niovecs++; niovecs++;
} }
assert(p == iov_per_block);
assert(blockrem == 0);
} }
assert(nblocks > 0); assert(nblocks > 0);
@ -825,7 +836,7 @@ void lmfs_set_blocksize(int new_block_size, int major)
vmcache = 0; vmcache = 0;
if(may_use_vmcache) if(may_use_vmcache && !(new_block_size % PAGE_SIZE))
vmcache = 1; vmcache = 1;
} }
@ -932,6 +943,10 @@ int lmfs_do_bpeek(message *m)
assert(fs_block_size > 0); assert(fs_block_size > 0);
assert(dev != NO_DEV); assert(dev != NO_DEV);
if(!vmcache) { return ENXIO; }
assert(!(fs_block_size % PAGE_SIZE));
if((extra=(pos % fs_block_size))) { if((extra=(pos % fs_block_size))) {
pos -= extra; pos -= extra;
len += extra; len += extra;