Re: udev problem (and fix) for /dev/mtdblock*

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wednesday 18 March 2009, Kay Sievers wrote:
> On Wed, Mar 18, 2009 at 20:44, David Brownell <david-b@xxxxxxxxxxx> wrote:
> 
> > I have a machine running Debian and it's been getting nasty
> > boot messages like:
> >
> >  ...
> >  Synthesizing the initial hotplug events...done.
> >  Waiting for /dev to be fully populated...uncorrectable error : <3>end_request: I/O error, dev mtdblock0, sector 0
> >  Buffer I/O error on device mtdblock0, logical block 0
> >  uncorrectable error : <3>end_request: I/O error, dev mtdblock0, sector 8
> >  Buffer I/O error on device mtdblock0, logical block 1
> >  end_request: I/O error, dev mtdblock0, sector 16
> >  Buffer I/O error on device mtdblock0, logical block 2
> >  end_request: I/O error, dev mtdblock0, sector 24
> >  Buffer I/O error on device mtdblock0, logical block 3
> >  uncorrectable error : <3>end_request: I/O error, dev mtdblock0, sector 0
> >  Buffer I/O error on device mtdblock0, logical block 0
> >  done.
> >  Setting parameters of disc: (none).
> >  ...
> >
> > Where /dev/mtdblock0 is something of a special NAND partition,
> > used by the mask ROM on the ARM to get a second stage loader,
> > which is then loaded from /dev/mtdblock1 etc.  The messages
> > about "uncorrectable error" are from the kernel, since that
> > first partition uses a different ECC scheme than the rest of
> > the flash.
> >
> > What's happening is that it's trying to read partition data
> > from the MTD devices ... which is inappropriate, they don't
> > use internal partition data.  And the mtdblock0 read fails,
> > because of the ECC differences, producing messages ... ones
> > that should never have appeared, since it shouldn't have
> > been trying to read partition data.
> >
> > The boot is easily cleaned up by a patch to a udev rules
> > file:  /etc/udev/rules.d/60-persistent-storage.rules is
> > already skipping a bunch of devices, it just needs to add
> > the "mtd*" devices to what should be skipped:
> >
> >  KERNEL=="ram*|loop*|fd*|mtd*|nbd*|gnbd*|dm-*|md*", GOTO="persistent_storage_end"
> >
> > It'd be good to see this bug fixed before lenny goes final...
> 
> Udev, by default, investigates all block devices which are created by
> the kernel.

Except for the seven exceptions listed above...

I'm just pointing out an eighth one that should be
included in that list, as a bugfix:  "mtd*".
(Or maybe "mtdblock*".)


> People use label/uuid and other metadata based stuff, so 
> we should look at them.

Yes, people are stupid too.  Such things are basically
meaningless for MTDs.  They don't have labels as those
tools understand them, and partition data is normally
part of board-specific kernel configuration data (or
even kernel command line data passed from bootloaders).

And there's MTD-specific metadata, like the OTP bits
provided on most modern chips and which MTD technology
is used by that device.  Not that it's used like disk
labels are ... but if "metadata" is going to be your
argument, rather than "sort out which disk goes where",
you've come up with yet another reason to treat MTD
hardware differently than udev does today.


See also:

  http://www.linux-mtd.infradead.org/faq/general.html#L_mtd_what
  http://www.linux-mtd.infradead.org/faq/general.html#L_mtd_vs_hdd

Plus the "can I use ext2 on an MTD device" section.

Don't be deceived by the need to have a block device to
mount JFFS2.  Anyone trying to use one of the /dev/mtdblock
devices as a general block device is risking system damage.
Example, with an MLC NAND operation, don't just randomly
update an erase block 1000 times, you will probably kill it
forever.  And if it's already a bad block ... well, it doesn't
handle that well.


> I don't see how userspace could work around this,

Well, the obvious fix is the one I described:  add the
/dev/mtdblock devices to that existing exception list
in udev.

A less obvious one would be to teach every tool that
udev could possibly point towards MTDs to first check
if the device is an MTD, and refuse to use it.  Since
that set of tools is unbounded, this approach clearly
loses.

Another would be to use MTD-specific tools for MTDs.
Of course, those tools aren't used to do anything like
what that persistent-rules file is doing -- and in fact
those tools use the chardev interfaces to MTDs, not the
blockdev ones -- so that's equivalent to the original
fix:  do nothing for any mtdblock device nodes you find.


> and guess the kernel 
> should stop printing errors for stuff it has announced to userspace,
> but is not usable when we look at it.

It's perfectly usable.  Not by the tools udev tries to
use with it, but by "mount" ... /dev/mtdblock* nodes
exist only to support "mount".  (And maybe just for
JFFS2; UBIFS doesn't need them, and I've not looked
at other options.)

Agreed it would be nice to see /dev/mtdblock* vanish,
but that wouldn't be a near-term change.  JFFS would
first need to vanish; I don't know about YAFFS2 (which
may never make mainline given UBIFS).


> Would it help, if we make it easier to disable these rules for
> specific devices from a custom udev rule?

What's needed is to recognize that MTDs are not
block devices in any meaningful sense.  This is
not a "custom" thing -- it's a "standard" thing.

- Dave

 
> Thanks,
> Kay
> 
> 



--
To unsubscribe from this list: send the line "unsubscribe linux-hotplug" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Kernel]     [Linux DVB]     [Asterisk Internet PBX]     [DCCP]     [Netdev]     [X.org]     [Util Linux NG]     [Fedora Women]     [ALSA Devel]     [Linux USB]

  Powered by Linux