summaryrefslogtreecommitdiffstats
path: root/discover/device-handler.c
diff options
context:
space:
mode:
authorJeremy Kerr <jk@ozlabs.org>2013-10-01 12:27:35 +0800
committerJeremy Kerr <jk@ozlabs.org>2013-10-01 12:52:00 +0800
commit9fbd73a208c9465b4bf9e2c80c7290b72e62ead1 (patch)
treea0e2899a65433c23105140ab8591b10c19325c32 /discover/device-handler.c
parentb86a7a0533c4d723ea940ac2071f845f165f832c (diff)
downloadtalos-petitboot-9fbd73a208c9465b4bf9e2c80c7290b72e62ead1.tar.gz
talos-petitboot-9fbd73a208c9465b4bf9e2c80c7290b72e62ead1.zip
discover: Add device_{request,release}_write
Add a pair of functions to the parser API to allow write access to the underlying device. We'll use this in the GRUB2 parser to implement environment persistence. Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
Diffstat (limited to 'discover/device-handler.c')
-rw-r--r--discover/device-handler.c56
1 files changed, 53 insertions, 3 deletions
diff --git a/discover/device-handler.c b/discover/device-handler.c
index fc280af..04a4484 100644
--- a/discover/device-handler.c
+++ b/discover/device-handler.c
@@ -721,12 +721,15 @@ static bool check_existing_mount(struct discover_device *dev)
continue;
if (mntstat.st_rdev == devstat.st_rdev) {
- pb_debug("%s: %s is already mounted at %s\n"
- __func__, dev->device_path,
- mnt->mnt_dir);
dev->mount_path = talloc_strdup(dev, mnt->mnt_dir);
+ dev->mounted_rw = !!hasmntopt(mnt, "rw");
dev->mounted = true;
dev->unmount = false;
+
+ pb_debug("%s: %s is already mounted (r%c) at %s\n",
+ __func__, dev->device_path,
+ dev->mounted_rw ? 'w' : 'o',
+ mnt->mnt_dir);
break;
}
}
@@ -763,6 +766,7 @@ static int mount_device(struct discover_device *dev)
"-o", "ro", NULL);
if (!rc) {
dev->mounted = true;
+ dev->mounted_rw = false;
dev->unmount = true;
return 0;
}
@@ -773,6 +777,7 @@ static int mount_device(struct discover_device *dev)
if (!rc) {
dev->mounted = true;
+ dev->mounted_rw = true;
dev->unmount = true;
return 0;
}
@@ -805,6 +810,39 @@ static int umount_device(struct discover_device *dev)
return 0;
}
+
+int device_request_write(struct discover_device *dev, bool *release)
+{
+ int rc;
+
+ *release = false;
+
+ if (!dev->mounted)
+ return -1;
+
+ if (dev->mounted_rw)
+ return 0;
+
+ rc = process_run_simple(dev, pb_system_apps.mount, dev->mount_path,
+ "-o", "remount,rw", NULL);
+ if (rc)
+ return -1;
+
+ dev->mounted_rw = true;
+ *release = true;
+ return 0;
+}
+
+void device_release_write(struct discover_device *dev, bool release)
+{
+ if (!release)
+ return;
+
+ process_run_simple(dev, pb_system_apps.mount, dev->mount_path,
+ "-o", "remount,ro", NULL);
+ dev->mounted_rw = false;
+}
+
#else
static int umount_device(struct discover_device *dev __attribute__((unused)))
@@ -818,5 +856,17 @@ static int __attribute__((unused)) mount_device(
return 0;
}
+int device_request_write(struct discover_device *dev __attribute__((unused)),
+ bool *release)
+{
+ *release = true;
+ return 0;
+}
+
+void device_release_write(struct discover_device *dev __attribute__((unused)),
+ bool release __attribute__((unused)))
+{
+}
+
#endif
OpenPOWER on IntegriCloud