diff options
-rw-r--r-- | disk-utils/cfdisk.c | 2 | ||||
-rw-r--r-- | disk-utils/fdisk-menu.c | 8 | ||||
-rw-r--r-- | disk-utils/fdisk.c | 4 | ||||
-rw-r--r-- | libfdisk/src/context.c | 36 | ||||
-rw-r--r-- | libfdisk/src/dump.c | 4 | ||||
-rw-r--r-- | libfdisk/src/fdiskP.h | 1 | ||||
-rw-r--r-- | libfdisk/src/libfdisk.h | 2 |
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); |