} device_type_map[] = {
{ IPMI_BOOTDEV_NETWORK, DEVICE_TYPE_NETWORK },
{ IPMI_BOOTDEV_DISK, DEVICE_TYPE_DISK },
+ { IPMI_BOOTDEV_DISK, DEVICE_TYPE_USB },
{ IPMI_BOOTDEV_CDROM, DEVICE_TYPE_OPTICAL },
};
status = talloc_zero(handler, struct boot_status);
status->type = BOOT_STATUS_INFO;
- status->message = talloc_asprintf(status, "Processing %s device %s",
+ /*
+ * TRANSLATORS: this string will be passed the type and identifier
+ * of the device. For example, the first parameter could be "Disk",
+ * (which will be translated accordingly) and the second a Linux device
+ * identifier like 'sda1' (which will not be translated)
+ */
+ status->message = talloc_asprintf(status, _("Processing %s device %s"),
device_type_display_name(dev->device->type),
dev->device->id);
boot_status(handler, status);
device_handler_discover_context_commit(handler, ctx);
out:
- status->message = talloc_asprintf(status,"Processing %s complete\n",
+ /*
+ * TRANSLATORS: the format specifier in this string is a Linux
+ * device identifier, like 'sda1'
+ */
+ status->message = talloc_asprintf(status,_("Processing %s complete"),
dev->device->id);
boot_status(handler, status);
status = talloc_zero(handler, struct boot_status);
status->type = BOOT_STATUS_INFO;
- status->message = talloc_asprintf(status, "Processing dhcp event on %s",
+ /*
+ * TRANSLATORS: this format specifier will be the name of a network
+ * device, like 'eth0'.
+ */
+ status->message = talloc_asprintf(status, _("Processing dhcp event on %s"),
dev->device->id);
boot_status(handler, status);
device_handler_discover_context_commit(handler, ctx);
- status->message = talloc_asprintf(status,"Processing %s complete\n",
+ /*
+ * TRANSLATORS: this format specifier will be the name of a network
+ * device, like 'eth0'.
+ */
+ status->message = talloc_asprintf(status,_("Processing %s complete"),
dev->device->id);
boot_status(handler, status);
status = talloc_zero(handler, struct boot_status);
status->type = BOOT_STATUS_INFO;
- status->message = talloc_asprintf(status, "Processing user config");
+ status->message = talloc_asprintf(status, _("Processing user config"));
boot_status(handler, status);
/* create our context */
device_handler_discover_context_commit(handler, ctx);
status->message = talloc_asprintf(status,
- "Processing user config complete");
+ _("Processing user config complete"));
boot_status(handler, status);
talloc_free(status);
handler->dry_run);
}
-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 "";
- /* 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, "xfs", strlen("xfs")))
- return "norecovery";
return "";
}
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;
int device_request_write(struct discover_device *dev, bool *release)
{
const char *fstype, *device_path;
+ const struct config *config;
int rc;
*release = false;
+ config = config_get();
+ if (!config->allow_writes)
+ return -1;
+
if (!dev->mounted)
return -1;
rc = mount(device_path, dev->mount_path, fstype,
MS_SILENT,
- fs_parameters(MS_REMOUNT, fstype));
+ fs_parameters(dev, MS_REMOUNT));
if (rc)
goto mount_ro;
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;
void device_release_write(struct discover_device *dev, bool release)
{
const char *fstype, *device_path;
- int rc = 0;
if (!release)
return;
device_path = get_device_path(dev);
}
- mount(device_path, dev->mount_path, fstype,
+ if (mount(device_path, dev->mount_path, fstype,
MS_RDONLY | MS_SILENT,
- fs_parameters(MS_RDONLY, fstype));
- if (rc)
+ fs_parameters(dev, MS_RDONLY)))
pb_log("Failed to remount %s read-only: %s\n",
device_path, strerror(errno));
else