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 <[email protected]>
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");