]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
a .25 patch
authorGreg Kroah-Hartman <gregkh@suse.de>
Thu, 15 May 2008 03:08:04 +0000 (20:08 -0700)
committerGreg Kroah-Hartman <gregkh@suse.de>
Thu, 15 May 2008 03:08:04 +0000 (20:08 -0700)
queue-2.6.25/block-do_mounts-accept-root-non-existant-partition.patch [new file with mode: 0644]
queue-2.6.25/series [new file with mode: 0644]

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 (file)
index 0000000..097cda9
--- /dev/null
@@ -0,0 +1,124 @@
+From stable-bounces@linux.kernel.org  Wed May 14 20:06:08 2008
+From: Kay Sievers <kay.sievers@vrfy.org>
+Date: Wed, 14 May 2008 19:20:21 GMT
+Subject: block: do_mounts - accept root=<non-existant partition>
+To: jejb@kernel.org, stable@kernel.org
+Message-ID: <200805141920.m4EJKL00019620@hera.kernel.org>
+
+From: Kay Sievers <kay.sievers@vrfy.org>
+
+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 <neilb@suse.de>
+Tested-by: Joao Luis Meloni Assirati <assirati@nonada.if.usp.br>
+Signed-off-by: Kay Sievers <kay.sievers@vrfy.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ 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 number> */
++      part = simple_strtoul(p, NULL, 10);
++      *p = '\0';
++      res = blk_lookup_devt(s, part);
++      if (res)
++              goto done;
++
++      /* try disk name without p<part number> */
++      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 (file)
index 0000000..628d57a
--- /dev/null
@@ -0,0 +1 @@
+block-do_mounts-accept-root-non-existant-partition.patch