diff options
-rw-r--r-- | libfdisk/docs/libfdisk-sections.txt | 1 | ||||
-rw-r--r-- | libfdisk/src/context.c | 36 | ||||
-rw-r--r-- | libfdisk/src/libfdisk.h.in | 2 | ||||
-rw-r--r-- | libfdisk/src/libfdisk.sym | 4 | ||||
-rw-r--r-- | libfdisk/src/script.c | 1 |
5 files changed, 44 insertions, 0 deletions
diff --git a/libfdisk/docs/libfdisk-sections.txt b/libfdisk/docs/libfdisk-sections.txt index ad8f14886..767089a71 100644 --- a/libfdisk/docs/libfdisk-sections.txt +++ b/libfdisk/docs/libfdisk-sections.txt @@ -287,6 +287,7 @@ fdisk_unref_table fdisk_context fdisk_assign_device fdisk_deassign_device +fdisk_reassign_device fdisk_enable_bootbits_protection fdisk_enable_details fdisk_enable_listonly diff --git a/libfdisk/src/context.c b/libfdisk/src/context.c index 951310ffa..666ebbba0 100644 --- a/libfdisk/src/context.c +++ b/libfdisk/src/context.c @@ -632,6 +632,8 @@ int fdisk_deassign_device(struct fdisk_context *cxt, int nosync) return rc; } + DBG(CXT, ul_debugobj(cxt, "de-assigning device %s", cxt->dev_path)); + if (cxt->readonly) close(cxt->dev_fd); else { @@ -656,6 +658,40 @@ int fdisk_deassign_device(struct fdisk_context *cxt, int nosync) } /** + * fdisk_reassign_device: + * @cxt: context + * + * This function is "hard reset" of the context and it does not write anything + * to the device. All in-memory changes associated with the context will be + * lost. It's recommended to use this function after some fatal problem when the + * context (and label specific driver) is in an undefined state. + * + * Returns: 0 on success, < 0 on error. + */ +int fdisk_reassign_device(struct fdisk_context *cxt) +{ + char *devname; + int rdonly, rc; + + assert(cxt); + assert(cxt->dev_fd >= 0); + + DBG(CXT, ul_debugobj(cxt, "re-assigning device %s", cxt->dev_path)); + + devname = strdup(cxt->dev_path); + if (!devname) + return -ENOMEM; + + rdonly = cxt->readonly; + + fdisk_deassign_device(cxt, 1); + rc = fdisk_assign_device(cxt, devname, rdonly); + free(devname); + + return rc; +} + +/** * fdisk_is_readonly: * @cxt: context * diff --git a/libfdisk/src/libfdisk.h.in b/libfdisk/src/libfdisk.h.in index 26dfe58c0..11b025c32 100644 --- a/libfdisk/src/libfdisk.h.in +++ b/libfdisk/src/libfdisk.h.in @@ -181,6 +181,8 @@ int fdisk_is_labeltype(struct fdisk_context *cxt, enum fdisk_labeltype id); int fdisk_assign_device(struct fdisk_context *cxt, const char *fname, int readonly); int fdisk_deassign_device(struct fdisk_context *cxt, int nosync); +int fdisk_reassign_device(struct fdisk_context *cxt); + int fdisk_is_readonly(struct fdisk_context *cxt); int fdisk_is_regfile(struct fdisk_context *cxt); diff --git a/libfdisk/src/libfdisk.sym b/libfdisk/src/libfdisk.sym index c26abf0d0..7063649b8 100644 --- a/libfdisk/src/libfdisk.sym +++ b/libfdisk/src/libfdisk.sym @@ -282,3 +282,7 @@ FDISK_2.30 { fdisk_is_ptcollision; fdisk_partition_has_wipe; } FDISK_2.29; + +FDISK_2.31 { + fdisk_reassign_device; +} FDISK_2.30; diff --git a/libfdisk/src/script.c b/libfdisk/src/script.c index be325bc09..b0ac8b245 100644 --- a/libfdisk/src/script.c +++ b/libfdisk/src/script.c @@ -1373,6 +1373,7 @@ struct fdisk_script *fdisk_get_script(struct fdisk_context *cxt) * @dp: script * * Associate context @cxt with script @dp and creates a new empty disklabel. + * The script may be later unreference by fdisk_set_script() with NULL as script. * * Returns: 0 on success, <0 on error. */ |