]> granicus.if.org Git - zfs/blob - module/zfs/dsl_pool.c
Multi-modifier protection (MMP)
[zfs] / module / zfs / dsl_pool.c
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 /*
22  * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
23  * Copyright (c) 2011, 2017 by Delphix. All rights reserved.
24  * Copyright (c) 2013 Steven Hartland. All rights reserved.
25  * Copyright (c) 2014 Spectra Logic Corporation, All rights reserved.
26  * Copyright 2016 Nexenta Systems, Inc.  All rights reserved.
27  */
28
29 #include <sys/dsl_pool.h>
30 #include <sys/dsl_dataset.h>
31 #include <sys/dsl_prop.h>
32 #include <sys/dsl_dir.h>
33 #include <sys/dsl_synctask.h>
34 #include <sys/dsl_scan.h>
35 #include <sys/dnode.h>
36 #include <sys/dmu_tx.h>
37 #include <sys/dmu_objset.h>
38 #include <sys/arc.h>
39 #include <sys/zap.h>
40 #include <sys/zio.h>
41 #include <sys/zfs_context.h>
42 #include <sys/fs/zfs.h>
43 #include <sys/zfs_znode.h>
44 #include <sys/spa_impl.h>
45 #include <sys/dsl_deadlist.h>
46 #include <sys/bptree.h>
47 #include <sys/zfeature.h>
48 #include <sys/zil_impl.h>
49 #include <sys/dsl_userhold.h>
50 #include <sys/trace_txg.h>
51 #include <sys/mmp.h>
52
53 /*
54  * ZFS Write Throttle
55  * ------------------
56  *
57  * ZFS must limit the rate of incoming writes to the rate at which it is able
58  * to sync data modifications to the backend storage. Throttling by too much
59  * creates an artificial limit; throttling by too little can only be sustained
60  * for short periods and would lead to highly lumpy performance. On a per-pool
61  * basis, ZFS tracks the amount of modified (dirty) data. As operations change
62  * data, the amount of dirty data increases; as ZFS syncs out data, the amount
63  * of dirty data decreases. When the amount of dirty data exceeds a
64  * predetermined threshold further modifications are blocked until the amount
65  * of dirty data decreases (as data is synced out).
66  *
67  * The limit on dirty data is tunable, and should be adjusted according to
68  * both the IO capacity and available memory of the system. The larger the
69  * window, the more ZFS is able to aggregate and amortize metadata (and data)
70  * changes. However, memory is a limited resource, and allowing for more dirty
71  * data comes at the cost of keeping other useful data in memory (for example
72  * ZFS data cached by the ARC).
73  *
74  * Implementation
75  *
76  * As buffers are modified dsl_pool_willuse_space() increments both the per-
77  * txg (dp_dirty_pertxg[]) and poolwide (dp_dirty_total) accounting of
78  * dirty space used; dsl_pool_dirty_space() decrements those values as data
79  * is synced out from dsl_pool_sync(). While only the poolwide value is
80  * relevant, the per-txg value is useful for debugging. The tunable
81  * zfs_dirty_data_max determines the dirty space limit. Once that value is
82  * exceeded, new writes are halted until space frees up.
83  *
84  * The zfs_dirty_data_sync tunable dictates the threshold at which we
85  * ensure that there is a txg syncing (see the comment in txg.c for a full
86  * description of transaction group stages).
87  *
88  * The IO scheduler uses both the dirty space limit and current amount of
89  * dirty data as inputs. Those values affect the number of concurrent IOs ZFS
90  * issues. See the comment in vdev_queue.c for details of the IO scheduler.
91  *
92  * The delay is also calculated based on the amount of dirty data.  See the
93  * comment above dmu_tx_delay() for details.
94  */
95
96 /*
97  * zfs_dirty_data_max will be set to zfs_dirty_data_max_percent% of all memory,
98  * capped at zfs_dirty_data_max_max.  It can also be overridden with a module
99  * parameter.
100  */
101 unsigned long zfs_dirty_data_max = 0;
102 unsigned long zfs_dirty_data_max_max = 0;
103 int zfs_dirty_data_max_percent = 10;
104 int zfs_dirty_data_max_max_percent = 25;
105
106 /*
107  * If there is at least this much dirty data, push out a txg.
108  */
109 unsigned long zfs_dirty_data_sync = 64 * 1024 * 1024;
110
111 /*
112  * Once there is this amount of dirty data, the dmu_tx_delay() will kick in
113  * and delay each transaction.
114  * This value should be >= zfs_vdev_async_write_active_max_dirty_percent.
115  */
116 int zfs_delay_min_dirty_percent = 60;
117
118 /*
119  * This controls how quickly the delay approaches infinity.
120  * Larger values cause it to delay more for a given amount of dirty data.
121  * Therefore larger values will cause there to be less dirty data for a
122  * given throughput.
123  *
124  * For the smoothest delay, this value should be about 1 billion divided
125  * by the maximum number of operations per second.  This will smoothly
126  * handle between 10x and 1/10th this number.
127  *
128  * Note: zfs_delay_scale * zfs_dirty_data_max must be < 2^64, due to the
129  * multiply in dmu_tx_delay().
130  */
131 unsigned long zfs_delay_scale = 1000 * 1000 * 1000 / 2000;
132
133 /*
134  * This determines the number of threads used by the dp_sync_taskq.
135  */
136 int zfs_sync_taskq_batch_pct = 75;
137
138 int
139 dsl_pool_open_special_dir(dsl_pool_t *dp, const char *name, dsl_dir_t **ddp)
140 {
141         uint64_t obj;
142         int err;
143
144         err = zap_lookup(dp->dp_meta_objset,
145             dsl_dir_phys(dp->dp_root_dir)->dd_child_dir_zapobj,
146             name, sizeof (obj), 1, &obj);
147         if (err)
148                 return (err);
149
150         return (dsl_dir_hold_obj(dp, obj, name, dp, ddp));
151 }
152
153 static dsl_pool_t *
154 dsl_pool_open_impl(spa_t *spa, uint64_t txg)
155 {
156         dsl_pool_t *dp;
157         blkptr_t *bp = spa_get_rootblkptr(spa);
158
159         dp = kmem_zalloc(sizeof (dsl_pool_t), KM_SLEEP);
160         dp->dp_spa = spa;
161         dp->dp_meta_rootbp = *bp;
162         rrw_init(&dp->dp_config_rwlock, B_TRUE);
163         txg_init(dp, txg);
164         mmp_init(spa);
165
166         txg_list_create(&dp->dp_dirty_datasets, spa,
167             offsetof(dsl_dataset_t, ds_dirty_link));
168         txg_list_create(&dp->dp_dirty_zilogs, spa,
169             offsetof(zilog_t, zl_dirty_link));
170         txg_list_create(&dp->dp_dirty_dirs, spa,
171             offsetof(dsl_dir_t, dd_dirty_link));
172         txg_list_create(&dp->dp_sync_tasks, spa,
173             offsetof(dsl_sync_task_t, dst_node));
174
175         dp->dp_sync_taskq = taskq_create("dp_sync_taskq",
176             zfs_sync_taskq_batch_pct, minclsyspri, 1, INT_MAX,
177             TASKQ_THREADS_CPU_PCT);
178
179         mutex_init(&dp->dp_lock, NULL, MUTEX_DEFAULT, NULL);
180         cv_init(&dp->dp_spaceavail_cv, NULL, CV_DEFAULT, NULL);
181
182         dp->dp_iput_taskq = taskq_create("z_iput", max_ncpus, defclsyspri,
183             max_ncpus * 8, INT_MAX, TASKQ_PREPOPULATE | TASKQ_DYNAMIC);
184
185         return (dp);
186 }
187
188 int
189 dsl_pool_init(spa_t *spa, uint64_t txg, dsl_pool_t **dpp)
190 {
191         int err;
192         dsl_pool_t *dp = dsl_pool_open_impl(spa, txg);
193
194         /*
195          * Initialize the caller's dsl_pool_t structure before we actually open
196          * the meta objset.  This is done because a self-healing write zio may
197          * be issued as part of dmu_objset_open_impl() and the spa needs its
198          * dsl_pool_t initialized in order to handle the write.
199          */
200         *dpp = dp;
201
202         err = dmu_objset_open_impl(spa, NULL, &dp->dp_meta_rootbp,
203             &dp->dp_meta_objset);
204         if (err != 0) {
205                 dsl_pool_close(dp);
206                 *dpp = NULL;
207         }
208
209         return (err);
210 }
211
212 int
213 dsl_pool_open(dsl_pool_t *dp)
214 {
215         int err;
216         dsl_dir_t *dd;
217         dsl_dataset_t *ds;
218         uint64_t obj;
219
220         rrw_enter(&dp->dp_config_rwlock, RW_WRITER, FTAG);
221         err = zap_lookup(dp->dp_meta_objset, DMU_POOL_DIRECTORY_OBJECT,
222             DMU_POOL_ROOT_DATASET, sizeof (uint64_t), 1,
223             &dp->dp_root_dir_obj);
224         if (err)
225                 goto out;
226
227         err = dsl_dir_hold_obj(dp, dp->dp_root_dir_obj,
228             NULL, dp, &dp->dp_root_dir);
229         if (err)
230                 goto out;
231
232         err = dsl_pool_open_special_dir(dp, MOS_DIR_NAME, &dp->dp_mos_dir);
233         if (err)
234                 goto out;
235
236         if (spa_version(dp->dp_spa) >= SPA_VERSION_ORIGIN) {
237                 err = dsl_pool_open_special_dir(dp, ORIGIN_DIR_NAME, &dd);
238                 if (err)
239                         goto out;
240                 err = dsl_dataset_hold_obj(dp,
241                     dsl_dir_phys(dd)->dd_head_dataset_obj, FTAG, &ds);
242                 if (err == 0) {
243                         err = dsl_dataset_hold_obj(dp,
244                             dsl_dataset_phys(ds)->ds_prev_snap_obj, dp,
245                             &dp->dp_origin_snap);
246                         dsl_dataset_rele(ds, FTAG);
247                 }
248                 dsl_dir_rele(dd, dp);
249                 if (err)
250                         goto out;
251         }
252
253         if (spa_version(dp->dp_spa) >= SPA_VERSION_DEADLISTS) {
254                 err = dsl_pool_open_special_dir(dp, FREE_DIR_NAME,
255                     &dp->dp_free_dir);
256                 if (err)
257                         goto out;
258
259                 err = zap_lookup(dp->dp_meta_objset, DMU_POOL_DIRECTORY_OBJECT,
260                     DMU_POOL_FREE_BPOBJ, sizeof (uint64_t), 1, &obj);
261                 if (err)
262                         goto out;
263                 VERIFY0(bpobj_open(&dp->dp_free_bpobj,
264                     dp->dp_meta_objset, obj));
265         }
266
267         /*
268          * Note: errors ignored, because the leak dir will not exist if we
269          * have not encountered a leak yet.
270          */
271         (void) dsl_pool_open_special_dir(dp, LEAK_DIR_NAME,
272             &dp->dp_leak_dir);
273
274         if (spa_feature_is_active(dp->dp_spa, SPA_FEATURE_ASYNC_DESTROY)) {
275                 err = zap_lookup(dp->dp_meta_objset, DMU_POOL_DIRECTORY_OBJECT,
276                     DMU_POOL_BPTREE_OBJ, sizeof (uint64_t), 1,
277                     &dp->dp_bptree_obj);
278                 if (err != 0)
279                         goto out;
280         }
281
282         if (spa_feature_is_active(dp->dp_spa, SPA_FEATURE_EMPTY_BPOBJ)) {
283                 err = zap_lookup(dp->dp_meta_objset, DMU_POOL_DIRECTORY_OBJECT,
284                     DMU_POOL_EMPTY_BPOBJ, sizeof (uint64_t), 1,
285                     &dp->dp_empty_bpobj);
286                 if (err != 0)
287                         goto out;
288         }
289
290         err = zap_lookup(dp->dp_meta_objset, DMU_POOL_DIRECTORY_OBJECT,
291             DMU_POOL_TMP_USERREFS, sizeof (uint64_t), 1,
292             &dp->dp_tmp_userrefs_obj);
293         if (err == ENOENT)
294                 err = 0;
295         if (err)
296                 goto out;
297
298         err = dsl_scan_init(dp, dp->dp_tx.tx_open_txg);
299
300 out:
301         rrw_exit(&dp->dp_config_rwlock, FTAG);
302         return (err);
303 }
304
305 void
306 dsl_pool_close(dsl_pool_t *dp)
307 {
308         /*
309          * Drop our references from dsl_pool_open().
310          *
311          * Since we held the origin_snap from "syncing" context (which
312          * includes pool-opening context), it actually only got a "ref"
313          * and not a hold, so just drop that here.
314          */
315         if (dp->dp_origin_snap)
316                 dsl_dataset_rele(dp->dp_origin_snap, dp);
317         if (dp->dp_mos_dir)
318                 dsl_dir_rele(dp->dp_mos_dir, dp);
319         if (dp->dp_free_dir)
320                 dsl_dir_rele(dp->dp_free_dir, dp);
321         if (dp->dp_leak_dir)
322                 dsl_dir_rele(dp->dp_leak_dir, dp);
323         if (dp->dp_root_dir)
324                 dsl_dir_rele(dp->dp_root_dir, dp);
325
326         bpobj_close(&dp->dp_free_bpobj);
327
328         /* undo the dmu_objset_open_impl(mos) from dsl_pool_open() */
329         if (dp->dp_meta_objset)
330                 dmu_objset_evict(dp->dp_meta_objset);
331
332         txg_list_destroy(&dp->dp_dirty_datasets);
333         txg_list_destroy(&dp->dp_dirty_zilogs);
334         txg_list_destroy(&dp->dp_sync_tasks);
335         txg_list_destroy(&dp->dp_dirty_dirs);
336
337         taskq_destroy(dp->dp_sync_taskq);
338
339         /*
340          * We can't set retry to TRUE since we're explicitly specifying
341          * a spa to flush. This is good enough; any missed buffers for
342          * this spa won't cause trouble, and they'll eventually fall
343          * out of the ARC just like any other unused buffer.
344          */
345         arc_flush(dp->dp_spa, FALSE);
346
347         mmp_fini(dp->dp_spa);
348         txg_fini(dp);
349         dsl_scan_fini(dp);
350         dmu_buf_user_evict_wait();
351
352         rrw_destroy(&dp->dp_config_rwlock);
353         mutex_destroy(&dp->dp_lock);
354         cv_destroy(&dp->dp_spaceavail_cv);
355         taskq_destroy(dp->dp_iput_taskq);
356         if (dp->dp_blkstats)
357                 vmem_free(dp->dp_blkstats, sizeof (zfs_all_blkstats_t));
358         kmem_free(dp, sizeof (dsl_pool_t));
359 }
360
361 dsl_pool_t *
362 dsl_pool_create(spa_t *spa, nvlist_t *zplprops, uint64_t txg)
363 {
364         int err;
365         dsl_pool_t *dp = dsl_pool_open_impl(spa, txg);
366         dmu_tx_t *tx = dmu_tx_create_assigned(dp, txg);
367         objset_t *os;
368         dsl_dataset_t *ds;
369         uint64_t obj;
370
371         rrw_enter(&dp->dp_config_rwlock, RW_WRITER, FTAG);
372
373         /* create and open the MOS (meta-objset) */
374         dp->dp_meta_objset = dmu_objset_create_impl(spa,
375             NULL, &dp->dp_meta_rootbp, DMU_OST_META, tx);
376
377         /* create the pool directory */
378         err = zap_create_claim(dp->dp_meta_objset, DMU_POOL_DIRECTORY_OBJECT,
379             DMU_OT_OBJECT_DIRECTORY, DMU_OT_NONE, 0, tx);
380         ASSERT0(err);
381
382         /* Initialize scan structures */
383         VERIFY0(dsl_scan_init(dp, txg));
384
385         /* create and open the root dir */
386         dp->dp_root_dir_obj = dsl_dir_create_sync(dp, NULL, NULL, tx);
387         VERIFY0(dsl_dir_hold_obj(dp, dp->dp_root_dir_obj,
388             NULL, dp, &dp->dp_root_dir));
389
390         /* create and open the meta-objset dir */
391         (void) dsl_dir_create_sync(dp, dp->dp_root_dir, MOS_DIR_NAME, tx);
392         VERIFY0(dsl_pool_open_special_dir(dp,
393             MOS_DIR_NAME, &dp->dp_mos_dir));
394
395         if (spa_version(spa) >= SPA_VERSION_DEADLISTS) {
396                 /* create and open the free dir */
397                 (void) dsl_dir_create_sync(dp, dp->dp_root_dir,
398                     FREE_DIR_NAME, tx);
399                 VERIFY0(dsl_pool_open_special_dir(dp,
400                     FREE_DIR_NAME, &dp->dp_free_dir));
401
402                 /* create and open the free_bplist */
403                 obj = bpobj_alloc(dp->dp_meta_objset, SPA_OLD_MAXBLOCKSIZE, tx);
404                 VERIFY(zap_add(dp->dp_meta_objset, DMU_POOL_DIRECTORY_OBJECT,
405                     DMU_POOL_FREE_BPOBJ, sizeof (uint64_t), 1, &obj, tx) == 0);
406                 VERIFY0(bpobj_open(&dp->dp_free_bpobj,
407                     dp->dp_meta_objset, obj));
408         }
409
410         if (spa_version(spa) >= SPA_VERSION_DSL_SCRUB)
411                 dsl_pool_create_origin(dp, tx);
412
413         /* create the root dataset */
414         obj = dsl_dataset_create_sync_dd(dp->dp_root_dir, NULL, 0, tx);
415
416         /* create the root objset */
417         VERIFY0(dsl_dataset_hold_obj(dp, obj, FTAG, &ds));
418         rrw_enter(&ds->ds_bp_rwlock, RW_READER, FTAG);
419         VERIFY(NULL != (os = dmu_objset_create_impl(dp->dp_spa, ds,
420             dsl_dataset_get_blkptr(ds), DMU_OST_ZFS, tx)));
421         rrw_exit(&ds->ds_bp_rwlock, FTAG);
422 #ifdef _KERNEL
423         zfs_create_fs(os, kcred, zplprops, tx);
424 #endif
425         dsl_dataset_rele(ds, FTAG);
426
427         dmu_tx_commit(tx);
428
429         rrw_exit(&dp->dp_config_rwlock, FTAG);
430
431         return (dp);
432 }
433
434 /*
435  * Account for the meta-objset space in its placeholder dsl_dir.
436  */
437 void
438 dsl_pool_mos_diduse_space(dsl_pool_t *dp,
439     int64_t used, int64_t comp, int64_t uncomp)
440 {
441         ASSERT3U(comp, ==, uncomp); /* it's all metadata */
442         mutex_enter(&dp->dp_lock);
443         dp->dp_mos_used_delta += used;
444         dp->dp_mos_compressed_delta += comp;
445         dp->dp_mos_uncompressed_delta += uncomp;
446         mutex_exit(&dp->dp_lock);
447 }
448
449 static void
450 dsl_pool_sync_mos(dsl_pool_t *dp, dmu_tx_t *tx)
451 {
452         zio_t *zio = zio_root(dp->dp_spa, NULL, NULL, ZIO_FLAG_MUSTSUCCEED);
453         dmu_objset_sync(dp->dp_meta_objset, zio, tx);
454         VERIFY0(zio_wait(zio));
455         dprintf_bp(&dp->dp_meta_rootbp, "meta objset rootbp is %s", "");
456         spa_set_rootblkptr(dp->dp_spa, &dp->dp_meta_rootbp);
457 }
458
459 static void
460 dsl_pool_dirty_delta(dsl_pool_t *dp, int64_t delta)
461 {
462         ASSERT(MUTEX_HELD(&dp->dp_lock));
463
464         if (delta < 0)
465                 ASSERT3U(-delta, <=, dp->dp_dirty_total);
466
467         dp->dp_dirty_total += delta;
468
469         /*
470          * Note: we signal even when increasing dp_dirty_total.
471          * This ensures forward progress -- each thread wakes the next waiter.
472          */
473         if (dp->dp_dirty_total < zfs_dirty_data_max)
474                 cv_signal(&dp->dp_spaceavail_cv);
475 }
476
477 void
478 dsl_pool_sync(dsl_pool_t *dp, uint64_t txg)
479 {
480         zio_t *zio;
481         dmu_tx_t *tx;
482         dsl_dir_t *dd;
483         dsl_dataset_t *ds;
484         objset_t *mos = dp->dp_meta_objset;
485         list_t synced_datasets;
486
487         list_create(&synced_datasets, sizeof (dsl_dataset_t),
488             offsetof(dsl_dataset_t, ds_synced_link));
489
490         tx = dmu_tx_create_assigned(dp, txg);
491
492         /*
493          * Write out all dirty blocks of dirty datasets.
494          */
495         zio = zio_root(dp->dp_spa, NULL, NULL, ZIO_FLAG_MUSTSUCCEED);
496         while ((ds = txg_list_remove(&dp->dp_dirty_datasets, txg)) != NULL) {
497                 /*
498                  * We must not sync any non-MOS datasets twice, because
499                  * we may have taken a snapshot of them.  However, we
500                  * may sync newly-created datasets on pass 2.
501                  */
502                 ASSERT(!list_link_active(&ds->ds_synced_link));
503                 list_insert_tail(&synced_datasets, ds);
504                 dsl_dataset_sync(ds, zio, tx);
505         }
506         VERIFY0(zio_wait(zio));
507
508         /*
509          * We have written all of the accounted dirty data, so our
510          * dp_space_towrite should now be zero.  However, some seldom-used
511          * code paths do not adhere to this (e.g. dbuf_undirty(), also
512          * rounding error in dbuf_write_physdone).
513          * Shore up the accounting of any dirtied space now.
514          */
515         dsl_pool_undirty_space(dp, dp->dp_dirty_pertxg[txg & TXG_MASK], txg);
516
517         /*
518          * Update the long range free counter after
519          * we're done syncing user data
520          */
521         mutex_enter(&dp->dp_lock);
522         ASSERT(spa_sync_pass(dp->dp_spa) == 1 ||
523             dp->dp_long_free_dirty_pertxg[txg & TXG_MASK] == 0);
524         dp->dp_long_free_dirty_pertxg[txg & TXG_MASK] = 0;
525         mutex_exit(&dp->dp_lock);
526
527         /*
528          * After the data blocks have been written (ensured by the zio_wait()
529          * above), update the user/group space accounting.  This happens
530          * in tasks dispatched to dp_sync_taskq, so wait for them before
531          * continuing.
532          */
533         for (ds = list_head(&synced_datasets); ds != NULL;
534             ds = list_next(&synced_datasets, ds)) {
535                 dmu_objset_do_userquota_updates(ds->ds_objset, tx);
536         }
537         taskq_wait(dp->dp_sync_taskq);
538
539         /*
540          * Sync the datasets again to push out the changes due to
541          * userspace updates.  This must be done before we process the
542          * sync tasks, so that any snapshots will have the correct
543          * user accounting information (and we won't get confused
544          * about which blocks are part of the snapshot).
545          */
546         zio = zio_root(dp->dp_spa, NULL, NULL, ZIO_FLAG_MUSTSUCCEED);
547         while ((ds = txg_list_remove(&dp->dp_dirty_datasets, txg)) != NULL) {
548                 ASSERT(list_link_active(&ds->ds_synced_link));
549                 dmu_buf_rele(ds->ds_dbuf, ds);
550                 dsl_dataset_sync(ds, zio, tx);
551         }
552         VERIFY0(zio_wait(zio));
553
554         /*
555          * Now that the datasets have been completely synced, we can
556          * clean up our in-memory structures accumulated while syncing:
557          *
558          *  - move dead blocks from the pending deadlist to the on-disk deadlist
559          *  - release hold from dsl_dataset_dirty()
560          */
561         while ((ds = list_remove_head(&synced_datasets)) != NULL) {
562                 dsl_dataset_sync_done(ds, tx);
563         }
564
565         while ((dd = txg_list_remove(&dp->dp_dirty_dirs, txg)) != NULL) {
566                 dsl_dir_sync(dd, tx);
567         }
568
569         /*
570          * The MOS's space is accounted for in the pool/$MOS
571          * (dp_mos_dir).  We can't modify the mos while we're syncing
572          * it, so we remember the deltas and apply them here.
573          */
574         if (dp->dp_mos_used_delta != 0 || dp->dp_mos_compressed_delta != 0 ||
575             dp->dp_mos_uncompressed_delta != 0) {
576                 dsl_dir_diduse_space(dp->dp_mos_dir, DD_USED_HEAD,
577                     dp->dp_mos_used_delta,
578                     dp->dp_mos_compressed_delta,
579                     dp->dp_mos_uncompressed_delta, tx);
580                 dp->dp_mos_used_delta = 0;
581                 dp->dp_mos_compressed_delta = 0;
582                 dp->dp_mos_uncompressed_delta = 0;
583         }
584
585         if (!multilist_is_empty(mos->os_dirty_dnodes[txg & TXG_MASK])) {
586                 dsl_pool_sync_mos(dp, tx);
587         }
588
589         /*
590          * If we modify a dataset in the same txg that we want to destroy it,
591          * its dsl_dir's dd_dbuf will be dirty, and thus have a hold on it.
592          * dsl_dir_destroy_check() will fail if there are unexpected holds.
593          * Therefore, we want to sync the MOS (thus syncing the dd_dbuf
594          * and clearing the hold on it) before we process the sync_tasks.
595          * The MOS data dirtied by the sync_tasks will be synced on the next
596          * pass.
597          */
598         if (!txg_list_empty(&dp->dp_sync_tasks, txg)) {
599                 dsl_sync_task_t *dst;
600                 /*
601                  * No more sync tasks should have been added while we
602                  * were syncing.
603                  */
604                 ASSERT3U(spa_sync_pass(dp->dp_spa), ==, 1);
605                 while ((dst = txg_list_remove(&dp->dp_sync_tasks, txg)) != NULL)
606                         dsl_sync_task_sync(dst, tx);
607         }
608
609         dmu_tx_commit(tx);
610
611         DTRACE_PROBE2(dsl_pool_sync__done, dsl_pool_t *dp, dp, uint64_t, txg);
612 }
613
614 void
615 dsl_pool_sync_done(dsl_pool_t *dp, uint64_t txg)
616 {
617         zilog_t *zilog;
618
619         while ((zilog = txg_list_head(&dp->dp_dirty_zilogs, txg))) {
620                 dsl_dataset_t *ds = dmu_objset_ds(zilog->zl_os);
621                 /*
622                  * We don't remove the zilog from the dp_dirty_zilogs
623                  * list until after we've cleaned it. This ensures that
624                  * callers of zilog_is_dirty() receive an accurate
625                  * answer when they are racing with the spa sync thread.
626                  */
627                 zil_clean(zilog, txg);
628                 (void) txg_list_remove_this(&dp->dp_dirty_zilogs, zilog, txg);
629                 ASSERT(!dmu_objset_is_dirty(zilog->zl_os, txg));
630                 dmu_buf_rele(ds->ds_dbuf, zilog);
631         }
632         ASSERT(!dmu_objset_is_dirty(dp->dp_meta_objset, txg));
633 }
634
635 /*
636  * TRUE if the current thread is the tx_sync_thread or if we
637  * are being called from SPA context during pool initialization.
638  */
639 int
640 dsl_pool_sync_context(dsl_pool_t *dp)
641 {
642         return (curthread == dp->dp_tx.tx_sync_thread ||
643             spa_is_initializing(dp->dp_spa) ||
644             taskq_member(dp->dp_sync_taskq, curthread));
645 }
646
647 uint64_t
648 dsl_pool_adjustedsize(dsl_pool_t *dp, boolean_t netfree)
649 {
650         uint64_t space, resv;
651
652         /*
653          * If we're trying to assess whether it's OK to do a free,
654          * cut the reservation in half to allow forward progress
655          * (e.g. make it possible to rm(1) files from a full pool).
656          */
657         space = spa_get_dspace(dp->dp_spa);
658         resv = spa_get_slop_space(dp->dp_spa);
659         if (netfree)
660                 resv >>= 1;
661
662         return (space - resv);
663 }
664
665 boolean_t
666 dsl_pool_need_dirty_delay(dsl_pool_t *dp)
667 {
668         uint64_t delay_min_bytes =
669             zfs_dirty_data_max * zfs_delay_min_dirty_percent / 100;
670         boolean_t rv;
671
672         mutex_enter(&dp->dp_lock);
673         if (dp->dp_dirty_total > zfs_dirty_data_sync)
674                 txg_kick(dp);
675         rv = (dp->dp_dirty_total > delay_min_bytes);
676         mutex_exit(&dp->dp_lock);
677         return (rv);
678 }
679
680 void
681 dsl_pool_dirty_space(dsl_pool_t *dp, int64_t space, dmu_tx_t *tx)
682 {
683         if (space > 0) {
684                 mutex_enter(&dp->dp_lock);
685                 dp->dp_dirty_pertxg[tx->tx_txg & TXG_MASK] += space;
686                 dsl_pool_dirty_delta(dp, space);
687                 mutex_exit(&dp->dp_lock);
688         }
689 }
690
691 void
692 dsl_pool_undirty_space(dsl_pool_t *dp, int64_t space, uint64_t txg)
693 {
694         ASSERT3S(space, >=, 0);
695         if (space == 0)
696                 return;
697
698         mutex_enter(&dp->dp_lock);
699         if (dp->dp_dirty_pertxg[txg & TXG_MASK] < space) {
700                 /* XXX writing something we didn't dirty? */
701                 space = dp->dp_dirty_pertxg[txg & TXG_MASK];
702         }
703         ASSERT3U(dp->dp_dirty_pertxg[txg & TXG_MASK], >=, space);
704         dp->dp_dirty_pertxg[txg & TXG_MASK] -= space;
705         ASSERT3U(dp->dp_dirty_total, >=, space);
706         dsl_pool_dirty_delta(dp, -space);
707         mutex_exit(&dp->dp_lock);
708 }
709
710 /* ARGSUSED */
711 static int
712 upgrade_clones_cb(dsl_pool_t *dp, dsl_dataset_t *hds, void *arg)
713 {
714         dmu_tx_t *tx = arg;
715         dsl_dataset_t *ds, *prev = NULL;
716         int err;
717
718         err = dsl_dataset_hold_obj(dp, hds->ds_object, FTAG, &ds);
719         if (err)
720                 return (err);
721
722         while (dsl_dataset_phys(ds)->ds_prev_snap_obj != 0) {
723                 err = dsl_dataset_hold_obj(dp,
724                     dsl_dataset_phys(ds)->ds_prev_snap_obj, FTAG, &prev);
725                 if (err) {
726                         dsl_dataset_rele(ds, FTAG);
727                         return (err);
728                 }
729
730                 if (dsl_dataset_phys(prev)->ds_next_snap_obj != ds->ds_object)
731                         break;
732                 dsl_dataset_rele(ds, FTAG);
733                 ds = prev;
734                 prev = NULL;
735         }
736
737         if (prev == NULL) {
738                 prev = dp->dp_origin_snap;
739
740                 /*
741                  * The $ORIGIN can't have any data, or the accounting
742                  * will be wrong.
743                  */
744                 rrw_enter(&ds->ds_bp_rwlock, RW_READER, FTAG);
745                 ASSERT0(dsl_dataset_phys(prev)->ds_bp.blk_birth);
746                 rrw_exit(&ds->ds_bp_rwlock, FTAG);
747
748                 /* The origin doesn't get attached to itself */
749                 if (ds->ds_object == prev->ds_object) {
750                         dsl_dataset_rele(ds, FTAG);
751                         return (0);
752                 }
753
754                 dmu_buf_will_dirty(ds->ds_dbuf, tx);
755                 dsl_dataset_phys(ds)->ds_prev_snap_obj = prev->ds_object;
756                 dsl_dataset_phys(ds)->ds_prev_snap_txg =
757                     dsl_dataset_phys(prev)->ds_creation_txg;
758
759                 dmu_buf_will_dirty(ds->ds_dir->dd_dbuf, tx);
760                 dsl_dir_phys(ds->ds_dir)->dd_origin_obj = prev->ds_object;
761
762                 dmu_buf_will_dirty(prev->ds_dbuf, tx);
763                 dsl_dataset_phys(prev)->ds_num_children++;
764
765                 if (dsl_dataset_phys(ds)->ds_next_snap_obj == 0) {
766                         ASSERT(ds->ds_prev == NULL);
767                         VERIFY0(dsl_dataset_hold_obj(dp,
768                             dsl_dataset_phys(ds)->ds_prev_snap_obj,
769                             ds, &ds->ds_prev));
770                 }
771         }
772
773         ASSERT3U(dsl_dir_phys(ds->ds_dir)->dd_origin_obj, ==, prev->ds_object);
774         ASSERT3U(dsl_dataset_phys(ds)->ds_prev_snap_obj, ==, prev->ds_object);
775
776         if (dsl_dataset_phys(prev)->ds_next_clones_obj == 0) {
777                 dmu_buf_will_dirty(prev->ds_dbuf, tx);
778                 dsl_dataset_phys(prev)->ds_next_clones_obj =
779                     zap_create(dp->dp_meta_objset,
780                     DMU_OT_NEXT_CLONES, DMU_OT_NONE, 0, tx);
781         }
782         VERIFY0(zap_add_int(dp->dp_meta_objset,
783             dsl_dataset_phys(prev)->ds_next_clones_obj, ds->ds_object, tx));
784
785         dsl_dataset_rele(ds, FTAG);
786         if (prev != dp->dp_origin_snap)
787                 dsl_dataset_rele(prev, FTAG);
788         return (0);
789 }
790
791 void
792 dsl_pool_upgrade_clones(dsl_pool_t *dp, dmu_tx_t *tx)
793 {
794         ASSERT(dmu_tx_is_syncing(tx));
795         ASSERT(dp->dp_origin_snap != NULL);
796
797         VERIFY0(dmu_objset_find_dp(dp, dp->dp_root_dir_obj, upgrade_clones_cb,
798             tx, DS_FIND_CHILDREN | DS_FIND_SERIALIZE));
799 }
800
801 /* ARGSUSED */
802 static int
803 upgrade_dir_clones_cb(dsl_pool_t *dp, dsl_dataset_t *ds, void *arg)
804 {
805         dmu_tx_t *tx = arg;
806         objset_t *mos = dp->dp_meta_objset;
807
808         if (dsl_dir_phys(ds->ds_dir)->dd_origin_obj != 0) {
809                 dsl_dataset_t *origin;
810
811                 VERIFY0(dsl_dataset_hold_obj(dp,
812                     dsl_dir_phys(ds->ds_dir)->dd_origin_obj, FTAG, &origin));
813
814                 if (dsl_dir_phys(origin->ds_dir)->dd_clones == 0) {
815                         dmu_buf_will_dirty(origin->ds_dir->dd_dbuf, tx);
816                         dsl_dir_phys(origin->ds_dir)->dd_clones =
817                             zap_create(mos, DMU_OT_DSL_CLONES, DMU_OT_NONE,
818                             0, tx);
819                 }
820
821                 VERIFY0(zap_add_int(dp->dp_meta_objset,
822                     dsl_dir_phys(origin->ds_dir)->dd_clones,
823                     ds->ds_object, tx));
824
825                 dsl_dataset_rele(origin, FTAG);
826         }
827         return (0);
828 }
829
830 void
831 dsl_pool_upgrade_dir_clones(dsl_pool_t *dp, dmu_tx_t *tx)
832 {
833         uint64_t obj;
834
835         ASSERT(dmu_tx_is_syncing(tx));
836
837         (void) dsl_dir_create_sync(dp, dp->dp_root_dir, FREE_DIR_NAME, tx);
838         VERIFY0(dsl_pool_open_special_dir(dp,
839             FREE_DIR_NAME, &dp->dp_free_dir));
840
841         /*
842          * We can't use bpobj_alloc(), because spa_version() still
843          * returns the old version, and we need a new-version bpobj with
844          * subobj support.  So call dmu_object_alloc() directly.
845          */
846         obj = dmu_object_alloc(dp->dp_meta_objset, DMU_OT_BPOBJ,
847             SPA_OLD_MAXBLOCKSIZE, DMU_OT_BPOBJ_HDR, sizeof (bpobj_phys_t), tx);
848         VERIFY0(zap_add(dp->dp_meta_objset, DMU_POOL_DIRECTORY_OBJECT,
849             DMU_POOL_FREE_BPOBJ, sizeof (uint64_t), 1, &obj, tx));
850         VERIFY0(bpobj_open(&dp->dp_free_bpobj, dp->dp_meta_objset, obj));
851
852         VERIFY0(dmu_objset_find_dp(dp, dp->dp_root_dir_obj,
853             upgrade_dir_clones_cb, tx, DS_FIND_CHILDREN | DS_FIND_SERIALIZE));
854 }
855
856 void
857 dsl_pool_create_origin(dsl_pool_t *dp, dmu_tx_t *tx)
858 {
859         uint64_t dsobj;
860         dsl_dataset_t *ds;
861
862         ASSERT(dmu_tx_is_syncing(tx));
863         ASSERT(dp->dp_origin_snap == NULL);
864         ASSERT(rrw_held(&dp->dp_config_rwlock, RW_WRITER));
865
866         /* create the origin dir, ds, & snap-ds */
867         dsobj = dsl_dataset_create_sync(dp->dp_root_dir, ORIGIN_DIR_NAME,
868             NULL, 0, kcred, tx);
869         VERIFY0(dsl_dataset_hold_obj(dp, dsobj, FTAG, &ds));
870         dsl_dataset_snapshot_sync_impl(ds, ORIGIN_DIR_NAME, tx);
871         VERIFY0(dsl_dataset_hold_obj(dp, dsl_dataset_phys(ds)->ds_prev_snap_obj,
872             dp, &dp->dp_origin_snap));
873         dsl_dataset_rele(ds, FTAG);
874 }
875
876 taskq_t *
877 dsl_pool_iput_taskq(dsl_pool_t *dp)
878 {
879         return (dp->dp_iput_taskq);
880 }
881
882 /*
883  * Walk through the pool-wide zap object of temporary snapshot user holds
884  * and release them.
885  */
886 void
887 dsl_pool_clean_tmp_userrefs(dsl_pool_t *dp)
888 {
889         zap_attribute_t za;
890         zap_cursor_t zc;
891         objset_t *mos = dp->dp_meta_objset;
892         uint64_t zapobj = dp->dp_tmp_userrefs_obj;
893         nvlist_t *holds;
894
895         if (zapobj == 0)
896                 return;
897         ASSERT(spa_version(dp->dp_spa) >= SPA_VERSION_USERREFS);
898
899         holds = fnvlist_alloc();
900
901         for (zap_cursor_init(&zc, mos, zapobj);
902             zap_cursor_retrieve(&zc, &za) == 0;
903             zap_cursor_advance(&zc)) {
904                 char *htag;
905                 nvlist_t *tags;
906
907                 htag = strchr(za.za_name, '-');
908                 *htag = '\0';
909                 ++htag;
910                 if (nvlist_lookup_nvlist(holds, za.za_name, &tags) != 0) {
911                         tags = fnvlist_alloc();
912                         fnvlist_add_boolean(tags, htag);
913                         fnvlist_add_nvlist(holds, za.za_name, tags);
914                         fnvlist_free(tags);
915                 } else {
916                         fnvlist_add_boolean(tags, htag);
917                 }
918         }
919         dsl_dataset_user_release_tmp(dp, holds);
920         fnvlist_free(holds);
921         zap_cursor_fini(&zc);
922 }
923
924 /*
925  * Create the pool-wide zap object for storing temporary snapshot holds.
926  */
927 void
928 dsl_pool_user_hold_create_obj(dsl_pool_t *dp, dmu_tx_t *tx)
929 {
930         objset_t *mos = dp->dp_meta_objset;
931
932         ASSERT(dp->dp_tmp_userrefs_obj == 0);
933         ASSERT(dmu_tx_is_syncing(tx));
934
935         dp->dp_tmp_userrefs_obj = zap_create_link(mos, DMU_OT_USERREFS,
936             DMU_POOL_DIRECTORY_OBJECT, DMU_POOL_TMP_USERREFS, tx);
937 }
938
939 static int
940 dsl_pool_user_hold_rele_impl(dsl_pool_t *dp, uint64_t dsobj,
941     const char *tag, uint64_t now, dmu_tx_t *tx, boolean_t holding)
942 {
943         objset_t *mos = dp->dp_meta_objset;
944         uint64_t zapobj = dp->dp_tmp_userrefs_obj;
945         char *name;
946         int error;
947
948         ASSERT(spa_version(dp->dp_spa) >= SPA_VERSION_USERREFS);
949         ASSERT(dmu_tx_is_syncing(tx));
950
951         /*
952          * If the pool was created prior to SPA_VERSION_USERREFS, the
953          * zap object for temporary holds might not exist yet.
954          */
955         if (zapobj == 0) {
956                 if (holding) {
957                         dsl_pool_user_hold_create_obj(dp, tx);
958                         zapobj = dp->dp_tmp_userrefs_obj;
959                 } else {
960                         return (SET_ERROR(ENOENT));
961                 }
962         }
963
964         name = kmem_asprintf("%llx-%s", (u_longlong_t)dsobj, tag);
965         if (holding)
966                 error = zap_add(mos, zapobj, name, 8, 1, &now, tx);
967         else
968                 error = zap_remove(mos, zapobj, name, tx);
969         strfree(name);
970
971         return (error);
972 }
973
974 /*
975  * Add a temporary hold for the given dataset object and tag.
976  */
977 int
978 dsl_pool_user_hold(dsl_pool_t *dp, uint64_t dsobj, const char *tag,
979     uint64_t now, dmu_tx_t *tx)
980 {
981         return (dsl_pool_user_hold_rele_impl(dp, dsobj, tag, now, tx, B_TRUE));
982 }
983
984 /*
985  * Release a temporary hold for the given dataset object and tag.
986  */
987 int
988 dsl_pool_user_release(dsl_pool_t *dp, uint64_t dsobj, const char *tag,
989     dmu_tx_t *tx)
990 {
991         return (dsl_pool_user_hold_rele_impl(dp, dsobj, tag, 0,
992             tx, B_FALSE));
993 }
994
995 /*
996  * DSL Pool Configuration Lock
997  *
998  * The dp_config_rwlock protects against changes to DSL state (e.g. dataset
999  * creation / destruction / rename / property setting).  It must be held for
1000  * read to hold a dataset or dsl_dir.  I.e. you must call
1001  * dsl_pool_config_enter() or dsl_pool_hold() before calling
1002  * dsl_{dataset,dir}_hold{_obj}.  In most circumstances, the dp_config_rwlock
1003  * must be held continuously until all datasets and dsl_dirs are released.
1004  *
1005  * The only exception to this rule is that if a "long hold" is placed on
1006  * a dataset, then the dp_config_rwlock may be dropped while the dataset
1007  * is still held.  The long hold will prevent the dataset from being
1008  * destroyed -- the destroy will fail with EBUSY.  A long hold can be
1009  * obtained by calling dsl_dataset_long_hold(), or by "owning" a dataset
1010  * (by calling dsl_{dataset,objset}_{try}own{_obj}).
1011  *
1012  * Legitimate long-holders (including owners) should be long-running, cancelable
1013  * tasks that should cause "zfs destroy" to fail.  This includes DMU
1014  * consumers (i.e. a ZPL filesystem being mounted or ZVOL being open),
1015  * "zfs send", and "zfs diff".  There are several other long-holders whose
1016  * uses are suboptimal (e.g. "zfs promote", and zil_suspend()).
1017  *
1018  * The usual formula for long-holding would be:
1019  * dsl_pool_hold()
1020  * dsl_dataset_hold()
1021  * ... perform checks ...
1022  * dsl_dataset_long_hold()
1023  * dsl_pool_rele()
1024  * ... perform long-running task ...
1025  * dsl_dataset_long_rele()
1026  * dsl_dataset_rele()
1027  *
1028  * Note that when the long hold is released, the dataset is still held but
1029  * the pool is not held.  The dataset may change arbitrarily during this time
1030  * (e.g. it could be destroyed).  Therefore you shouldn't do anything to the
1031  * dataset except release it.
1032  *
1033  * User-initiated operations (e.g. ioctls, zfs_ioc_*()) are either read-only
1034  * or modifying operations.
1035  *
1036  * Modifying operations should generally use dsl_sync_task().  The synctask
1037  * infrastructure enforces proper locking strategy with respect to the
1038  * dp_config_rwlock.  See the comment above dsl_sync_task() for details.
1039  *
1040  * Read-only operations will manually hold the pool, then the dataset, obtain
1041  * information from the dataset, then release the pool and dataset.
1042  * dmu_objset_{hold,rele}() are convenience routines that also do the pool
1043  * hold/rele.
1044  */
1045
1046 int
1047 dsl_pool_hold(const char *name, void *tag, dsl_pool_t **dp)
1048 {
1049         spa_t *spa;
1050         int error;
1051
1052         error = spa_open(name, &spa, tag);
1053         if (error == 0) {
1054                 *dp = spa_get_dsl(spa);
1055                 dsl_pool_config_enter(*dp, tag);
1056         }
1057         return (error);
1058 }
1059
1060 void
1061 dsl_pool_rele(dsl_pool_t *dp, void *tag)
1062 {
1063         dsl_pool_config_exit(dp, tag);
1064         spa_close(dp->dp_spa, tag);
1065 }
1066
1067 void
1068 dsl_pool_config_enter(dsl_pool_t *dp, void *tag)
1069 {
1070         /*
1071          * We use a "reentrant" reader-writer lock, but not reentrantly.
1072          *
1073          * The rrwlock can (with the track_all flag) track all reading threads,
1074          * which is very useful for debugging which code path failed to release
1075          * the lock, and for verifying that the *current* thread does hold
1076          * the lock.
1077          *
1078          * (Unlike a rwlock, which knows that N threads hold it for
1079          * read, but not *which* threads, so rw_held(RW_READER) returns TRUE
1080          * if any thread holds it for read, even if this thread doesn't).
1081          */
1082         ASSERT(!rrw_held(&dp->dp_config_rwlock, RW_READER));
1083         rrw_enter(&dp->dp_config_rwlock, RW_READER, tag);
1084 }
1085
1086 void
1087 dsl_pool_config_enter_prio(dsl_pool_t *dp, void *tag)
1088 {
1089         ASSERT(!rrw_held(&dp->dp_config_rwlock, RW_READER));
1090         rrw_enter_read_prio(&dp->dp_config_rwlock, tag);
1091 }
1092
1093 void
1094 dsl_pool_config_exit(dsl_pool_t *dp, void *tag)
1095 {
1096         rrw_exit(&dp->dp_config_rwlock, tag);
1097 }
1098
1099 boolean_t
1100 dsl_pool_config_held(dsl_pool_t *dp)
1101 {
1102         return (RRW_LOCK_HELD(&dp->dp_config_rwlock));
1103 }
1104
1105 boolean_t
1106 dsl_pool_config_held_writer(dsl_pool_t *dp)
1107 {
1108         return (RRW_WRITE_HELD(&dp->dp_config_rwlock));
1109 }
1110
1111 #if defined(_KERNEL) && defined(HAVE_SPL)
1112 EXPORT_SYMBOL(dsl_pool_config_enter);
1113 EXPORT_SYMBOL(dsl_pool_config_exit);
1114
1115 /* BEGIN CSTYLED */
1116 /* zfs_dirty_data_max_percent only applied at module load in arc_init(). */
1117 module_param(zfs_dirty_data_max_percent, int, 0444);
1118 MODULE_PARM_DESC(zfs_dirty_data_max_percent, "percent of ram can be dirty");
1119
1120 /* zfs_dirty_data_max_max_percent only applied at module load in arc_init(). */
1121 module_param(zfs_dirty_data_max_max_percent, int, 0444);
1122 MODULE_PARM_DESC(zfs_dirty_data_max_max_percent,
1123         "zfs_dirty_data_max upper bound as % of RAM");
1124
1125 module_param(zfs_delay_min_dirty_percent, int, 0644);
1126 MODULE_PARM_DESC(zfs_delay_min_dirty_percent, "transaction delay threshold");
1127
1128 module_param(zfs_dirty_data_max, ulong, 0644);
1129 MODULE_PARM_DESC(zfs_dirty_data_max, "determines the dirty space limit");
1130
1131 /* zfs_dirty_data_max_max only applied at module load in arc_init(). */
1132 module_param(zfs_dirty_data_max_max, ulong, 0444);
1133 MODULE_PARM_DESC(zfs_dirty_data_max_max,
1134         "zfs_dirty_data_max upper bound in bytes");
1135
1136 module_param(zfs_dirty_data_sync, ulong, 0644);
1137 MODULE_PARM_DESC(zfs_dirty_data_sync, "sync txg when this much dirty data");
1138
1139 module_param(zfs_delay_scale, ulong, 0644);
1140 MODULE_PARM_DESC(zfs_delay_scale, "how quickly delay approaches infinity");
1141
1142 module_param(zfs_sync_taskq_batch_pct, int, 0644);
1143 MODULE_PARM_DESC(zfs_sync_taskq_batch_pct,
1144         "max percent of CPUs that are used to sync dirty data");
1145 /* END CSTYLED */
1146 #endif