]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
libfdisk: improve label deinitialization
authorKarel Zak <kzak@redhat.com>
Tue, 11 Dec 2012 15:37:04 +0000 (16:37 +0100)
committerKarel Zak <kzak@redhat.com>
Mon, 11 Mar 2013 11:47:29 +0000 (12:47 +0100)
Signed-off-by: Karel Zak <kzak@redhat.com>
libfdisk/src/context.c
libfdisk/src/fdiskP.h
libfdisk/src/label.c

index 9801b51f2d433acdbdab832989f9f06a3cdac136..6eaa927b0e5af184f7419a3f1dcfed422ea74422 100644 (file)
@@ -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));
index 4d352b5d4e780b94406dec99332f0289066746ce..144717d660906e7295e64a9245cd46dfaaae6c80 100644 (file)
@@ -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 */
index 5fb40adc7b60bc4cd0ec4f56b39c5ec5d758c7f1..c0ef84e11701fb0840736f29613b40c8242e9ff6 100644 (file)
@@ -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);
 }