Module Name:    src
Committed By:   hannken
Date:           Mon Dec 29 15:28:58 UTC 2014

Modified Files:
        src/sys/fs/v7fs: v7fs_file.c v7fs_vfsops.c v7fs_vnops.c

Log Message:
Defer deallocating unlinked inodes to v7fs_reclaim().

Remove v7fs_vnode_reload() and always use v7fs_inode_load().  No need
to search for a vnode we already hold a reference on.


To generate a diff of this commit:
cvs rdiff -u -r1.5 -r1.6 src/sys/fs/v7fs/v7fs_file.c
cvs rdiff -u -r1.10 -r1.11 src/sys/fs/v7fs/v7fs_vfsops.c
cvs rdiff -u -r1.18 -r1.19 src/sys/fs/v7fs/v7fs_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/v7fs/v7fs_file.c
diff -u src/sys/fs/v7fs/v7fs_file.c:1.5 src/sys/fs/v7fs/v7fs_file.c:1.6
--- src/sys/fs/v7fs/v7fs_file.c:1.5	Fri Dec  7 06:50:15 2012
+++ src/sys/fs/v7fs/v7fs_file.c	Mon Dec 29 15:28:58 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: v7fs_file.c,v 1.5 2012/12/07 06:50:15 msaitoh Exp $	*/
+/*	$NetBSD: v7fs_file.c,v 1.6 2014/12/29 15:28:58 hannken Exp $	*/
 
 /*-
  * Copyright (c) 2011 The NetBSD Foundation, Inc.
@@ -34,7 +34,7 @@
 #endif
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: v7fs_file.c,v 1.5 2012/12/07 06:50:15 msaitoh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: v7fs_file.c,v 1.6 2014/12/29 15:28:58 hannken Exp $");
 #if defined _KERNEL_OPT
 #include "opt_v7fs.h"
 #endif
@@ -259,6 +259,9 @@ v7fs_file_deallocate(struct v7fs_self *f
 			DPRINTF("directory not empty.\n");
 			return ENOTEMPTY;/* t_vnops dir_noempty, rename_dir(6)*/
 		}
+		error = v7fs_datablock_size_change(fs, 0, &inode);
+		if (error)
+			return error;
 		inode.nlink = 0;	/* remove this. */
 	} else {
 		/* Decrement reference count. */
@@ -271,14 +274,7 @@ v7fs_file_deallocate(struct v7fs_self *f
 		return error;
 	DPRINTF("remove dirent\n");
 
-	if (inode.nlink == 0) {
-		v7fs_datablock_contract(fs, &inode, inode.filesize);
-		DPRINTF("remove datablock\n");
-		v7fs_inode_deallocate(fs, ino);
-		DPRINTF("remove inode\n");
-	} else {
-		v7fs_inode_writeback(fs, &inode);
-	}
+	v7fs_inode_writeback(fs, &inode);
 
 	return 0;
 }

Index: src/sys/fs/v7fs/v7fs_vfsops.c
diff -u src/sys/fs/v7fs/v7fs_vfsops.c:1.10 src/sys/fs/v7fs/v7fs_vfsops.c:1.11
--- src/sys/fs/v7fs/v7fs_vfsops.c:1.10	Wed Apr 16 18:55:19 2014
+++ src/sys/fs/v7fs/v7fs_vfsops.c	Mon Dec 29 15:28:58 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: v7fs_vfsops.c,v 1.10 2014/04/16 18:55:19 maxv Exp $	*/
+/*	$NetBSD: v7fs_vfsops.c,v 1.11 2014/12/29 15:28:58 hannken Exp $	*/
 
 /*-
  * Copyright (c) 2004, 2011 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: v7fs_vfsops.c,v 1.10 2014/04/16 18:55:19 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: v7fs_vfsops.c,v 1.11 2014/12/29 15:28:58 hannken Exp $");
 #if defined _KERNEL_OPT
 #include "opt_v7fs.h"
 #endif
@@ -74,7 +74,6 @@ static int v7fs_openfs(struct vnode *, s
 static void v7fs_closefs(struct vnode *, struct mount *);
 static int is_v7fs_partition(struct vnode *);
 static enum vtype v7fs_mode_to_vtype(v7fs_mode_t mode);
-int v7fs_vnode_reload(struct mount *, struct vnode *);
 
 int
 v7fs_mount(struct mount *mp, const char *path, void *data, size_t *data_len)
@@ -586,34 +585,3 @@ v7fs_mountroot(void)
 
 	return 0;
 }
-
-/* Reload disk inode information */
-int
-v7fs_vnode_reload(struct mount *mp, struct vnode *vp)
-{
-	struct v7fs_mount *v7fsmount = mp->mnt_data;
-	struct v7fs_self *fs = v7fsmount->core;
-	struct v7fs_node *v7fs_node;
-	struct v7fs_inode *inode = &((struct v7fs_node *)vp->v_data)->inode;
-	int target_ino = inode->inode_number;
-	int error = 0;
-
-	DPRINTF("#%d\n", target_ino);
-	mutex_enter(&mntvnode_lock);
-	for (v7fs_node = LIST_FIRST(&v7fsmount->v7fs_node_head);
-	     v7fs_node != NULL; v7fs_node = LIST_NEXT(v7fs_node, link)) {
-		inode = &v7fs_node->inode;
-		if (!v7fs_inode_allocated(inode)) {
-			continue;
-		}
-		if (inode->inode_number == target_ino) {
-			error = v7fs_inode_load(fs, &v7fs_node->inode,
-			    target_ino);
-			DPRINTF("sync #%d error=%d\n", target_ino, error);
-			break;
-		}
-	}
-	mutex_exit(&mntvnode_lock);
-
-	return error;
-}

Index: src/sys/fs/v7fs/v7fs_vnops.c
diff -u src/sys/fs/v7fs/v7fs_vnops.c:1.18 src/sys/fs/v7fs/v7fs_vnops.c:1.19
--- src/sys/fs/v7fs/v7fs_vnops.c:1.18	Mon Dec 29 15:28:08 2014
+++ src/sys/fs/v7fs/v7fs_vnops.c	Mon Dec 29 15:28:58 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: v7fs_vnops.c,v 1.18 2014/12/29 15:28:08 hannken Exp $	*/
+/*	$NetBSD: v7fs_vnops.c,v 1.19 2014/12/29 15:28:58 hannken Exp $	*/
 
 /*-
  * Copyright (c) 2004, 2011 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: v7fs_vnops.c,v 1.18 2014/12/29 15:28:08 hannken Exp $");
+__KERNEL_RCSID(0, "$NetBSD: v7fs_vnops.c,v 1.19 2014/12/29 15:28:58 hannken Exp $");
 #if defined _KERNEL_OPT
 #include "opt_v7fs.h"
 #endif
@@ -64,8 +64,6 @@ __KERNEL_RCSID(0, "$NetBSD: v7fs_vnops.c
 #define	DPRINTF(arg...)		((void)0)
 #endif
 
-int v7fs_vnode_reload(struct mount *, struct vnode *);
-
 static v7fs_mode_t vtype_to_v7fs_mode(enum vtype);
 static uint8_t v7fs_mode_to_d_type(v7fs_mode_t);
 
@@ -131,6 +129,10 @@ v7fs_lookup(void *v)
 		return EROFS;
 	}
 
+	/* No lookup on removed directory */
+	if (v7fs_inode_nlink(parent) == 0)
+		return ENOENT;
+
 	/* "." */
 	if (namelen == 1 && name[0] == '.') {
 		if ((nameiop == RENAME) && islastcn) {
@@ -684,10 +686,9 @@ v7fs_remove(void *v)
 	struct v7fs_node *parent_node = a->a_dvp->v_data;
 	struct v7fs_mount *v7fsmount = parent_node->v7fsmount;
 	struct vnode *vp = a->a_vp;
-	struct v7fs_inode *inode = &((struct v7fs_node *)vp->v_data)->inode;
 	struct vnode *dvp = a->a_dvp;
+	struct v7fs_inode *inode = &((struct v7fs_node *)vp->v_data)->inode;
 	struct v7fs_self *fs = v7fsmount->core;
-	bool remove;
 	int error = 0;
 
 	DPRINTF("delete %s\n", a->a_cnp->cn_nameptr);
@@ -697,20 +698,16 @@ v7fs_remove(void *v)
 		goto out;
 	}
 
-	remove = v7fs_inode_nlink(inode) == 1;
-	if (remove)
-		uvm_vnp_setsize(vp, 0);
-
 	if ((error = v7fs_file_deallocate(fs, &parent_node->inode,
 		    a->a_cnp->cn_nameptr))) {
 		DPRINTF("v7fs_file_delete failed.\n");
 		goto out;
 	}
+	error = v7fs_inode_load(fs, inode, inode->inode_number);
+	if (error)
+		goto out;
 	/* Sync dirent size change. */
 	uvm_vnp_setsize(dvp, v7fs_inode_filesize(&parent_node->inode));
-	/* This inode is no longer used. -> v7fs_inactive */
-	if (remove)
-		memset(inode, 0, sizeof(*inode));
 
 out:
 	if (dvp == vp)
@@ -794,8 +791,12 @@ v7fs_rename(void *v)
 	    &parent_to->inode, to_name);
 	/* 'to file' inode may be changed. (hard-linked and it is cached.)
 	   t_vnops rename_reg_nodir */
-	if (tvp) {
-		v7fs_vnode_reload(parent_from->v7fsmount->mountp, tvp);
+	if (error == 0 && tvp) {
+		struct v7fs_inode *inode =
+		    &((struct v7fs_node *)tvp->v_data)->inode;
+
+		error = v7fs_inode_load(fs, inode, inode->inode_number);
+		uvm_vnp_setsize(tvp, v7fs_inode_filesize(inode));
 	}
 	/* Sync dirent size change. */
 	uvm_vnp_setsize(tdvp, v7fs_inode_filesize(&parent_to->inode));
@@ -885,11 +886,12 @@ v7fs_rmdir(void *v)
 		DPRINTF("v7fs_directory_deallocate failed.\n");
 		goto out;
 	}
-	uvm_vnp_setsize(vp, 0);
+	error = v7fs_inode_load(fs, inode, inode->inode_number);
+	if (error)
+		goto out;
+	uvm_vnp_setsize(vp, v7fs_inode_filesize(inode));
 	/* Sync dirent size change. */
 	uvm_vnp_setsize(dvp, v7fs_inode_filesize(&parent_node->inode));
-	/* This inode is no longer used. -> v7fs_inactive */
-	memset(inode, 0, sizeof(*inode));
 out:
 	vput(vp);
 	vput(dvp);
@@ -1016,7 +1018,7 @@ v7fs_inactive(void *v)
 	struct v7fs_inode *inode = &v7node->inode;
 
 	DPRINTF("%p #%d\n", vp, inode->inode_number);
-	if (v7fs_inode_allocated(inode)) {
+	if (v7fs_inode_nlink(inode) > 0) {
 		v7fs_update(vp, 0, 0, UPDATE_WAIT);
 		*a->a_recycle = false;
 	} else {
@@ -1038,8 +1040,16 @@ v7fs_reclaim(void *v)
 				   } */ *a = v;
 	struct vnode *vp = a->a_vp;
 	struct v7fs_node *v7node = vp->v_data;
+	struct v7fs_self *fs = v7node->v7fsmount->core;
+	struct v7fs_inode *inode = &v7node->inode;
 
-	DPRINTF("%p #%d\n", vp, v7node->inode.inode_number);
+	DPRINTF("%p #%d\n", vp, inode->inode_number);
+	if (v7fs_inode_nlink(inode) == 0) {
+		v7fs_datablock_size_change(fs, 0, inode);
+		DPRINTF("remove datablock\n");
+		v7fs_inode_deallocate(fs, inode->inode_number);
+		DPRINTF("remove inode\n");
+	}
 	mutex_enter(&mntvnode_lock);
 	LIST_REMOVE(v7node, link);
 	mutex_exit(&mntvnode_lock);

Reply via email to