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