Oops apres demontage d'une partition YAFFS2 [LONG...]

Page principale

Répondre à ce message
Auteur: olivier.eribon
Date:  
À: guilde@imag.fr
Sujet: Oops apres demontage d'une partition YAFFS2 [LONG...]
Bonjour a tous,

J'utilise depuis plus de 3 ans un systeme de fichiers journalisé appelé yaffs
(yet another flash file system) sur une memoire nand flash a partir d'un noyau
linux 2.4.18_mvl30 (montavista avec le patch prehantif) sur une carte cpu a
base de power pc.

Voici pour le decor. J'ai integre une version de mtd (memory technology devices)
(janvier 2003) plus recente que le noyau afin d'utiliser yaffs et/ou jffs2.

Aujourd'hui je souhaite pouvoir gerer les flash nand de 2k par page (precedemant
512 oct/page) mais pour cela je dois utiliser yaffs2. Et pour yaffs2 il faut
prendre une version plus recente de mtd (janvier 2005).

Bien evidament aucun des ces versions ne sont prevue pour fonctionner avec un
noyau 2.4.18.

Pourtant j'ai integre l'ensemble et ceci semble fonctionner au disfocntionnement
suivant pres :

Montage d'une partition en yaffs2, ecriture dans cette partition correcte.
/mnt/automount est seulement un point de montage de la dite partition

[root@base-8000-0 automount]# df
Filesystem            1k-blocks      Used Available Use% Mounted on
/dev/root             130665864  68352232  61006974  53% /
/dev/ram0                  7931      5042      2480  68% /mnt/var/log
/dev/ram1                  7931        22      7500   1% /var/spool
/dev/ram2                  7931        22      7500   1% /tmp
/dev/mtdblock2           112640     59796     52844  54% /mnt/automount
ensun14:/home/mts8000 130665888  68352256  61006976  53% /mnt/home
[root@base-8000-0 automount]# cd


Un umount se termine bien cf strace :

[root@base-8000-0 root]# strace umount /mnt/automount/
execve("/bin/umount", ["umount", "/mnt/automount/"], [/* 14 varsnand_sync:
called
 */]) = 0
brk(0mtdblock_release
nand_sync: called
ok
)                                  = 0x1001a57c
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) =
0x30018000
open("/etc/ld.so.preload", O_RDONLY)    = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY)      = 3
fstat64(0x3, 0x7ffff018)                = 0
mmap(NULL, 14606, PROT_READ, MAP_PRIVATE, 3, 0) = 0x30019000
close(3)                                = 0
open("/lib/libc.so.6", O_RDONLY)        = 3
read(3, "\177ELF\1\2\1\0\0\0\0\0\0\0\0\0\0\3\0\24\0\0\0\1\0\1\344"..., 1024) =
1024
fstat64(0x3, 0x7ffff070)                = 0
mmap(0xfeb4000, 1294044, PROT_READ|PROT_EXEC, MAP_PRIVATE, 3, 0) = 0xfeb4000
mprotect(0xffd5000, 110300, PROT_NONE)  = 0
mmap(0xffe4000, 28672, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3,
0x120000) = 0xffe4000
mmap(0xffeb000, 20188, PROT_READ|PROT_WRITE|PROT_EXEC,
MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xffeb000
close(3)                                = 0
mprotect(0xfeb4000, 1183744, PROT_READ|PROT_WRITE) = 0
mprotect(0xfeb4000, 1183744, PROT_READ|PROT_EXEC) = 0
munmap(0x30019000, 14606)               = 0
brk(0)                                  = 0x1001a57c
brk(0x1001a5a4)                         = 0x1001a5a4
brk(0x1001b000)                         = 0x1001b000
getuid()                                = 0
geteuid()                               = 0
brk(0x1001d000)                         = 0x1001d000
readlink("/mnt", 0x7fffec78, 4096)      = -1 EINVAL (Invalid argument)
readlink("/mnt/automount", 0x7fffec78, 4096) = -1 EINVAL (Invalid argument)
open("/etc/mtab", O_RDONLY|O_LARGEFILE) = 3
fstat64(0x3, 0x7ffffa38)                = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) =
0x30019000
read(3, "/dev/root / nfs rw,v2,rsize=4096"..., 4096) = 370
read(3, "", 4096)                       = 0
close(3)                                = 0
munmap(0x30019000, 4096)                = 0
oldumount("/mnt/automount")             = 0
lstat64(0x10008338, 0x7ffffba8)         = 0
exit(0)                                 = ?
[root@base-8000-0 root]#


Mais je prochain acces aux inodes entraine un Oops !!!!!!!!!!!

Oops: kernel access of bad area, sig: 11
NIP: C0010524 XER: 00000000 LR: C00104EC SP: C7ABDE10 REGS: c7abdd50 TRAP: 0800
Tainted: PF
MSR: 00001030 EE: 0 PR: 0 FP: 0 ME: 1 IR/DR: 11
DEAR: 62F612D1, ESR: 00000000
TASK = c7abc000[604] 'logrotate' Last syscall: 1
last math 00000000 last altivec 00000000
PLB0: bear= 0x00000000 acr= 0x00000000 besr= 0x00000000
PLB0 to OPB: bear= 0x00000000 besr0= 0x00000000 besr1= 0x00000000

GPR00: 00000002 C7ABDE10 C7ABC000 00000001 00000000 00000001 00004001 C029EBDB
GPR08: 00000000 62F612D1 00000031 2F646576 C0310000 1001E658 00000000 00000000
GPR16: 00000000 00000000 00000000 00000000 00009032 07ABDF30 00000000 C0002D38
GPR24: C0002A20 0FFC2B14 00000000 00000001 00000001 C7FF6AA0 C6E93000 C7ABDE10
Call backtrace:
C02E9860 runqueue_lock
C00533D4 pipe_release
C0053494 pipe_read_release
C0045308 fput
C004296C filp_close
C001AA0C close_files
C001930C put_files_struct
C0019CD8 do_exit
C0019F34 complete_and_exit
C0002A7C ret_from_syscall_1
note: logrotate[604] exited with preempt_count 2

Comment expliquer ce probleme, des changements des structures de base de gestion
des filesystem peuvent elles expliquer ce Oops?

Avez vous des idées ou des methodes car je reste bloqué

Merci pour toute aide

Cordialement

Olivier