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);

Reply via email to