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