Patchwork mtd: sm_ftl: fix typo in major number.

login
register
mail settings
Submitter Maxim Levitsky
Date March 17, 2012, 6:16 p.m.
Message ID <1332008213-3940-1-git-send-email-maximlevitsky@gmail.com>
Download mbox | patch
Permalink /patch/147341/
State Accepted
Commit 452380efbd72d8d41f53ea64c8a6ea1fedc4394d
Headers show

Comments

Maxim Levitsky - March 17, 2012, 6:16 p.m.
major == 0 allocates dynamic major, not major == -1

Signed-off-by: Maxim Levitsky <maximlevitsky@gmail.com>
---
 drivers/mtd/sm_ftl.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)
Artem Bityutskiy - March 20, 2012, 11:40 a.m.
On Sat, 2012-03-17 at 20:16 +0200, Maxim Levitsky wrote:
> major == 0 allocates dynamic major, not major == -1
> 
> Signed-off-by: Maxim Levitsky <maximlevitsky@gmail.com>

Pushed to l2-mtd.git, thanks!
Artem Bityutskiy - March 20, 2012, 11:40 a.m.
On Sat, 2012-03-17 at 20:16 +0200, Maxim Levitsky wrote:
> major == 0 allocates dynamic major, not major == -1
> 
> Signed-off-by: Maxim Levitsky <maximlevitsky@gmail.com>

Pushed to l2-mtd.git, thanks!
Alex Elsayed - May 19, 2012, 11:28 a.m.
Maxim Levitsky wrote:

> major == 0 allocates dynamic major, not major == -1

I would appreciate if this could be submitted for -stable, since the 
negative major number breaks LVM (regardless of whether any such devices are 
present). I found this out the hard way when my system failed to boot. 

-stable note: This is in Linus' tree as 
452380efbd72d8d41f53ea64c8a6ea1fedc4394d

For those who don't know (and potentially as a preface for -stable) the 
reason lies in LVM's filtering; in lib/filter/filter.c, lines 230-233:

        if ((line_maj <= 0) || (line_maj >= NUMBER_OF_MAJORS)) {
            blocksection = (line[i] == 'B') ? 1 : 0;
            continue;
        }

Basically, it scans through /proc/devices until it hits a line starting with 
'B', at which point it starts processing block major numbers and 
whitelisting them to be used as PVs. However, the negative number causes a 
problem because it a.) sorts to the top of the list and b.) short-circuits 
the if(). This causes blocksection to flip back to zero immediately, 
terminating the enumeration of permitted devices before any actually get 
whitelisted. As a result, *all* block devices are ignored, with messages 
such as

Skipping: Unrecognised LVM device type 259

259 being blkext, which LVM explicitly allows.
Artem Bityutskiy - May 19, 2012, 11:37 a.m.
On Sat, 2012-05-19 at 04:28 -0700, Alex Elsayed wrote:
> Maxim Levitsky wrote:
> 
> > major == 0 allocates dynamic major, not major == -1
> 
> I would appreciate if this could be submitted for -stable, since the 
> negative major number breaks LVM (regardless of whether any such devices are 
> present). I found this out the hard way when my system failed to boot. 
> 
> -stable note: This is in Linus' tree as 
> 452380efbd72d8d41f53ea64c8a6ea1fedc4394d

It is in Linuses tree already, so I cannot add the "Cc:
stable@kernel.org" tag anymore. You should send a request to Greg and
explain that you want this patch in -stable.

Patch

diff --git a/drivers/mtd/sm_ftl.c b/drivers/mtd/sm_ftl.c
index 072ed59..9e2dfd5 100644
--- a/drivers/mtd/sm_ftl.c
+++ b/drivers/mtd/sm_ftl.c
@@ -1256,7 +1256,7 @@  static void sm_remove_dev(struct mtd_blktrans_dev *dev)
 
 static struct mtd_blktrans_ops sm_ftl_ops = {
 	.name		= "smblk",
-	.major		= -1,
+	.major		= 0,
 	.part_bits	= SM_FTL_PARTN_BITS,
 	.blksize	= SM_SECTOR_SIZE,
 	.getgeo		= sm_getgeo,