Module Name: src Committed By: reinoud Date: Thu Jun 24 12:15:46 UTC 2010
Modified Files: src/sys/fs/nilfs: nilfs_subr.c nilfs_vnops.c Log Message: Pullup changes from the write implementation: - remove unnessisary check that would prevent it from mounting newer nilfs images. A field has been added in the segment summary. - store blocks of files on their virtual block number To generate a diff of this commit: cvs rdiff -u -r1.4 -r1.5 src/sys/fs/nilfs/nilfs_subr.c cvs rdiff -u -r1.5 -r1.6 src/sys/fs/nilfs/nilfs_vnops.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/fs/nilfs/nilfs_subr.c diff -u src/sys/fs/nilfs/nilfs_subr.c:1.4 src/sys/fs/nilfs/nilfs_subr.c:1.5 --- src/sys/fs/nilfs/nilfs_subr.c:1.4 Wed Jul 29 17:06:57 2009 +++ src/sys/fs/nilfs/nilfs_subr.c Thu Jun 24 12:15:46 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: nilfs_subr.c,v 1.4 2009/07/29 17:06:57 reinoud Exp $ */ +/* $NetBSD: nilfs_subr.c,v 1.5 2010/06/24 12:15:46 reinoud Exp $ */ /* * Copyright (c) 2008, 2009 Reinoud Zandijk @@ -28,7 +28,7 @@ #include <sys/cdefs.h> #ifndef lint -__KERNEL_RCSID(0, "$NetBSD: nilfs_subr.c,v 1.4 2009/07/29 17:06:57 reinoud Exp $"); +__KERNEL_RCSID(0, "$NetBSD: nilfs_subr.c,v 1.5 2010/06/24 12:15:46 reinoud Exp $"); #endif /* not lint */ #include <sys/param.h> @@ -60,6 +60,10 @@ #define VTOI(vnode) ((struct nilfs_node *) (vnode)->v_data) +/* forwards */ +static int nilfs_btree_lookup(struct nilfs_node *node, uint64_t lblocknr, + uint64_t *vblocknr); + /* basic calculators */ uint64_t nilfs_get_segnum_of_block(struct nilfs_device *nilfsdev, uint64_t blocknr) @@ -145,7 +149,13 @@ nilfs_bread(struct nilfs_node *node, uint64_t blocknr, struct kauth_cred *cred, int flags, struct buf **bpp) { - return bread(node->vnode, blocknr, node->nilfsdev->blocksize, + uint64_t vblocknr; + int error; + + error = nilfs_btree_lookup(node, blocknr, &vblocknr); + if (error) + return error; + return bread(node->vnode, vblocknr, node->nilfsdev->blocksize, cred, flags, bpp); } @@ -481,14 +491,6 @@ /* TODO check segment summary checksum */ /* TODO check data checksum */ - /* adjust our walking point if we have an odd size */ - if (segsum_struct_size != nilfs_rw32(ri->segsum.ss_bytes)) { - printf("nilfs: WARNING encountered segsum_struct size %d in " - "pseg %"PRIu64"\n", - nilfs_rw32(ri->segsum.ss_bytes), ri->pseg); - /* XXX report as an error? */ - } - out: if (bp) brelse(bp, BC_AGE); Index: src/sys/fs/nilfs/nilfs_vnops.c diff -u src/sys/fs/nilfs/nilfs_vnops.c:1.5 src/sys/fs/nilfs/nilfs_vnops.c:1.6 --- src/sys/fs/nilfs/nilfs_vnops.c:1.5 Thu Jun 24 07:54:46 2010 +++ src/sys/fs/nilfs/nilfs_vnops.c Thu Jun 24 12:15:46 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: nilfs_vnops.c,v 1.5 2010/06/24 07:54:46 hannken Exp $ */ +/* $NetBSD: nilfs_vnops.c,v 1.6 2010/06/24 12:15:46 reinoud Exp $ */ /* * Copyright (c) 2008, 2009 Reinoud Zandijk @@ -28,7 +28,7 @@ #include <sys/cdefs.h> #ifndef lint -__KERNEL_RCSID(0, "$NetBSD: nilfs_vnops.c,v 1.5 2010/06/24 07:54:46 hannken Exp $"); +__KERNEL_RCSID(0, "$NetBSD: nilfs_vnops.c,v 1.6 2010/06/24 12:15:46 reinoud Exp $"); #endif /* not lint */ @@ -318,9 +318,8 @@ /* --------------------------------------------------------------------- */ /* - * `Special' bmap functionality that translates all incomming requests to - * translate to vop_strategy() calls with the same blocknumbers effectively - * not translating at all. + * bmap functionality that translates logical block numbers to the virtual + * block numbers to be stored on the vnode itself. */ int @@ -339,23 +338,51 @@ daddr_t bn = ap->a_bn; /* origional */ int *runp = ap->a_runp; struct nilfs_node *node = VTOI(vp); + uint64_t *l2vmap; uint32_t blocksize; + int blks, run, error; DPRINTF(TRANSLATE, ("nilfs_bmap() called\n")); /* XXX could return `-1' to indicate holes/zero's */ blocksize = node->nilfsdev->blocksize; + blks = MAXPHYS / blocksize; - /* translate 1:1 */ - *bnp = bn; + /* get mapping memory */ + l2vmap = malloc(sizeof(uint64_t) * blks, M_TEMP, M_WAITOK); + + /* get virtual block numbers for the vnode's buffer span */ + error = nilfs_btree_nlookup(node, bn, blks, l2vmap); + if (error) { + free(l2vmap, M_TEMP); + return error; + } + + /* store virtual blocks on our own vp */ if (vpp) *vpp = vp; - /* set runlength to maximum */ + /* start at virt[0] */ + *bnp = l2vmap[0]; + + /* get runlength */ + run = 1; + while ((run < blks) && (l2vmap[run] == *bnp + run)) + run++; + + /* set runlength */ if (runp) - *runp = MAXPHYS / blocksize; + *runp = run; + + DPRINTF(TRANSLATE, ("\tstart %"PRIu64" -> %"PRIu64" run %d\n", + bn, *bnp, run)); + + /* mark not translated on virtual block number 0 */ + if (*bnp == 0) + *bnp = -1; /* return success */ + free(l2vmap, M_TEMP); return 0; } @@ -395,9 +422,8 @@ v2pmap = malloc(sizeof(uint64_t) * blks, M_TEMP, M_WAITOK); /* get virtual block numbers for the vnode's buffer span */ - error = nilfs_btree_nlookup(node, from, blks, l2vmap); - if (error) - goto out; + for (i = 0; i < blks; i++) + l2vmap[i] = from + i; /* translate virtual block numbers to physical block numbers */ error = nilfs_nvtop(node, blks, l2vmap, v2pmap);