Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/fs/udf Implement a real empty-directory checking for rmd...
details: https://anonhg.NetBSD.org/src/rev/77eb33a96f42
branches: trunk
changeset: 787841:77eb33a96f42
user: reinoud <reinoud%NetBSD.org@localhost>
date: Sun Jul 07 19:49:44 2013 +0000
description:
Implement a real empty-directory checking for rmdir().
Should should fix the other part of PR kern/47987
Solves tests/vfs/t_vnops udf_dir_notempty
diffstat:
sys/fs/udf/udf_subr.c | 16 ++++++++--------
sys/fs/udf/udf_subr.h | 4 +++-
sys/fs/udf/udf_vnops.c | 26 +++++++++++++++-----------
3 files changed, 26 insertions(+), 20 deletions(-)
diffs (141 lines):
diff -r 00443f2871e8 -r 77eb33a96f42 sys/fs/udf/udf_subr.c
--- a/sys/fs/udf/udf_subr.c Sun Jul 07 19:31:26 2013 +0000
+++ b/sys/fs/udf/udf_subr.c Sun Jul 07 19:49:44 2013 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: udf_subr.c,v 1.119 2012/04/29 22:53:59 chs Exp $ */
+/* $NetBSD: udf_subr.c,v 1.120 2013/07/07 19:49:44 reinoud Exp $ */
/*
* Copyright (c) 2006, 2008 Reinoud Zandijk
@@ -29,7 +29,7 @@
#include <sys/cdefs.h>
#ifndef lint
-__KERNEL_RCSID(0, "$NetBSD: udf_subr.c,v 1.119 2012/04/29 22:53:59 chs Exp $");
+__KERNEL_RCSID(0, "$NetBSD: udf_subr.c,v 1.120 2013/07/07 19:49:44 reinoud Exp $");
#endif /* not lint */
@@ -4458,8 +4458,8 @@
/* --------------------------------------------------------------------- */
-static int
-dirhash_fill(struct udf_node *dir_node)
+int
+udf_dirhash_fill(struct udf_node *dir_node)
{
struct vnode *dvp = dir_node->vnode;
struct dirhash *dirh;
@@ -4556,7 +4556,7 @@
/* get our dirhash and make sure its read in */
dirhash_get(&dir_node->dir_hash);
- error = dirhash_fill(dir_node);
+ error = udf_dirhash_fill(dir_node);
if (error) {
dirhash_put(dir_node->dir_hash);
return error;
@@ -4789,7 +4789,7 @@
/* get our dirhash and make sure its read in */
dirhash_get(&dir_node->dir_hash);
- error = dirhash_fill(dir_node);
+ error = udf_dirhash_fill(dir_node);
if (error) {
dirhash_put(dir_node->dir_hash);
return error;
@@ -4938,7 +4938,7 @@
/* get our dirhash and make sure its read in */
dirhash_get(&dir_node->dir_hash);
- error = dirhash_fill(dir_node);
+ error = udf_dirhash_fill(dir_node);
if (error) {
dirhash_put(dir_node->dir_hash);
return error;
@@ -5061,7 +5061,7 @@
/* get our dirhash and make sure its read in */
dirhash_get(&dir_node->dir_hash);
- error = dirhash_fill(dir_node);
+ error = udf_dirhash_fill(dir_node);
if (error) {
dirhash_put(dir_node->dir_hash);
return error;
diff -r 00443f2871e8 -r 77eb33a96f42 sys/fs/udf/udf_subr.h
--- a/sys/fs/udf/udf_subr.h Sun Jul 07 19:31:26 2013 +0000
+++ b/sys/fs/udf/udf_subr.h Sun Jul 07 19:49:44 2013 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: udf_subr.h,v 1.18 2010/02/25 16:15:58 reinoud Exp $ */
+/* $NetBSD: udf_subr.h,v 1.19 2013/07/07 19:49:44 reinoud Exp $ */
/*
* Copyright (c) 2006, 2008 Reinoud Zandijk
@@ -170,9 +170,11 @@
void udf_delete_node(struct udf_node *udf_node);
int udf_chsize(struct vnode *vp, u_quad_t newsize, kauth_cred_t cred);
+
int udf_dir_detach(struct udf_mount *ump, struct udf_node *dir_node, struct udf_node *udf_node, struct componentname *cnp);
int udf_dir_attach(struct udf_mount *ump, struct udf_node *dir_node, struct udf_node *udf_node, struct vattr *vap, struct componentname *cnp);
int udf_dir_update_rootentry(struct udf_mount *ump, struct udf_node *dir_node, struct udf_node *new_parent_node);
+int udf_dirhash_fill(struct udf_node *dir_node);
/* update and times */
void udf_add_to_dirtylist(struct udf_node *udf_node);
diff -r 00443f2871e8 -r 77eb33a96f42 sys/fs/udf/udf_vnops.c
--- a/sys/fs/udf/udf_vnops.c Sun Jul 07 19:31:26 2013 +0000
+++ b/sys/fs/udf/udf_vnops.c Sun Jul 07 19:49:44 2013 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: udf_vnops.c,v 1.81 2013/07/05 20:40:20 reinoud Exp $ */
+/* $NetBSD: udf_vnops.c,v 1.82 2013/07/07 19:49:44 reinoud 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.81 2013/07/05 20:40:20 reinoud Exp $");
+__KERNEL_RCSID(0, "$NetBSD: udf_vnops.c,v 1.82 2013/07/07 19:49:44 reinoud Exp $");
#endif /* not lint */
@@ -2191,7 +2191,7 @@
struct udf_node *dir_node = VTOI(dvp);
struct udf_node *udf_node = VTOI(vp);
struct udf_mount *ump = dir_node->ump;
- int refcnt, error;
+ int error, isempty;
DPRINTF(NOTIMPL, ("udf_rmdir '%s' called\n", cnp->cn_nameptr));
@@ -2202,15 +2202,19 @@
return EINVAL;
}
+ /* make sure our `leaf' node's hash is populated */
+ dirhash_get(&udf_node->dir_hash);
+ error = udf_dirhash_fill(udf_node);
+ if (error) {
+ dirhash_put(udf_node->dir_hash);
+ return error;
+ }
+
/* check to see if the directory is empty */
- error = 0;
- if (dir_node->fe) {
- refcnt = udf_rw16(udf_node->fe->link_cnt);
- } else {
- refcnt = udf_rw16(udf_node->efe->link_cnt);
- }
- if (refcnt > 1) {
- /* NOT empty */
+ isempty = dirhash_dir_isempty(udf_node->dir_hash);
+ dirhash_put(udf_node->dir_hash);
+
+ if (!isempty) {
vput(dvp);
vput(vp);
return ENOTEMPTY;
Home |
Main Index |
Thread Index |
Old Index