init/do_mounts.c: add root=PARTLABEL=<name> support
Support referencing the root partition label from GPT as argument to the root= option on the kernel command line in analogy to referencing the partition uuid as root=PARTUUID=<uuid>. Specifying the partition label instead of the uuid is often much easier, e.g. in embedded environments when there is an A/B rootfs partition scheme for interruptible firmware updates (i.e. rootfsA/ rootfsB). The partition label can be queried with the blkid command. Link: http://lkml.kernel.org/r/20180822060904.828E510665E@pc-niv.weinmann.com Signed-off-by: Nikolaus Voss <nikolaus.voss@loewensteinmedical.de> Reviewed-by: Andrew Morton <akpm@linux-foundation.org> Cc: Dominik Brodowski <linux@dominikbrodowski.net> Cc: Sasha Levin <Alexander.Levin@microsoft.com> Cc: Al Viro <viro@zeniv.linux.org.uk> Cc: Jens Axboe <axboe@kernel.dk> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
22ebb72b32
commit
f027c34d84
|
@ -167,6 +167,24 @@ done:
|
||||||
}
|
}
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* match_dev_by_label - callback for finding a partition using its label
|
||||||
|
* @dev: device passed in by the caller
|
||||||
|
* @data: opaque pointer to the label to match
|
||||||
|
*
|
||||||
|
* Returns 1 if the device matches, and 0 otherwise.
|
||||||
|
*/
|
||||||
|
static int match_dev_by_label(struct device *dev, const void *data)
|
||||||
|
{
|
||||||
|
const char *label = data;
|
||||||
|
struct hd_struct *part = dev_to_part(dev);
|
||||||
|
|
||||||
|
if (part->info && !strcmp(label, part->info->volname))
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -190,6 +208,8 @@ done:
|
||||||
* a partition with a known unique id.
|
* a partition with a known unique id.
|
||||||
* 8) <major>:<minor> major and minor number of the device separated by
|
* 8) <major>:<minor> major and minor number of the device separated by
|
||||||
* a colon.
|
* a colon.
|
||||||
|
* 9) PARTLABEL=<name> with name being the GPT partition label.
|
||||||
|
* MSDOS partitions do not support labels!
|
||||||
*
|
*
|
||||||
* If name doesn't have fall into the categories above, we return (0,0).
|
* If name doesn't have fall into the categories above, we return (0,0).
|
||||||
* block_class is used to check if something is a disk name. If the disk
|
* block_class is used to check if something is a disk name. If the disk
|
||||||
|
@ -211,6 +231,17 @@ dev_t name_to_dev_t(const char *name)
|
||||||
if (!res)
|
if (!res)
|
||||||
goto fail;
|
goto fail;
|
||||||
goto done;
|
goto done;
|
||||||
|
} else if (strncmp(name, "PARTLABEL=", 10) == 0) {
|
||||||
|
struct device *dev;
|
||||||
|
|
||||||
|
dev = class_find_device(&block_class, NULL, name + 10,
|
||||||
|
&match_dev_by_label);
|
||||||
|
if (!dev)
|
||||||
|
goto fail;
|
||||||
|
|
||||||
|
res = dev->devt;
|
||||||
|
put_device(dev);
|
||||||
|
goto done;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue