Skip to contentSkip to conversation

mtdblock mount issue

DISCUSSION Max Stirling 3 participants 5 messages Feb 4, 2008 – Feb 8, 2008 Memory technology devices (MTD)

lore
Share & tools
lore
#0 lore raw

Hi,

I am trying to mount a cramfs partition from flash. I have the low level driver written and MTDBLOCK_RO module is enabled in MTD,

My mount fails with invalid argument error.

/mount: Mounting /dev/mtdblock on /home/crfs failed: Invalid argument/

I am using a 512 byte NAND flash 16byte spare.

I can find cramfs in /proc/filesytems and the mtdblock is under /proc/devices.

I had enabled a few debug statements in the mtdblock_ro and the low level nand driver code. I find that the mount is reading 32 pages after which it fails with invalid argument. Below is the log.

If you see the log below, the flow of code is

cramfs_read ==> do_blktrans_request ==> mtdblock_readsect ==> mt_read(my low level read function which returns success)

I even dumped the hex of the data being read by my low level driver module and found to match the cramfs image that I wrote to the flash.

######################*LOG*##########################

/home # mkdir crfs
/home # cat /proc/devices | grep mtdblock
31 mtdblock
/home # cat proc/filesystems | grep cramfs
cramfs
/home #
/home # mknod /dev/mtdblock b 31 0
/home # mount -t cramfs /dev/mtdblock /home/crfs
mount: /dev/mtdblock is write-protected, mounting read-only cramfs_read
do_blktrans_request nsect:8 block:0
mtdblock_readsect
mt_read offset:0
mt_read status:0
mtdblock_readsect
mt_read offset:512
mt_read status:0
mtdblock_readsect
mt_read offset:1024
mt_read status:0
mtdblock_readsect
mt_read offset:1536
mt_read status:0
mtdblock_readsect
mt_read offset:2048
mt_read status:0
mtdblock_readsect
mt_read offset:2560
mt_read status:0
mtdblock_readsect
mt_read offset:3072
mt_read status:0
mtdblock_readsect
mt_read offset:3584
mt_read status:0
do_blktrans_request nsect:8 block:0
mtdblock_readsect
mt_read offset:4096
mt_read status:0
mtdblock_readsect
mt_read offset:4608
mt_read status:0
mtdblock_readsect
mt_read offset:5120
mt_read status:0
mtdblock_readsect
mt_read offset:5632
mt_read status:0
mtdblock_readsect
mt_read offset:6144
mt_read status:0
mtdblock_readsect
mt_read offset:6656
mt_read status:0
mtdblock_readsect
mt_read offset:7168
mt_read status:0
mtdblock_readsect
mt_read offset:7680
mt_read status:0
do_blktrans_request nsect:8 block:0
mtdblock_readsect
mt_read offset:8192
mt_read status:0
mtdblock_readsect
mt_read offset:8704
mt_read status:0
mtdblock_readsect
mt_read offset:9216
mt_read status:0
mtdblock_readsect
mt_read offset:9728
mt_read status:0
mtdblock_readsect
mt_read offset:10240
mt_read status:0
mtdblock_readsect
mt_read offset:10752
mt_read status:0
mtdblock_readsect
mt_read offset:11264
mt_read status:0
mtdblock_readsect
mt_read offset:11776
mt_read status:0
do_blktrans_request nsect:8 block:0
mtdblock_readsect
mt_read offset:12288
mt_read status:0
mtdblock_readsect
mt_read offset:12800
mt_read status:0
mtdblock_readsect
mt_read offset:13312
mt_read status:0
mtdblock_readsect
mt_read offset:13824
mt_read status:0
mtdblock_readsect
mt_read offset:14336
mt_read status:0
mtdblock_readsect
mt_read offset:14848
mt_read status:0
mtdblock_readsect
mt_read offset:15360
mt_read status:0
mtdblock_readsect
mt_read offset:15872
mt_read status:0
cramfs_read
mount: Mounting /dev/mtdblock on /home/crfs failed: Invalid argument /home #

########################################################

I hope I have provided the maximum information. Looking forward for some help.

begin:vcard
fn:M S
n:S;M
version:2.1
end:vcard

#1 lore raw
Quoted 153 lines

-----Original Message-----
From: [email protected] [mailto:[email protected]] On Behalf Of Max Stirling
Sent: Monday, February 04, 2008 6:20 AM
To: [email protected]
Subject: mtdblock mount issue

Hi,

I am trying to mount a cramfs partition from flash. I have the low level driver written and MTDBLOCK_RO module is enabled in MTD,

My mount fails with invalid argument error.

/mount: Mounting /dev/mtdblock on /home/crfs failed: Invalid argument/

I am using a 512 byte NAND flash 16byte spare.

I can find cramfs in /proc/filesytems and the mtdblock is under /proc/devices.

I had enabled a few debug statements in the mtdblock_ro and the low level nand driver code. I find that the mount is reading 32 pages after which it fails with invalid argument. Below is the log.

If you see the log below, the flow of code is

cramfs_read ==> do_blktrans_request ==> mtdblock_readsect
==> mt_read(my low level read function which returns success)

I even dumped the hex of the data being read by my low level driver module and found to match the cramfs image that I wrote to the flash.

######################*LOG*##########################

/home # mkdir crfs
/home # cat /proc/devices | grep mtdblock
31 mtdblock
/home # cat proc/filesystems | grep cramfs
cramfs
/home #
/home # mknod /dev/mtdblock b 31 0
/home # mount -t cramfs /dev/mtdblock /home/crfs
mount: /dev/mtdblock is write-protected, mounting read-only cramfs_read
do_blktrans_request nsect:8 block:0
mtdblock_readsect
mt_read offset:0
mt_read status:0
mtdblock_readsect
mt_read offset:512
mt_read status:0
mtdblock_readsect
mt_read offset:1024
mt_read status:0
mtdblock_readsect
mt_read offset:1536
mt_read status:0
mtdblock_readsect
mt_read offset:2048
mt_read status:0
mtdblock_readsect
mt_read offset:2560
mt_read status:0
mtdblock_readsect
mt_read offset:3072
mt_read status:0
mtdblock_readsect
mt_read offset:3584
mt_read status:0
do_blktrans_request nsect:8 block:0
mtdblock_readsect
mt_read offset:4096
mt_read status:0
mtdblock_readsect
mt_read offset:4608
mt_read status:0
mtdblock_readsect
mt_read offset:5120
mt_read status:0
mtdblock_readsect
mt_read offset:5632
mt_read status:0
mtdblock_readsect
mt_read offset:6144
mt_read status:0
mtdblock_readsect
mt_read offset:6656
mt_read status:0
mtdblock_readsect
mt_read offset:7168
mt_read status:0
mtdblock_readsect
mt_read offset:7680
mt_read status:0
do_blktrans_request nsect:8 block:0
mtdblock_readsect
mt_read offset:8192
mt_read status:0
mtdblock_readsect
mt_read offset:8704
mt_read status:0
mtdblock_readsect
mt_read offset:9216
mt_read status:0
mtdblock_readsect
mt_read offset:9728
mt_read status:0
mtdblock_readsect
mt_read offset:10240
mt_read status:0
mtdblock_readsect
mt_read offset:10752
mt_read status:0
mtdblock_readsect
mt_read offset:11264
mt_read status:0
mtdblock_readsect
mt_read offset:11776
mt_read status:0
do_blktrans_request nsect:8 block:0
mtdblock_readsect
mt_read offset:12288
mt_read status:0
mtdblock_readsect
mt_read offset:12800
mt_read status:0
mtdblock_readsect
mt_read offset:13312
mt_read status:0
mtdblock_readsect
mt_read offset:13824
mt_read status:0
mtdblock_readsect
mt_read offset:14336
mt_read status:0
mtdblock_readsect
mt_read offset:14848
mt_read status:0
mtdblock_readsect
mt_read offset:15360
mt_read status:0
mtdblock_readsect
mt_read offset:15872
mt_read status:0
cramfs_read
mount: Mounting /dev/mtdblock on /home/crfs failed: Invalid argument /home #

Quoted 7 lines

########################################################

I hope I have provided the maximum information. Looking forward for some
help.

You need to mount the file system as read only. I believe I've seen this error when I've mounted a squashfs (also a read only file system) without specifying the read only option.

Try this command:
mount /dev/mtdblock /home/crfs -t cramfs -o ro

Rick

#2 lore raw
Quoted 151 lines · Adams Richard-W36112 wrote:
Quoted 144 lines

-----Original Message-----
From: [email protected] [mailto:[email protected]] On Behalf Of Max Stirling
Sent: Monday, February 04, 2008 6:20 AM
To: [email protected]
Subject: mtdblock mount issue

Hi,

I am trying to mount a cramfs partition from flash. I have the low level driver written and MTDBLOCK_RO module is enabled in MTD,

My mount fails with invalid argument error.

/mount: Mounting /dev/mtdblock on /home/crfs failed: Invalid argument/

I am using a 512 byte NAND flash 16byte spare.

I can find cramfs in /proc/filesytems and the mtdblock is under /proc/devices.

I had enabled a few debug statements in the mtdblock_ro and the low level nand driver code. I find that the mount is reading 32 pages after which it fails with invalid argument. Below is the log.

If you see the log below, the flow of code is

cramfs_read ==> do_blktrans_request ==> mtdblock_readsect
==> mt_read(my low level read function which returns success)

I even dumped the hex of the data being read by my low level driver module and found to match the cramfs image that I wrote to the flash.

######################*LOG*##########################

/home # mkdir crfs
/home # cat /proc/devices | grep mtdblock
31 mtdblock
/home # cat proc/filesystems | grep cramfs
cramfs
/home #
/home # mknod /dev/mtdblock b 31 0
/home # mount -t cramfs /dev/mtdblock /home/crfs
mount: /dev/mtdblock is write-protected, mounting read-only cramfs_read
do_blktrans_request nsect:8 block:0
mtdblock_readsect
mt_read offset:0
mt_read status:0
mtdblock_readsect
mt_read offset:512
mt_read status:0
mtdblock_readsect
mt_read offset:1024
mt_read status:0
mtdblock_readsect
mt_read offset:1536
mt_read status:0
mtdblock_readsect
mt_read offset:2048
mt_read status:0
mtdblock_readsect
mt_read offset:2560
mt_read status:0
mtdblock_readsect
mt_read offset:3072
mt_read status:0
mtdblock_readsect
mt_read offset:3584
mt_read status:0
do_blktrans_request nsect:8 block:0
mtdblock_readsect
mt_read offset:4096
mt_read status:0
mtdblock_readsect
mt_read offset:4608
mt_read status:0
mtdblock_readsect
mt_read offset:5120
mt_read status:0
mtdblock_readsect
mt_read offset:5632
mt_read status:0
mtdblock_readsect
mt_read offset:6144
mt_read status:0
mtdblock_readsect
mt_read offset:6656
mt_read status:0
mtdblock_readsect
mt_read offset:7168
mt_read status:0
mtdblock_readsect
mt_read offset:7680
mt_read status:0
do_blktrans_request nsect:8 block:0
mtdblock_readsect
mt_read offset:8192
mt_read status:0
mtdblock_readsect
mt_read offset:8704
mt_read status:0
mtdblock_readsect
mt_read offset:9216
mt_read status:0
mtdblock_readsect
mt_read offset:9728
mt_read status:0
mtdblock_readsect
mt_read offset:10240
mt_read status:0
mtdblock_readsect
mt_read offset:10752
mt_read status:0
mtdblock_readsect
mt_read offset:11264
mt_read status:0
mtdblock_readsect
mt_read offset:11776
mt_read status:0
do_blktrans_request nsect:8 block:0
mtdblock_readsect
mt_read offset:12288
mt_read status:0
mtdblock_readsect
mt_read offset:12800
mt_read status:0
mtdblock_readsect
mt_read offset:13312
mt_read status:0
mtdblock_readsect
mt_read offset:13824
mt_read status:0
mtdblock_readsect
mt_read offset:14336
mt_read status:0
mtdblock_readsect
mt_read offset:14848
mt_read status:0
mtdblock_readsect
mt_read offset:15360
mt_read status:0
mtdblock_readsect
mt_read offset:15872
mt_read status:0
cramfs_read
mount: Mounting /dev/mtdblock on /home/crfs failed: Invalid argument /home #

Quoted 6 lines

########################################################

I hope I have provided the maximum information. Looking forward for some help.

Quoted 9 lines

You need to mount the file system as read only. I believe I've seen this error when I've mounted a squashfs (also a read only file system) without specifying the read only option.

Try this command:
mount /dev/mtdblock /home/crfs -t cramfs -o ro

Rick

Thanks mate. After some debugging I found that in cramfs_read function it calls read_cache_page and the returned superblock magic is not correct from cramfs_read.

I am not sure whatz gone wrong since in my low level driver code I dumped the data that is being copied to the buffer that readsect from block_ro passed and the magic was right there.

Have to dig into what might be causing this wrong data to be returned by read_cache_page. One more thing that I noticed was that for every run the magic in the page that read_cache_page returns is different !!!

I am using linux kernel 2.6.10, the latest kernel calls read_mapping_page_async in cramfs_read. Not sure if this was a fix to what I have been seeing or something wrong here.

Signature · 1 line
Max Stirling
#3 lore raw
In reply to Max Stirling
Quoted 2 lines

I am trying to mount a cramfs partition from flash.

A word of warning. CRAMFS is broken in kernels < 2.6.18. As far as I can tell, under heavy load (e.g. reading multiple files in parallel that are not cached) it may fail with decompression errors. I think the issue is not exactly with cramfs but with some interaction with page cache. Backporting just cramfs files to 2.6.15 did not help. If you have drop_caches interface (kernel > 2.6.16 or just backport it) it is easy to reproduce. Otherwise it happens _very_ infrequently because most of the time files are already cached. However the consequences are severe - corrupted executables, etc.
Here is a script to reproduce the problem:

===============================================
# Copy large file from cramfs to tmpfs
cp /bin/smbd /tmp/

# First concurrent access to files/directories
while [ 1 ]; do cat /bin/* > /dev/null; done &

# Second concurrent access to test file and cache flush for((i=0;i<99999;i++)) do echo -n "cycle=$i ";
cmp /bin/smbd /tmp/smbd ;
echo 3 > /proc/sys/vm/drop_caches ;
done
===============================================

Note that /bin is in cramfs. smbd can be any large file.
I've also seen statements that drop_caches interface is not 100% reliable. Nevertheless I have experienced decompression errors even without forcing cache purge.
Above script has caused failures on PowerPC/2.6.16 and ARM9/2.6.15. 2.6.18 and 2.6.23 seem ok.

Regards,

Sergei

P.S. Yes, cramfs has little to do with MTD but since ppl here use it with flash I felt it was a good idea to post this warning.

#4 lore raw
Quoted 36 lines · Sergei Sharonov
Quoted 2 lines

I am trying to mount a cramfs partition from flash.

A word of warning. CRAMFS is broken in kernels < 2.6.18. As far as I can tell, under heavy load (e.g. reading multiple files in parallel that are not cached) it may fail with decompression errors. I think the issue is not exactly with cramfs but with some interaction with page cache. Backporting just cramfs files to 2.6.15 did not help. If you have drop_caches interface (kernel > 2.6.16 or just backport it) it is easy to reproduce. Otherwise it happens _very_ infrequently because most of the time files are already cached. However the consequences are severe - corrupted executables, etc.
Here is a script to reproduce the problem:

===============================================
# Copy large file from cramfs to tmpfs
cp /bin/smbd /tmp/

# First concurrent access to files/directories while [ 1 ]; do cat /bin/* > /dev/null; done &

# Second concurrent access to test file and cache flush for((i=0;i<99999;i++)) do echo -n "cycle=$i ";
cmp /bin/smbd /tmp/smbd ;
echo 3 > /proc/sys/vm/drop_caches ;
done
===============================================

Note that /bin is in cramfs. smbd can be any large file.
I've also seen statements that drop_caches interface is not 100% reliable. Nevertheless I have experienced decompression errors even without forcing cache purge. Above script has caused failures on PowerPC/2.6.16 and ARM9/2.6.15. 2.6.18 and 2.6.23 seem ok.

Regards,

Sergei

Quoted 8 lines

P.S. Yes, cramfs has little to do with MTD but since ppl here use it with flash I felt it was a good idea to post this warning.

______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/

thanks for the info. I think I will check out squashfs then.

But before that I wanted to fix the issue that I am seeing. There might be something wrong in my implementation?

BTW I thought this was the right mailing list, since I am trying to mount cramfs image using MTD. Can you point me to the right mailing list?

begin:vcard
fn:M S
n:S;M
version:2.1
end:vcard