Module Name: src Committed By: hannken Date: Sun Aug 7 05:56:32 UTC 2011
Modified Files: src/sys/rump/librump/rumpvfs: rumpfs.c Log Message: Allow removal of a directory containing only whiteouts and free them first. To generate a diff of this commit: cvs rdiff -u -r1.97 -r1.98 src/sys/rump/librump/rumpvfs/rumpfs.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/rump/librump/rumpvfs/rumpfs.c diff -u src/sys/rump/librump/rumpvfs/rumpfs.c:1.97 src/sys/rump/librump/rumpvfs/rumpfs.c:1.98 --- src/sys/rump/librump/rumpvfs/rumpfs.c:1.97 Fri Aug 5 08:13:59 2011 +++ src/sys/rump/librump/rumpvfs/rumpfs.c Sun Aug 7 05:56:32 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: rumpfs.c,v 1.97 2011/08/05 08:13:59 hannken Exp $ */ +/* $NetBSD: rumpfs.c,v 1.98 2011/08/07 05:56:32 hannken Exp $ */ /* * Copyright (c) 2009, 2010, 2011 Antti Kantee. All Rights Reserved. @@ -26,7 +26,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: rumpfs.c,v 1.97 2011/08/05 08:13:59 hannken Exp $"); +__KERNEL_RCSID(0, "$NetBSD: rumpfs.c,v 1.98 2011/08/07 05:56:32 hannken Exp $"); #include <sys/param.h> #include <sys/atomic.h> @@ -927,11 +927,20 @@ struct componentname *cnp = ap->a_cnp; struct rumpfs_node *rnd = dvp->v_data; struct rumpfs_node *rn = vp->v_data; + struct rumpfs_dent *rd; int rv = 0; - if (!LIST_EMPTY(&rn->rn_dir)) { - rv = ENOTEMPTY; - goto out; + LIST_FOREACH(rd, &rn->rn_dir, rd_entries) { + if (rd->rd_node != RUMPFS_WHITEOUT) { + rv = ENOTEMPTY; + goto out; + } + } + while ((rd = LIST_FIRST(&rn->rn_dir)) != NULL) { + KASSERT(rd->rd_node == RUMPFS_WHITEOUT); + LIST_REMOVE(rd, rd_entries); + kmem_free(rd->rd_name, rd->rd_namelen+1); + kmem_free(rd, sizeof(*rd)); } freedir(rnd, cnp);