Module Name:    src
Committed By:   hannken
Date:           Thu Jan  9 13:23:57 UTC 2014

Modified Files:
        src/sys/fs/sysvbfs: bfs.c bfs.h sysvbfs_vnops.c
        src/tests/fs/vfs: t_renamerace.c

Log Message:
Operation sysvbfs_remove() destructs inodes attached to active vnodes.
Defer the destruction to sysvbfs_reclaim().

Disable test t_renamerace:sysvbfs_renamerace as it will exhaust the
inode table (sysvbfs has space for 8 inodes only).

Ok: Izumi Tsutsui <tsut...@netbsd.org>


To generate a diff of this commit:
cvs rdiff -u -r1.16 -r1.17 src/sys/fs/sysvbfs/bfs.c
cvs rdiff -u -r1.7 -r1.8 src/sys/fs/sysvbfs/bfs.h
cvs rdiff -u -r1.49 -r1.50 src/sys/fs/sysvbfs/sysvbfs_vnops.c
cvs rdiff -u -r1.29 -r1.30 src/tests/fs/vfs/t_renamerace.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/sysvbfs/bfs.c
diff -u src/sys/fs/sysvbfs/bfs.c:1.16 src/sys/fs/sysvbfs/bfs.c:1.17
--- src/sys/fs/sysvbfs/bfs.c:1.16	Mon Jun 11 21:11:40 2012
+++ src/sys/fs/sysvbfs/bfs.c	Thu Jan  9 13:23:57 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: bfs.c,v 1.16 2012/06/11 21:11:40 agc Exp $	*/
+/*	$NetBSD: bfs.c,v 1.17 2014/01/09 13:23:57 hannken Exp $	*/
 
 /*-
  * Copyright (c) 2004 The NetBSD Foundation, Inc.
@@ -31,7 +31,7 @@
 
 #include <sys/cdefs.h>
 
-__KERNEL_RCSID(0, "$NetBSD: bfs.c,v 1.16 2012/06/11 21:11:40 agc Exp $");
+__KERNEL_RCSID(0, "$NetBSD: bfs.c,v 1.17 2014/01/09 13:23:57 hannken Exp $");
 #define	BFS_DEBUG
 
 #include <sys/param.h>
@@ -290,7 +290,7 @@ bfs_file_write(struct bfs *bfs, const ch
 			return ENOENT;
 		}
 		attr = inode->attr;	/* copy old attribute */
-		bfs_file_delete(bfs, name);
+		bfs_file_delete(bfs, name, false);
 		if ((err = bfs_file_create(bfs, name, buf, bufsz, &attr)) != 0)
 			return err;
 	} else {
@@ -308,7 +308,7 @@ bfs_file_write(struct bfs *bfs, const ch
 }
 
 int
-bfs_file_delete(struct bfs *bfs, const char *fname)
+bfs_file_delete(struct bfs *bfs, const char *fname, bool keep_inode)
 {
 	struct bfs_inode *inode;
 	struct bfs_dirent *dirent;
@@ -316,16 +316,18 @@ bfs_file_delete(struct bfs *bfs, const c
 	if (!bfs_dirent_lookup_by_name(bfs, fname, &dirent))
 		return ENOENT;
 
-	if (!bfs_inode_lookup(bfs, dirent->inode, &inode))
+	if (!keep_inode && !bfs_inode_lookup(bfs, dirent->inode, &inode))
 		return ENOENT;
 
 	memset(dirent, 0, sizeof *dirent);
-	memset(inode, 0, sizeof *inode);
-	bfs->n_inode--;
 	bfs->n_dirent--;
-
 	bfs_writeback_dirent(bfs, dirent, false);
-	bfs_writeback_inode(bfs, inode);
+
+	if (!keep_inode) {
+		memset(inode, 0, sizeof *inode);
+		bfs->n_inode--;
+		bfs_writeback_inode(bfs, inode);
+	}
 	DPRINTF(bfs->debug, "%s: \"%s\" deleted.\n", __func__, fname);
 
 	return 0;
@@ -342,7 +344,7 @@ bfs_file_rename(struct bfs *bfs, const c
 		goto out;
 	}
 
-	bfs_file_delete(bfs, to_name);
+	bfs_file_delete(bfs, to_name, false);
 	strncpy(dirent->name, to_name, BFS_FILENAME_MAXLEN);
 	bfs_writeback_dirent(bfs, dirent, false);
 
@@ -563,6 +565,24 @@ bfs_inode_lookup(const struct bfs *bfs, 
 	return true;
 }
 
+int
+bfs_inode_delete(struct bfs *bfs, ino_t ino)
+{
+	struct bfs_inode *inode;
+
+	if (!bfs_inode_lookup(bfs, ino, &inode))
+		return ENOENT;
+
+	memset(inode, 0, sizeof *inode);
+	bfs->n_inode--;
+
+	bfs_writeback_inode(bfs, inode);
+	DPRINTF(bfs->debug, "%s: %lld deleted.\n", __func__, (long long)ino);
+
+	return 0;
+}
+
+
 size_t
 bfs_file_size(const struct bfs_inode *inode)
 {

Index: src/sys/fs/sysvbfs/bfs.h
diff -u src/sys/fs/sysvbfs/bfs.h:1.7 src/sys/fs/sysvbfs/bfs.h:1.8
--- src/sys/fs/sysvbfs/bfs.h:1.7	Tue May  8 14:28:55 2012
+++ src/sys/fs/sysvbfs/bfs.h	Thu Jan  9 13:23:57 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: bfs.h,v 1.7 2012/05/08 14:28:55 tsutsui Exp $	*/
+/*	$NetBSD: bfs.h,v 1.8 2014/01/09 13:23:57 hannken Exp $	*/
 
 /*-
  * Copyright (c) 2004 The NetBSD Foundation, Inc.
@@ -150,7 +150,7 @@ int bfs_file_read(const struct bfs *, co
 int bfs_file_write(struct bfs *, const char *, void *, size_t);
 int bfs_file_create(struct bfs *, const char *, void *,  size_t,
     const struct bfs_fileattr *);
-int bfs_file_delete(struct bfs *, const char *);
+int bfs_file_delete(struct bfs *, const char *, bool);
 int bfs_file_rename(struct bfs *, const char *, const char *);
 bool bfs_file_lookup(const struct bfs *, const char *, int *, int *,
     size_t *);
@@ -162,6 +162,7 @@ bool bfs_dump(const struct bfs *);
 int sysvbfs_bfs_init(struct bfs **, struct vnode *);
 void sysvbfs_bfs_fini(struct bfs *);
 bool bfs_inode_lookup(const struct bfs *, ino_t, struct bfs_inode **);
+int bfs_inode_delete(struct bfs *, ino_t);
 bool bfs_dirent_lookup_by_name(const struct bfs *, const char *,
     struct bfs_dirent **);
 bool bfs_dirent_lookup_by_inode(const struct bfs *, int,

Index: src/sys/fs/sysvbfs/sysvbfs_vnops.c
diff -u src/sys/fs/sysvbfs/sysvbfs_vnops.c:1.49 src/sys/fs/sysvbfs/sysvbfs_vnops.c:1.50
--- src/sys/fs/sysvbfs/sysvbfs_vnops.c:1.49	Tue Dec 24 09:56:18 2013
+++ src/sys/fs/sysvbfs/sysvbfs_vnops.c	Thu Jan  9 13:23:57 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: sysvbfs_vnops.c,v 1.49 2013/12/24 09:56:18 hannken Exp $	*/
+/*	$NetBSD: sysvbfs_vnops.c,v 1.50 2014/01/09 13:23:57 hannken Exp $	*/
 
 /*-
  * Copyright (c) 2004 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sysvbfs_vnops.c,v 1.49 2013/12/24 09:56:18 hannken Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sysvbfs_vnops.c,v 1.50 2014/01/09 13:23:57 hannken Exp $");
 
 #include <sys/param.h>
 #include <sys/kernel.h>
@@ -523,7 +523,7 @@ sysvbfs_remove(void *arg)
 	if (vp->v_type == VDIR)
 		return EPERM;
 
-	if ((err = bfs_file_delete(bfs, ap->a_cnp->cn_nameptr)) != 0)
+	if ((err = bfs_file_delete(bfs, ap->a_cnp->cn_nameptr, true)) != 0)
 		DPRINTF("%s: bfs_file_delete failed.\n", __func__);
 
 	VN_KNOTE(ap->a_vp, NOTE_DELETE);
@@ -694,8 +694,13 @@ sysvbfs_reclaim(void *v)
 	} */ *ap = v;
 	struct vnode *vp = ap->a_vp;
 	struct sysvbfs_node *bnode = vp->v_data;
+	struct bfs *bfs = bnode->bmp->bfs;
 
 	DPRINTF("%s:\n", __func__);
+	if (bnode->removed) {
+		if (bfs_inode_delete(bfs, bnode->inode->number) != 0)
+			DPRINTF("%s: delete inode failed\n", __func__);
+	}
 	mutex_enter(&mntvnode_lock);
 	LIST_REMOVE(bnode, link);
 	mutex_exit(&mntvnode_lock);

Index: src/tests/fs/vfs/t_renamerace.c
diff -u src/tests/fs/vfs/t_renamerace.c:1.29 src/tests/fs/vfs/t_renamerace.c:1.30
--- src/tests/fs/vfs/t_renamerace.c:1.29	Wed Jul 10 18:55:00 2013
+++ src/tests/fs/vfs/t_renamerace.c	Thu Jan  9 13:23:57 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: t_renamerace.c,v 1.29 2013/07/10 18:55:00 reinoud Exp $	*/
+/*	$NetBSD: t_renamerace.c,v 1.30 2014/01/09 13:23:57 hannken Exp $	*/
 
 /*
  * Modified for rump and atf from a program supplied
@@ -93,6 +93,12 @@ renamerace(const atf_tc_t *tc, const cha
 	pthread_t pt1[NWRK], pt2[NWRK];
 	int i;
 
+	/*
+	 * Sysvbfs supports only 8 inodes so this test would exhaust
+	 * the inode table and creating files would fail with ENOSPC.
+	 */
+	if (FSTYPE_SYSVBFS(tc))
+		atf_tc_skip("filesystem has not enough inodes");
 	if (FSTYPE_RUMPFS(tc))
 		atf_tc_skip("rename not supported by file system");
 

Reply via email to