mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2026-05-22 18:40:43 +03:00
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 <behlendorf1@llnl.gov> Closes #910
This commit is contained in:
+3
-3
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user