Pushes the empty dir check into fs->rmdir()
authorBarret Rhoden <brho@cs.berkeley.edu>
Mon, 6 Sep 2010 04:07:36 +0000 (21:07 -0700)
committerKevin Klues <klueska@cs.berkeley.edu>
Thu, 3 Nov 2011 00:35:53 +0000 (17:35 -0700)
kern/src/kfs.c
kern/src/vfs.c

index d0e2981..61ca4c9 100644 (file)
@@ -411,9 +411,21 @@ int kfs_mkdir(struct inode *dir, struct dentry *dentry, int mode)
  * pinned, it just relies on the dentry connections. */
 int kfs_rmdir(struct inode *dir, struct dentry *dentry)
 {
-       /* Bug check, make sure we don't have any kids in KFS */
-       struct kfs_i_info *data = (struct kfs_i_info*)dentry->d_inode->i_fs_info;
-       assert(TAILQ_EMPTY(&data->children));
+       struct kfs_i_info *d_info = (struct kfs_i_info*)dentry->d_inode->i_fs_info;
+       struct dentry *d_i;
+       bool empty = TRUE;
+       /* Check if we are empty.  If not, error out, need to check the sub-dirs as
+        * well as the sub-"files" */
+       TAILQ_FOREACH(d_i, &dentry->d_subdirs, d_subdirs_link) {
+               empty = FALSE;
+               break;
+       }
+       TAILQ_FOREACH(d_i, &d_info->children, d_subdirs_link) {
+               empty = FALSE;
+               break;
+       }
+       if (!empty)
+               return -ENOTEMPTY;
        return 0;
 }
 
index 4c06318..7408b8a 100644 (file)
@@ -1313,8 +1313,6 @@ int do_rmdir(char *path)
        struct nameidata nd_r = {0}, *nd = &nd_r;
        int error;
        int retval = -1;
-       struct dirent empty_test = {0};
-       struct file *dir_check;
 
        /* get the parent, following links (probably want this), and we must get a
         * directory.  Note, current versions of path_lookup can't handle both
@@ -1337,18 +1335,7 @@ int do_rmdir(char *path)
                goto out_dentry;
        }
        /* TODO: make sure we aren't a mount or processes root (EBUSY) */
-       /* Make sure we are empty.  Opening the dir and readdir to check for the
-        * first entry. */
-       dir_check = dentry_open(dentry, O_RDONLY);
-       assert(dir_check);
-       error = dir_check->f_op->readdir(dir_check, &empty_test);
-       kref_put(&dir_check->f_kref);
-       /* TODO: push this into rmdir */
-       if (error != -1) {                      /* readdir would return -1 for an empty dir */
-               set_errno(ENOTEMPTY);
-               goto out_dentry;
-       }
-       /* now for the removal */
+       /* Now for the removal.  the FSs will check if they are empty */
        parent_i = nd->dentry->d_inode;
        error = parent_i->i_op->rmdir(parent_i, dentry);
        if (error < 0) {