From: Karel Zak Date: Mon, 10 Jul 2017 10:32:26 +0000 (+0200) Subject: libfdisk: add fdisk_reassign_device() X-Git-Tag: v2.31-rc1~227 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=2469ba36774f1cc982fe3bace2e8c21aa26701d6;p=thirdparty%2Futil-linux.git libfdisk: add fdisk_reassign_device() Signed-off-by: Karel Zak --- diff --git a/libfdisk/docs/libfdisk-sections.txt b/libfdisk/docs/libfdisk-sections.txt index ad8f148861..767089a71c 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 951310ffae..666ebbba05 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 { @@ -655,6 +657,40 @@ int fdisk_deassign_device(struct fdisk_context *cxt, int nosync) return 0; } +/** + * 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 26dfe58c0e..11b025c324 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 c26abf0d0d..7063649b80 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 be325bc09b..b0ac8b2458 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. */