From 0559e742a9a85c64dfc73363be6de74adf644d71 Mon Sep 17 00:00:00 2001 From: Karel Zak Date: Tue, 11 Dec 2012 16:37:04 +0100 Subject: [PATCH] libfdisk: improve label deinitialization Signed-off-by: Karel Zak --- libfdisk/src/context.c | 7 +++++-- libfdisk/src/fdiskP.h | 8 ++++---- libfdisk/src/label.c | 14 +++++++------- 3 files changed, 16 insertions(+), 13 deletions(-) diff --git a/libfdisk/src/context.c b/libfdisk/src/context.c index 9801b51f2d..6eaa927b0e 100644 --- a/libfdisk/src/context.c +++ b/libfdisk/src/context.c @@ -58,11 +58,14 @@ struct fdisk_label *fdisk_context_get_label(struct fdisk_context *cxt, const cha static void reset_context(struct fdisk_context *cxt) { - size_t nlbs; + size_t nlbs, i; struct fdisk_label *lbs[ ARRAY_SIZE(cxt->labels) ]; DBG(CONTEXT, dbgprint("\n-----\nresetting context %p", cxt)); - fdisk_deinit_label(cxt); /* reset the current label */ + + /* reset drives' private data */ + for (i = 0; i < cxt->nlabels; i++) + fdisk_deinit_label(cxt->labels[i]); /* remember permanent setting */ memcpy(lbs, cxt->labels, sizeof(lbs)); diff --git a/libfdisk/src/fdiskP.h b/libfdisk/src/fdiskP.h index 4d352b5d4e..144717d660 100644 --- a/libfdisk/src/fdiskP.h +++ b/libfdisk/src/fdiskP.h @@ -151,14 +151,14 @@ struct fdisk_label_operations { * Generic label */ struct fdisk_label { - const char *name; - + /* persistent information */ + const char *name; struct fdisk_parttype *parttypes; size_t nparttypes; /* number of items in parttypes[] */ + struct fdisk_context *cxt; const struct fdisk_label_operations *op; - struct fdisk_context *cxt; }; /* label allocators */ @@ -233,6 +233,6 @@ extern int fdisk_read_firstsector(struct fdisk_context *cxt); /* label.c */ extern int fdisk_probe_labels(struct fdisk_context *cxt); -extern void fdisk_deinit_label(struct fdisk_context *cxt); +extern void fdisk_deinit_label(struct fdisk_label *lb); #endif /* _LIBFDISK_PRIVATE_H */ diff --git a/libfdisk/src/label.c b/libfdisk/src/label.c index 5fb40adc7b..c0ef84e117 100644 --- a/libfdisk/src/label.c +++ b/libfdisk/src/label.c @@ -159,7 +159,8 @@ int fdisk_create_disklabel(struct fdisk_context *cxt, const char *name) #endif } - fdisk_deinit_label(cxt); /* deinitialize the current label */ + if (cxt->label) + fdisk_deinit_label(cxt->label); cxt->label = fdisk_context_get_label(cxt, name); if (!cxt->label) @@ -224,12 +225,11 @@ size_t fdisk_get_nparttypes(struct fdisk_context *cxt) /* * Resets the current used label driver to initial state */ -void fdisk_deinit_label(struct fdisk_context *cxt) +void fdisk_deinit_label(struct fdisk_label *lb) { - assert(cxt); + assert(lb); - if (!cxt->label || !cxt->label->op->deinit) - return; - - cxt->label->op->deinit(cxt->label); + /* private label information */ + if (lb->op->deinit) + lb->op->deinit(lb); } -- 2.47.2