summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--disk-utils/cfdisk.c2
-rw-r--r--disk-utils/fdisk-menu.c8
-rw-r--r--disk-utils/fdisk.c4
-rw-r--r--libfdisk/src/context.c36
-rw-r--r--libfdisk/src/dump.c4
-rw-r--r--libfdisk/src/fdiskP.h1
-rw-r--r--libfdisk/src/libfdisk.h2
7 files changed, 31 insertions, 26 deletions
diff --git a/disk-utils/cfdisk.c b/disk-utils/cfdisk.c
index c259329c1..ef4e3ffb9 100644
--- a/disk-utils/cfdisk.c
+++ b/disk-utils/cfdisk.c
@@ -2100,7 +2100,7 @@ int main(int argc, char *argv[])
fdisk_unref_table(cf->table);
rc = fdisk_deassign_device(cf->cxt, cf->nwrites == 0);
- fdisk_free_context(cf->cxt);
+ fdisk_unref_context(cf->cxt);
DBG(MISC, ul_debug("bye! [rc=%d]", rc));
return rc == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
}
diff --git a/disk-utils/fdisk-menu.c b/disk-utils/fdisk-menu.c
index c511b626e..efd8dc1c6 100644
--- a/disk-utils/fdisk-menu.c
+++ b/disk-utils/fdisk-menu.c
@@ -475,7 +475,7 @@ static int generic_menu_cb(struct fdisk_context **cxt0,
rc = fdisk_deassign_device(cxt, 0);
/* fallthrough */
case 'q':
- fdisk_free_context(cxt);
+ fdisk_unref_context(cxt);
fputc('\n', stdout);
exit(rc == 0 ? EXIT_SUCCESS : EXIT_FAILURE);
case 'm':
@@ -543,7 +543,7 @@ static int generic_menu_cb(struct fdisk_context **cxt0,
*cxt0 = fdisk_get_parent(cxt);
fdisk_info(cxt, _("Leaving nested disklabel."));
- fdisk_free_context(cxt);
+ fdisk_unref_context(cxt);
cxt = *cxt0;
}
break;
@@ -649,7 +649,7 @@ static int dos_menu_cb(struct fdisk_context **cxt0,
if (!fdisk_has_label(bsd))
rc = fdisk_create_disklabel(bsd, "bsd");
if (rc)
- fdisk_free_context(bsd);
+ fdisk_unref_context(bsd);
else {
*cxt0 = cxt = bsd;
fdisk_sinfo(cxt, FDISK_INFO_SUCCESS,
@@ -683,7 +683,7 @@ static int dos_menu_cb(struct fdisk_context **cxt0,
*cxt0 = fdisk_get_parent(cxt);
fdisk_info(cxt, _("Leaving nested disklabel."));
- fdisk_free_context(cxt);
+ fdisk_unref_context(cxt);
cxt = *cxt0;
}
break;
diff --git a/disk-utils/fdisk.c b/disk-utils/fdisk.c
index 4f9d69454..c61e26399 100644
--- a/disk-utils/fdisk.c
+++ b/disk-utils/fdisk.c
@@ -74,7 +74,7 @@ int get_user_reply(struct fdisk_context *cxt, const char *prompt,
if (fgets(buf, bufsz, stdin) && !rpmatch(buf))
continue;
}
- fdisk_free_context(cxt);
+ fdisk_unref_context(cxt);
exit(EXIT_FAILURE);
} else
break;
@@ -1064,6 +1064,6 @@ int main(int argc, char **argv)
process_fdisk_menu(&cxt);
}
- fdisk_free_context(cxt);
+ fdisk_unref_context(cxt);
return EXIT_SUCCESS;
}
diff --git a/libfdisk/src/context.c b/libfdisk/src/context.c
index 423244817..caeec231b 100644
--- a/libfdisk/src/context.c
+++ b/libfdisk/src/context.c
@@ -46,6 +46,7 @@ struct fdisk_context *fdisk_new_context(void)
DBG(CXT, ul_debugobj(cxt, "alloc"));
cxt->dev_fd = -1;
+ cxt->refcount = 1;
/*
* Allocate label specific structs.
@@ -85,6 +86,7 @@ struct fdisk_context *fdisk_new_nested_context(struct fdisk_context *parent,
DBG(CXT, ul_debugobj(parent, "alloc nested [%p]", cxt));
cxt->dev_fd = parent->dev_fd;
+ cxt->refcount = 1;
cxt->parent = parent;
cxt->io_size = parent->io_size;
@@ -169,7 +171,7 @@ struct fdisk_label *fdisk_get_label(struct fdisk_context *cxt, const char *name)
*
* while (fdisk_next_label(cxt, &lb) == 0)
* print("label name: %s\n", fdisk_label_get_name(lb));
- * fdisk_free_context(cxt);
+ * fdisk_unref_context(cxt);
* </programlisting>
* </informalexample>
*
@@ -459,32 +461,34 @@ int fdisk_is_readonly(struct fdisk_context *cxt)
}
/**
- * fdisk_free_context:
+ * fdisk_unref_context:
* @cxt: fdisk context
*
* Deallocates context struct.
*/
-void fdisk_free_context(struct fdisk_context *cxt)
+void fdisk_unref_context(struct fdisk_context *cxt)
{
int i;
if (!cxt)
return;
- DBG(CXT, ul_debugobj(cxt, "freeing context %p for %s", cxt, cxt->dev_path));
- reset_context(cxt);
-
- /* deallocate label's private stuff */
- for (i = 0; i < cxt->nlabels; i++) {
- if (!cxt->labels[i])
- continue;
- if (cxt->labels[i]->op->free)
- cxt->labels[i]->op->free(cxt->labels[i]);
- else
- free(cxt->labels[i]);
+ cxt->refcount--;
+ if (cxt->refcount <= 0) {
+ DBG(CXT, ul_debugobj(cxt, "freeing context %p for %s", cxt, cxt->dev_path));
+ reset_context(cxt);
+
+ /* deallocate label's private stuff */
+ for (i = 0; i < cxt->nlabels; i++) {
+ if (!cxt->labels[i])
+ continue;
+ if (cxt->labels[i]->op->free)
+ cxt->labels[i]->op->free(cxt->labels[i]);
+ else
+ free(cxt->labels[i]);
+ }
+ free(cxt);
}
-
- free(cxt);
}
/**
diff --git a/libfdisk/src/dump.c b/libfdisk/src/dump.c
index 561d9c140..d9e1fd12d 100644
--- a/libfdisk/src/dump.c
+++ b/libfdisk/src/dump.c
@@ -714,7 +714,7 @@ int test_dump(struct fdisk_test *ts, int argc, char *argv[])
fdisk_dump_read_context(dp, cxt);
fdisk_dump_set_header(dp, "custom-header-foo", "bar");
- fdisk_free_context(cxt);
+ fdisk_unref_context(cxt);
fdisk_dump_write_file(dp, stdout);
fdisk_unref_dump(dp);
@@ -740,7 +740,7 @@ int test_read(struct fdisk_test *ts, int argc, char *argv[])
fdisk_dump_write_file(dp, stdout);
fdisk_unref_dump(dp);
- fdisk_free_context(cxt);
+ fdisk_unref_context(cxt);
return 0;
}
diff --git a/libfdisk/src/fdiskP.h b/libfdisk/src/fdiskP.h
index 69f264745..54e1d1039 100644
--- a/libfdisk/src/fdiskP.h
+++ b/libfdisk/src/fdiskP.h
@@ -334,6 +334,7 @@ struct fdisk_ask {
struct fdisk_context {
int dev_fd; /* device descriptor */
char *dev_path; /* device path */
+ int refcount;
unsigned char *firstsector; /* buffer with master boot record */
unsigned long firstsector_bufsz;
diff --git a/libfdisk/src/libfdisk.h b/libfdisk/src/libfdisk.h
index 73ac7cb77..19aef58d7 100644
--- a/libfdisk/src/libfdisk.h
+++ b/libfdisk/src/libfdisk.h
@@ -78,7 +78,7 @@ extern void fdisk_init_debug(int mask);
struct fdisk_context *fdisk_new_context(void);
struct fdisk_context *fdisk_new_nested_context(struct fdisk_context *parent, const char *name);
-void fdisk_free_context(struct fdisk_context *cxt);
+void fdisk_unref_context(struct fdisk_context *cxt);
struct fdisk_context *fdisk_get_parent(struct fdisk_context *cxt);