Print this page
5269 zfs: zpool import slow
PORTING: this code relies on the property of taskq_wait to wait
until no more tasks are queued and no more tasks are active. As
we always queue new tasks from within other tasks, task_wait
reliably waits for the full recursion to finish, even though we
enqueue new tasks after taskq_wait has been called.
On platforms other than illumos, taskq_wait may not have this
property.
Reviewed by: Matthew Ahrens <mahrens@delphix.com>
Reviewed by: Dan McDonald <danmcd@omniti.com>
Reviewed by: George Wilson <george.wilson@delphix.com>

Split Close
Expand all
Collapse all
          --- old/usr/src/uts/common/fs/zfs/sys/dsl_pool.h
          +++ new/usr/src/uts/common/fs/zfs/sys/dsl_pool.h
↓ open down ↓ 146 lines elided ↑ open up ↑
 147  147  void dsl_free_sync(zio_t *pio, dsl_pool_t *dp, uint64_t txg,
 148  148      const blkptr_t *bpp);
 149  149  void dsl_pool_create_origin(dsl_pool_t *dp, dmu_tx_t *tx);
 150  150  void dsl_pool_upgrade_clones(dsl_pool_t *dp, dmu_tx_t *tx);
 151  151  void dsl_pool_upgrade_dir_clones(dsl_pool_t *dp, dmu_tx_t *tx);
 152  152  void dsl_pool_mos_diduse_space(dsl_pool_t *dp,
 153  153      int64_t used, int64_t comp, int64_t uncomp);
 154  154  void dsl_pool_config_enter(dsl_pool_t *dp, void *tag);
 155  155  void dsl_pool_config_exit(dsl_pool_t *dp, void *tag);
 156  156  boolean_t dsl_pool_config_held(dsl_pool_t *dp);
      157 +boolean_t dsl_pool_config_held_writer(dsl_pool_t *dp);
 157  158  boolean_t dsl_pool_need_dirty_delay(dsl_pool_t *dp);
 158  159  
 159  160  taskq_t *dsl_pool_vnrele_taskq(dsl_pool_t *dp);
 160  161  
 161  162  int dsl_pool_user_hold(dsl_pool_t *dp, uint64_t dsobj,
 162  163      const char *tag, uint64_t now, dmu_tx_t *tx);
 163  164  int dsl_pool_user_release(dsl_pool_t *dp, uint64_t dsobj,
 164  165      const char *tag, dmu_tx_t *tx);
 165  166  void dsl_pool_clean_tmp_userrefs(dsl_pool_t *dp);
 166  167  int dsl_pool_open_special_dir(dsl_pool_t *dp, const char *name, dsl_dir_t **);
 167  168  int dsl_pool_hold(const char *name, void *tag, dsl_pool_t **dp);
 168  169  void dsl_pool_rele(dsl_pool_t *dp, void *tag);
 169  170  
 170  171  #ifdef  __cplusplus
 171  172  }
 172  173  #endif
 173  174  
 174  175  #endif /* _SYS_DSL_POOL_H */
    
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX