From 8cc4c3b370d59deb16c2e92165a466c82e914020 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Wed, 14 May 2008 20:08:04 -0700 Subject: [PATCH] a .25 patch --- ...s-accept-root-non-existant-partition.patch | 124 ++++++++++++++++++ queue-2.6.25/series | 1 + 2 files changed, 125 insertions(+) create mode 100644 queue-2.6.25/block-do_mounts-accept-root-non-existant-partition.patch create mode 100644 queue-2.6.25/series diff --git a/queue-2.6.25/block-do_mounts-accept-root-non-existant-partition.patch b/queue-2.6.25/block-do_mounts-accept-root-non-existant-partition.patch new file mode 100644 index 00000000000..097cda9928b --- /dev/null +++ b/queue-2.6.25/block-do_mounts-accept-root-non-existant-partition.patch @@ -0,0 +1,124 @@ +From stable-bounces@linux.kernel.org Wed May 14 20:06:08 2008 +From: Kay Sievers +Date: Wed, 14 May 2008 19:20:21 GMT +Subject: block: do_mounts - accept root= +To: jejb@kernel.org, stable@kernel.org +Message-ID: <200805141920.m4EJKL00019620@hera.kernel.org> + +From: Kay Sievers + +commit 30f2f0eb4bd2c43d10a8b0d872c6e5ad8f31c9a0 upstream + +Some devices, like md, may create partitions only at first access, +so allow root= to be set to a valid non-existant partition of an +existing disk. This applies only to non-initramfs root mounting. + +This fixes a regression from 2.6.24 which did allow this to happen and +broke some users machines :( + +Acked-by: Neil Brown +Tested-by: Joao Luis Meloni Assirati +Signed-off-by: Kay Sievers +Signed-off-by: Greg Kroah-Hartman + +--- + block/genhd.c | 9 ++++++--- + include/linux/genhd.h | 4 ++-- + init/do_mounts.c | 27 ++++++++++++++++++++++++++- + 3 files changed, 34 insertions(+), 6 deletions(-) + +--- a/block/genhd.c ++++ b/block/genhd.c +@@ -645,7 +645,7 @@ void genhd_media_change_notify(struct ge + EXPORT_SYMBOL_GPL(genhd_media_change_notify); + #endif /* 0 */ + +-dev_t blk_lookup_devt(const char *name) ++dev_t blk_lookup_devt(const char *name, int part) + { + struct device *dev; + dev_t devt = MKDEV(0, 0); +@@ -653,7 +653,11 @@ dev_t blk_lookup_devt(const char *name) + mutex_lock(&block_class_lock); + list_for_each_entry(dev, &block_class.devices, node) { + if (strcmp(dev->bus_id, name) == 0) { +- devt = dev->devt; ++ struct gendisk *disk = dev_to_disk(dev); ++ ++ if (part < disk->minors) ++ devt = MKDEV(MAJOR(dev->devt), ++ MINOR(dev->devt) + part); + break; + } + } +@@ -661,7 +665,6 @@ dev_t blk_lookup_devt(const char *name) + + return devt; + } +- + EXPORT_SYMBOL(blk_lookup_devt); + + struct gendisk *alloc_disk(int minors) +--- a/include/linux/genhd.h ++++ b/include/linux/genhd.h +@@ -524,7 +524,7 @@ struct unixware_disklabel { + #define ADDPART_FLAG_RAID 1 + #define ADDPART_FLAG_WHOLEDISK 2 + +-extern dev_t blk_lookup_devt(const char *name); ++extern dev_t blk_lookup_devt(const char *name, int part); + extern char *disk_name (struct gendisk *hd, int part, char *buf); + + extern int rescan_partitions(struct gendisk *disk, struct block_device *bdev); +@@ -552,7 +552,7 @@ static inline struct block_device *bdget + + static inline void printk_all_partitions(void) { } + +-static inline dev_t blk_lookup_devt(const char *name) ++static inline dev_t blk_lookup_devt(const char *name, int part) + { + dev_t devt = MKDEV(0, 0); + return devt; +--- a/init/do_mounts.c ++++ b/init/do_mounts.c +@@ -76,6 +76,7 @@ dev_t name_to_dev_t(char *name) + char s[32]; + char *p; + dev_t res = 0; ++ int part; + + if (strncmp(name, "/dev/", 5) != 0) { + unsigned maj, min; +@@ -106,7 +107,31 @@ dev_t name_to_dev_t(char *name) + for (p = s; *p; p++) + if (*p == '/') + *p = '!'; +- res = blk_lookup_devt(s); ++ res = blk_lookup_devt(s, 0); ++ if (res) ++ goto done; ++ ++ /* ++ * try non-existant, but valid partition, which may only exist ++ * after revalidating the disk, like partitioned md devices ++ */ ++ while (p > s && isdigit(p[-1])) ++ p--; ++ if (p == s || !*p || *p == '0') ++ goto fail; ++ ++ /* try disk name without */ ++ part = simple_strtoul(p, NULL, 10); ++ *p = '\0'; ++ res = blk_lookup_devt(s, part); ++ if (res) ++ goto done; ++ ++ /* try disk name without p */ ++ if (p < s + 2 || !isdigit(p[-2]) || p[-1] != 'p') ++ goto fail; ++ p[-1] = '\0'; ++ res = blk_lookup_devt(s, part); + if (res) + goto done; + diff --git a/queue-2.6.25/series b/queue-2.6.25/series new file mode 100644 index 00000000000..628d57a6b31 --- /dev/null +++ b/queue-2.6.25/series @@ -0,0 +1 @@ +block-do_mounts-accept-root-non-existant-partition.patch -- 2.47.3