Rebase master to b117
[zfs.git] / module / zfs / dsl_dir.c
index 48d87f9..f19653d 100644 (file)
@@ -19,7 +19,7 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -227,24 +227,11 @@ dsl_dir_namelen(dsl_dir_t *dd)
        return (result);
 }
 
-int
-dsl_dir_is_private(dsl_dir_t *dd)
-{
-       int rv = FALSE;
-
-       if (dd->dd_parent && dsl_dir_is_private(dd->dd_parent))
-               rv = TRUE;
-       if (dataset_name_hidden(dd->dd_myname))
-               rv = TRUE;
-       return (rv);
-}
-
-
 static int
 getcomponent(const char *path, char *component, const char **nextp)
 {
        char *p;
-       if (path == NULL)
+       if ((path == NULL) || (path[0] == '\0'))
                return (ENOENT);
        /* This would be a good place to reserve some namespace... */
        p = strpbrk(path, "/@");
@@ -1077,10 +1064,6 @@ dsl_dir_set_reservation_check(void *arg1, void *arg2, dmu_tx_t *tx)
        uint64_t *reservationp = arg2;
        uint64_t new_reservation = *reservationp;
        uint64_t used, avail;
-       int64_t delta;
-
-       if (new_reservation > INT64_MAX)
-               return (EOVERFLOW);
 
        /*
         * If we are doing the preliminary check in open context, the
@@ -1091,8 +1074,6 @@ dsl_dir_set_reservation_check(void *arg1, void *arg2, dmu_tx_t *tx)
 
        mutex_enter(&dd->dd_lock);
        used = dd->dd_phys->dd_used_bytes;
-       delta = MAX(used, new_reservation) -
-           MAX(used, dd->dd_phys->dd_reserved);
        mutex_exit(&dd->dd_lock);
 
        if (dd->dd_parent) {
@@ -1102,11 +1083,17 @@ dsl_dir_set_reservation_check(void *arg1, void *arg2, dmu_tx_t *tx)
                avail = dsl_pool_adjustedsize(dd->dd_pool, B_FALSE) - used;
        }
 
-       if (delta > 0 && delta > avail)
-               return (ENOSPC);
-       if (delta > 0 && dd->dd_phys->dd_quota > 0 &&
-           new_reservation > dd->dd_phys->dd_quota)
-               return (ENOSPC);
+       if (MAX(used, new_reservation) > MAX(used, dd->dd_phys->dd_reserved)) {
+               uint64_t delta = MAX(used, new_reservation) -
+                   MAX(used, dd->dd_phys->dd_reserved);
+
+               if (delta > avail)
+                       return (ENOSPC);
+               if (dd->dd_phys->dd_quota > 0 &&
+                   new_reservation > dd->dd_phys->dd_quota)
+                       return (ENOSPC);
+       }
+
        return (0);
 }