summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libfdisk/docs/libfdisk-sections.txt1
-rw-r--r--libfdisk/src/context.c36
-rw-r--r--libfdisk/src/libfdisk.h.in2
-rw-r--r--libfdisk/src/libfdisk.sym4
-rw-r--r--libfdisk/src/script.c1
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.
*/