diff options
author | Matthew Ahrens <[email protected]> | 2014-11-03 12:28:43 -0800 |
---|---|---|
committer | Brian Behlendorf <[email protected]> | 2015-05-04 09:41:10 -0700 |
commit | 3d45fdd6c0d5b4c8e42b6a2cda00bf6f22c9f2bf (patch) | |
tree | 79fabc013cdea334851b2b7ae9d59118e601f8eb /include/sys/dsl_synctask.h | |
parent | cfec5b17b3b04f07381cc705eaf733794d034065 (diff) |
Illumos 4951 - ZFS administrative commands should use reserved space
4951 ZFS administrative commands should use reserved space, not with ENOSPC
Reviewed by: John Kennedy <[email protected]>
Reviewed by: George Wilson <[email protected]>
Reviewed by: Christopher Siden <[email protected]>
Reviewed by: Dan McDonald <[email protected]>
Approved by: Garrett D'Amore <[email protected]>
References:
https://www.illumos.org/issues/4373
https://github.com/illumos/illumos-gate/commit/7d46dc6
Ported by: Brian Behlendorf <[email protected]>
Diffstat (limited to 'include/sys/dsl_synctask.h')
-rw-r--r-- | include/sys/dsl_synctask.h | 42 |
1 files changed, 36 insertions, 6 deletions
diff --git a/include/sys/dsl_synctask.h b/include/sys/dsl_synctask.h index ef86fb64c..6139303c1 100644 --- a/include/sys/dsl_synctask.h +++ b/include/sys/dsl_synctask.h @@ -20,7 +20,7 @@ */ /* * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. - * Copyright (c) 2012 by Delphix. All rights reserved. + * Copyright (c) 2012, 2014 by Delphix. All rights reserved. */ #ifndef _SYS_DSL_SYNCTASK_H @@ -38,11 +38,41 @@ struct dsl_pool; typedef int (dsl_checkfunc_t)(void *, dmu_tx_t *); typedef void (dsl_syncfunc_t)(void *, dmu_tx_t *); +typedef enum zfs_space_check { + /* + * Normal space check: if there is less than 3.2% free space, + * the operation will fail. Operations which are logically + * creating things should use this (e.g. "zfs create", "zfs snapshot"). + * User writes (via the ZPL / ZVOL) also fail at this point. + */ + ZFS_SPACE_CHECK_NORMAL, + + /* + * Space check allows use of half the slop space. If there + * is less than 1.6% free space, the operation will fail. Most + * operations should use this (e.g. "zfs set", "zfs rename"), + * because we want them to succeed even after user writes are failing, + * so that they can be used as part of the space recovery process. + */ + ZFS_SPACE_CHECK_RESERVED, + + /* + * No space check is performed. Only operations which we expect to + * result in a net reduction in space should use this + * (e.g. "zfs destroy". Setting quotas & reservations also uses + * this because it needs to circumvent the quota/reservation checks). + * + * See also the comments above spa_slop_shift. + */ + ZFS_SPACE_CHECK_NONE, +} zfs_space_check_t; + typedef struct dsl_sync_task { txg_node_t dst_node; struct dsl_pool *dst_pool; uint64_t dst_txg; int dst_space; + zfs_space_check_t dst_space_check; dsl_checkfunc_t *dst_checkfunc; dsl_syncfunc_t *dst_syncfunc; void *dst_arg; @@ -50,11 +80,11 @@ typedef struct dsl_sync_task { boolean_t dst_nowaiter; } dsl_sync_task_t; -void dsl_sync_task_sync(dsl_sync_task_t *dst, dmu_tx_t *tx); -int dsl_sync_task(const char *pool, dsl_checkfunc_t *checkfunc, - dsl_syncfunc_t *syncfunc, void *arg, int blocks_modified); -void dsl_sync_task_nowait(struct dsl_pool *dp, dsl_syncfunc_t *syncfunc, - void *arg, int blocks_modified, dmu_tx_t *tx); +void dsl_sync_task_sync(dsl_sync_task_t *, dmu_tx_t *); +int dsl_sync_task(const char *, dsl_checkfunc_t *, + dsl_syncfunc_t *, void *, int, zfs_space_check_t); +void dsl_sync_task_nowait(struct dsl_pool *, dsl_syncfunc_t *, + void *, int, zfs_space_check_t, dmu_tx_t *); #ifdef __cplusplus } |