Print this page
5056 ZFS deadlock on db_mtx and dn_holds
Reviewed by: Will Andrews <willa@spectralogic.com>
Reviewed by: Matt Ahrens <mahrens@delphix.com>
Reviewed by: George Wilson <george.wilson@delphix.com>
Approved by: Dan McDonald <danmcd@omniti.com>


 103         }
 104         dsl_dataset_rele(ds, FTAG);
 105         return (error);
 106 }
 107 
 108 typedef struct dsl_bookmark_create_arg {
 109         nvlist_t *dbca_bmarks;
 110         nvlist_t *dbca_errors;
 111 } dsl_bookmark_create_arg_t;
 112 
 113 static int
 114 dsl_bookmark_create_check_impl(dsl_dataset_t *snapds, const char *bookmark_name,
 115     dmu_tx_t *tx)
 116 {
 117         dsl_pool_t *dp = dmu_tx_pool(tx);
 118         dsl_dataset_t *bmark_fs;
 119         char *shortname;
 120         int error;
 121         zfs_bookmark_phys_t bmark_phys;
 122 
 123         if (!dsl_dataset_is_snapshot(snapds))
 124                 return (SET_ERROR(EINVAL));
 125 
 126         error = dsl_bookmark_hold_ds(dp, bookmark_name,
 127             &bmark_fs, FTAG, &shortname);
 128         if (error != 0)
 129                 return (error);
 130 
 131         if (!dsl_dataset_is_before(bmark_fs, snapds, 0)) {
 132                 dsl_dataset_rele(bmark_fs, FTAG);
 133                 return (SET_ERROR(EINVAL));
 134         }
 135 
 136         error = dsl_dataset_bmark_lookup(bmark_fs, shortname,
 137             &bmark_phys);
 138         dsl_dataset_rele(bmark_fs, FTAG);
 139         if (error == 0)
 140                 return (SET_ERROR(EEXIST));
 141         if (error == ESRCH)
 142                 return (0);
 143         return (error);




 103         }
 104         dsl_dataset_rele(ds, FTAG);
 105         return (error);
 106 }
 107 
 108 typedef struct dsl_bookmark_create_arg {
 109         nvlist_t *dbca_bmarks;
 110         nvlist_t *dbca_errors;
 111 } dsl_bookmark_create_arg_t;
 112 
 113 static int
 114 dsl_bookmark_create_check_impl(dsl_dataset_t *snapds, const char *bookmark_name,
 115     dmu_tx_t *tx)
 116 {
 117         dsl_pool_t *dp = dmu_tx_pool(tx);
 118         dsl_dataset_t *bmark_fs;
 119         char *shortname;
 120         int error;
 121         zfs_bookmark_phys_t bmark_phys;
 122 
 123         if (!snapds->ds_is_snapshot)
 124                 return (SET_ERROR(EINVAL));
 125 
 126         error = dsl_bookmark_hold_ds(dp, bookmark_name,
 127             &bmark_fs, FTAG, &shortname);
 128         if (error != 0)
 129                 return (error);
 130 
 131         if (!dsl_dataset_is_before(bmark_fs, snapds, 0)) {
 132                 dsl_dataset_rele(bmark_fs, FTAG);
 133                 return (SET_ERROR(EINVAL));
 134         }
 135 
 136         error = dsl_dataset_bmark_lookup(bmark_fs, shortname,
 137             &bmark_phys);
 138         dsl_dataset_rele(bmark_fs, FTAG);
 139         if (error == 0)
 140                 return (SET_ERROR(EEXIST));
 141         if (error == ESRCH)
 142                 return (0);
 143         return (error);