summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
9384b0a)
If we have a device-mapper snapshot available we can now guarantee
filesystem recovery will not write back to a read-only mounted disk.
Allow recovery on those devices with the notable exception of XFS which
may fail to mount if the filesystem is the opposite endian of Petitboot.
Signed-off-by: Samuel Mendoza-Jonas <sam.mj@au1.ibm.com>
-static const char *fs_parameters(unsigned int rw_flags, const char *fstype)
+static const char *fs_parameters(struct discover_device *dev,
+ unsigned int rw_flags)
+ const char *fstype = discover_device_get_param(dev, "ID_FS_TYPE");
+
+ /* XFS journals are not cross-endian compatible; don't try recovery
+ * even if we have a snapshot */
+ if (!strncmp(fstype, "xfs", strlen("xfs")))
+ return "norecovery";
+
+ /* If we have a snapshot available allow touching the filesystem */
+ if (dev->ramdisk)
+ return "";
+
if ((rw_flags | MS_RDONLY) != MS_RDONLY)
return "";
if ((rw_flags | MS_RDONLY) != MS_RDONLY)
return "";
- /* Avoid writing back to the disk on journaled filesystems */
+ /* Avoid writes due to journal replay if we don't have a snapshot */
if (!strncmp(fstype, "ext4", strlen("ext4")))
return "norecovery";
if (!strncmp(fstype, "ext4", strlen("ext4")))
return "norecovery";
- if (!strncmp(fstype, "xfs", strlen("xfs")))
- return "norecovery";
errno = 0;
rc = mount(device_path, dev->mount_path, fstype,
MS_RDONLY | MS_SILENT,
errno = 0;
rc = mount(device_path, dev->mount_path, fstype,
MS_RDONLY | MS_SILENT,
- fs_parameters(MS_RDONLY, fstype));
+ fs_parameters(dev, MS_RDONLY));
if (!rc) {
dev->mounted = true;
dev->mounted_rw = false;
if (!rc) {
dev->mounted = true;
dev->mounted_rw = false;
rc = mount(device_path, dev->mount_path, fstype,
MS_SILENT,
rc = mount(device_path, dev->mount_path, fstype,
MS_SILENT,
- fs_parameters(MS_REMOUNT, fstype));
+ fs_parameters(dev, MS_REMOUNT));
device_path, strerror(errno));
if (mount(device_path, dev->mount_path, fstype,
MS_RDONLY | MS_SILENT,
device_path, strerror(errno));
if (mount(device_path, dev->mount_path, fstype,
MS_RDONLY | MS_SILENT,
- fs_parameters(MS_RDONLY, fstype)))
+ fs_parameters(dev, MS_RDONLY)))
pb_log("Unable to recover mount for %s: %s\n",
device_path, strerror(errno));
return -1;
pb_log("Unable to recover mount for %s: %s\n",
device_path, strerror(errno));
return -1;
mount(device_path, dev->mount_path, fstype,
MS_RDONLY | MS_SILENT,
mount(device_path, dev->mount_path, fstype,
MS_RDONLY | MS_SILENT,
- fs_parameters(MS_RDONLY, fstype));
+ fs_parameters(dev, MS_RDONLY));
if (rc)
pb_log("Failed to remount %s read-only: %s\n",
device_path, strerror(errno));
if (rc)
pb_log("Failed to remount %s read-only: %s\n",
device_path, strerror(errno));