libminixfs: allow non-pagesize-multiple FSes
. then peek & mmap doesn't work though Change-Id: Iecb1c8090f5e0be28da8f5181bb35084eb18f67b
This commit is contained in:
parent
dff4ddaa7c
commit
bde85a7cc0
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user