#define BUFLEN 64
-const char *const block_dir_name = "/sys/class/block";
-
struct devpath {
char prefix[5];
char device[11];
char *rootdev = NULL, *devname, *tmp;
int j;
bool found = false;
+ bool allow_fallback = false;
+ bool has_root = false;
glob_t gl;
if (get_var_from_file("/proc/cmdline", "fstools_ignore_partname", rootparam, sizeof(rootparam))) {
return NULL;
}
- if (get_var_from_file("/proc/cmdline", "root", rootparam, sizeof(rootparam))) {
+ /*
+ * Some device may contains a GPT partition named rootfs_data that may not be suitable.
+ * To save from regression with old implementation that doesn't use fstools_ignore_partname to
+ * explicitly say that that partname scan should be ignored, make explicit that scanning each
+ * partition should be done by providing fstools_partname_fallback_scan=1 and skip partname scan
+ * in every other case.
+ */
+ if (get_var_from_file("/proc/cmdline", "fstools_partname_fallback_scan", rootparam, sizeof(rootparam))) {
+ if (!strcmp("1", rootparam))
+ allow_fallback = true;
+ }
+
+ if (get_var_from_file("/proc/cmdline", "root", rootparam, sizeof(rootparam)))
+ has_root = true;
+
+ if (has_root && rootparam[0] == '/') {
rootdev = rootdevname(rootparam);
/* find partition on same device as rootfs */
snprintf(ueventgstr, sizeof(ueventgstr), "%s/%s/*/uevent", block_dir_name, rootdev);
} else {
- /* no 'root=' kernel cmdline parameter, find on any block device */
+ /* For compatibility, devices with root= params must explicitly opt into this fallback. */
+ if (has_root && !allow_fallback)
+ return NULL;
+
+ /* no useful 'root=' kernel cmdline parameter, find on any block device */
snprintf(ueventgstr, sizeof(ueventgstr), "%s/*/uevent", block_dir_name);
}
devname = gl.gl_pathv[j];
tmp = strrchr(devname, '/');
+ if (!tmp)
+ return NULL;
+
*tmp = '\0';
devname = strrchr(devname, '/') + 1;
static struct driver partname_driver = {
.name = "partname",
+ .priority = 25,
.find = partname_volume_find,
.init = partname_volume_init,
.identify = partname_volume_identify,