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