Module Name: src
Committed By: hannken
Date: Mon Apr 6 08:38:25 UTC 2015
Modified Files:
src/sys/fs/udf: udf_vnops.c
Log Message:
Move the removal of unlinked nodes from udf_inactive() to udf_reclaim().
To generate a diff of this commit:
cvs rdiff -u -r1.98 -r1.99 src/sys/fs/udf/udf_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/udf/udf_vnops.c
diff -u src/sys/fs/udf/udf_vnops.c:1.98 src/sys/fs/udf/udf_vnops.c:1.99
--- src/sys/fs/udf/udf_vnops.c:1.98 Sat Apr 4 12:34:45 2015
+++ src/sys/fs/udf/udf_vnops.c Mon Apr 6 08:38:25 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: udf_vnops.c,v 1.98 2015/04/04 12:34:45 riastradh Exp $ */
+/* $NetBSD: udf_vnops.c,v 1.99 2015/04/06 08:38:25 hannken Exp $ */
/*
* Copyright (c) 2006, 2008 Reinoud Zandijk
@@ -32,7 +32,7 @@
#include <sys/cdefs.h>
#ifndef lint
-__KERNEL_RCSID(0, "$NetBSD: udf_vnops.c,v 1.98 2015/04/04 12:34:45 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: udf_vnops.c,v 1.99 2015/04/06 08:38:25 hannken Exp $");
#endif /* not lint */
@@ -97,9 +97,7 @@ udf_inactive(void *v)
}
/*
- * Optionally flush metadata to disc. If the file has not been
- * referenced anymore in a directory we ought to free up the resources
- * on disc if applicable.
+ * Optionally flush metadata to disc.
*/
if (udf_node->fe) {
refcnt = udf_rw16(udf_node->fe->link_cnt);
@@ -116,10 +114,7 @@ udf_inactive(void *v)
*ap->a_recycle = false;
if ((refcnt == 0) && ((vp->v_vflag & VV_SYSTEM) == 0)) {
- /* remove this file's allocation */
- DPRINTF(NODE, ("udf_inactive deleting unlinked file\n"));
*ap->a_recycle = true;
- udf_delete_node(udf_node);
VOP_UNLOCK(vp);
return 0;
}
@@ -144,6 +139,7 @@ udf_reclaim(void *v)
} */ *ap = v;
struct vnode *vp = ap->a_vp;
struct udf_node *udf_node = VTOI(vp);
+ int refcnt;
DPRINTF(NODE, ("udf_reclaim called for node %p\n", udf_node));
if (prtactive && vp->v_usecount > 1)
@@ -154,6 +150,23 @@ udf_reclaim(void *v)
return 0;
}
+ /*
+ * If the file has not been referenced anymore in a directory
+ * we ought to free up the resources on disc if applicable.
+ */
+ if (udf_node->fe) {
+ refcnt = udf_rw16(udf_node->fe->link_cnt);
+ } else {
+ assert(udf_node->efe);
+ refcnt = udf_rw16(udf_node->efe->link_cnt);
+ }
+
+ if ((refcnt == 0) && ((vp->v_vflag & VV_SYSTEM) == 0)) {
+ /* remove this file's allocation */
+ DPRINTF(NODE, ("udf_inactive deleting unlinked file\n"));
+ udf_delete_node(udf_node);
+ }
+
/* update note for closure */
udf_update(vp, NULL, NULL, NULL, UPDATE_CLOSE);