diff options
author | Brian Behlendorf <[email protected]> | 2012-10-26 10:01:49 -0700 |
---|---|---|
committer | Brian Behlendorf <[email protected]> | 2012-10-29 08:57:45 -0700 |
commit | e8fd45a0f975c6b8ae8cd644714fc21f14fac2bf (patch) | |
tree | 59aa8971d8aba6dcd8b173d630ffb71b61e8e573 /include/sys | |
parent | 178e73b376297be44253f7655cd8cba3cf082171 (diff) |
Add ddt_object_count() error handling
The interface for the ddt_zap_count() function assumes it can
never fail. However, internally ddt_zap_count() is implemented
with zap_count() which can potentially fail. Now because there
was no way to return the error to the caller a VERIFY was used
to ensure this case never happens.
Unfortunately, it has been observed that pools can be damaged in
such a way that zap_count() fails. The result is that the pool can
not be imported without hitting the VERIFY and crashing the system.
This patch reworks ddt_object_count() so the error can be safely
caught and returned to the caller. This allows a pool which has
be damaged in this way to be safely rewound for import.
Signed-off-by: Brian Behlendorf <[email protected]>
Closes #910
Diffstat (limited to 'include/sys')
-rw-r--r-- | include/sys/ddt.h | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/include/sys/ddt.h b/include/sys/ddt.h index 9724d6ece..69432598b 100644 --- a/include/sys/ddt.h +++ b/include/sys/ddt.h @@ -163,7 +163,7 @@ typedef struct ddt_ops { dmu_tx_t *tx); int (*ddt_op_walk)(objset_t *os, uint64_t object, ddt_entry_t *dde, uint64_t *walk); - uint64_t (*ddt_op_count)(objset_t *os, uint64_t object); + int (*ddt_op_count)(objset_t *os, uint64_t object, uint64_t *count); } ddt_ops_t; #define DDT_NAMELEN 80 @@ -172,8 +172,8 @@ extern void ddt_object_name(ddt_t *ddt, enum ddt_type type, enum ddt_class class, char *name); extern int ddt_object_walk(ddt_t *ddt, enum ddt_type type, enum ddt_class class, uint64_t *walk, ddt_entry_t *dde); -extern uint64_t ddt_object_count(ddt_t *ddt, enum ddt_type type, - enum ddt_class class); +extern int ddt_object_count(ddt_t *ddt, enum ddt_type type, + enum ddt_class class, uint64_t *count); extern int ddt_object_info(ddt_t *ddt, enum ddt_type type, enum ddt_class class, dmu_object_info_t *); extern boolean_t ddt_object_exists(ddt_t *ddt, enum ddt_type type, |