libminixfs: allow non-pagesize-multiple FSes
. then peek & mmap doesn't work though . disable 3 'helpful' diagnostics that produce noise on every exec() of a dynamic binary (because ld.so does mmap()) on such an FS Change-Id: Iecb1c8090f5e0be28da8f5181bb35084eb18f67b
This commit is contained in:
parent
dff4ddaa7c
commit
7839d6a4d0
|
|
@ -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");
|
||||||
}
|
}
|
||||||
|
|
@ -513,17 +520,19 @@ register struct buf *bp; /* buffer pointer */
|
||||||
pos = mul64u(bp->lmfs_blocknr, fs_block_size);
|
pos = mul64u(bp->lmfs_blocknr, fs_block_size);
|
||||||
if(fs_block_size > PAGE_SIZE) {
|
if(fs_block_size > PAGE_SIZE) {
|
||||||
#define MAXPAGES 20
|
#define MAXPAGES 20
|
||||||
vir_bytes vaddr = (vir_bytes) bp->data;
|
vir_bytes blockrem, vaddr = (vir_bytes) bp->data;
|
||||||
int p;
|
int p = 0;
|
||||||
static iovec_t iovec[MAXPAGES];
|
static iovec_t iovec[MAXPAGES];
|
||||||
int pages = fs_block_size/PAGE_SIZE;
|
blockrem = fs_block_size;
|
||||||
ASSERT(pages > 1 && pages < MAXPAGES);
|
while(blockrem > 0) {
|
||||||
for(p = 0; p < pages; p++) {
|
vir_bytes chunk = blockrem >= PAGE_SIZE ? PAGE_SIZE : blockrem;
|
||||||
iovec[p].iov_addr = vaddr;
|
iovec[p].iov_addr = vaddr;
|
||||||
iovec[p].iov_size = PAGE_SIZE;
|
iovec[p].iov_size = chunk;
|
||||||
vaddr += PAGE_SIZE;
|
vaddr += chunk;
|
||||||
|
blockrem -= chunk;
|
||||||
|
p++;
|
||||||
}
|
}
|
||||||
r = bdev_gather(dev, pos, iovec, pages, BDEV_NOFLAGS);
|
r = bdev_gather(dev, pos, iovec, p, BDEV_NOFLAGS);
|
||||||
} else {
|
} else {
|
||||||
r = bdev_read(dev, pos, bp->data, fs_block_size,
|
r = bdev_read(dev, pos, bp->data, fs_block_size,
|
||||||
BDEV_NOFLAGS);
|
BDEV_NOFLAGS);
|
||||||
|
|
@ -638,9 +647,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 +677,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 +838,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 +945,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;
|
||||||
|
|
|
||||||
|
|
@ -327,7 +327,9 @@ int dupvm(struct fproc *rfp, int pfd, int *vmfd, struct filp **newfilp)
|
||||||
|
|
||||||
if(!f->filp_vno->v_vmnt->m_haspeek) {
|
if(!f->filp_vno->v_vmnt->m_haspeek) {
|
||||||
unlock_filp(f);
|
unlock_filp(f);
|
||||||
|
#if 0 /* Noisy diagnostic for mmap() by ld.so */
|
||||||
printf("VFS dupvm: no peek available\n");
|
printf("VFS dupvm: no peek available\n");
|
||||||
|
#endif
|
||||||
return EINVAL;
|
return EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -409,7 +411,9 @@ int do_vm_call(message *m_out)
|
||||||
}
|
}
|
||||||
|
|
||||||
if((result = dupvm(rfp, req_fd, &procfd, &f)) != OK) {
|
if((result = dupvm(rfp, req_fd, &procfd, &f)) != OK) {
|
||||||
|
#if 0 /* Noisy diagnostic for mmap() by ld.so */
|
||||||
printf("vfs: dupvm failed\n");
|
printf("vfs: dupvm failed\n");
|
||||||
|
#endif
|
||||||
goto reqdone;
|
goto reqdone;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -180,8 +180,10 @@ static void mmap_file_cont(struct vmproc *vmp, message *replymsg, void *cbarg,
|
||||||
writable = 1;
|
writable = 1;
|
||||||
|
|
||||||
if(replymsg->VMV_RESULT != OK) {
|
if(replymsg->VMV_RESULT != OK) {
|
||||||
|
#if 0 /* Noisy diagnostic for mmap() by ld.so */
|
||||||
printf("VM: VFS reply failed (%d)\n", replymsg->VMV_RESULT);
|
printf("VM: VFS reply failed (%d)\n", replymsg->VMV_RESULT);
|
||||||
sys_sysctl_stacktrace(vmp->vm_endpoint);
|
sys_sysctl_stacktrace(vmp->vm_endpoint);
|
||||||
|
#endif
|
||||||
result = origmsg->VMV_RESULT;
|
result = origmsg->VMV_RESULT;
|
||||||
} else {
|
} else {
|
||||||
/* Finish mmap */
|
/* Finish mmap */
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user