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