免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: upcuiling
打印 上一主题 下一主题

困扰了3个月的usb硬盘写操作问题,求思路 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2006-11-22 10:08 |只看该作者
下步不知道怎么走了

论坛徽章:
0
12 [报告]
发表于 2006-11-23 23:14 |只看该作者
还有几个地方需要了解的:
1. 是不是每次操作都会出现fat32 filesystem panic?
2. 在出现了panic之后,再对usb硬盘操作(读写大文件,小文件),会出现什么样的情况?
3. 在出现了panic之后,umount,然后再mount上u盘,再对其进行操作,结果是什么样的?

论坛徽章:
0
13 [报告]
发表于 2006-11-24 09:04 |只看该作者
1,每次操作都出现这个问题
2,出现panic后,usb就被设定为read_only了,就写不进去了
3,umount后,再mount 转到第一个问题,usb为可写,但出现原来的panic

论坛徽章:
0
14 [报告]
发表于 2006-11-24 09:54 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
15 [报告]
发表于 2006-11-24 10:48 |只看该作者
原帖由 upcuiling 于 2006-11-24 09:04 发表
1,每次操作都出现这个问题
2,出现panic后,usb就被设定为read_only了,就写不进去了
3,umount后,再mount 转到第一个问题,usb为可写,但出现原来的panic


出现了这样的错误信息了吗?
msdos_write_inode: unable to read i-node block。

如果是的话,可以尝试着这么改一改,看看行不行。
在fs/fat/inode.c中,找到函数fat_write_inode,然后找到下面这段代码
        if (!(bh = fat_bread(sb, i_pos >> MSDOS_SB(sb)->dir_per_block_bits))) {
                printk("dev = %s, ino = %d\n", kdevname(inode->i_dev), i_pos);
                fat_fs_panic(sb, "msdos_write_inode: unable to read i-node block";
                unlock_kernel();
                return;
        }

将这段代码改成(在函数开头定义一个变量int try_cnt = 0;):
        while(!(bh = fat_bread(sb, i_pos >> MSDOS_SB(sb)->dir_per_block_bits))) {
                if(try_cnt++ < 100) {
                        set_current_state(TASK_INTERRUPTIBLE);
                        schedule_timeout(HZ/100 + 1);
                        continue;
                }
                printk("dev = %s, ino = %d\n", kdevname(inode->i_dev), i_pos);
                fat_fs_panic(sb, "msdos_write_inode: unable to read i-node block";
                unlock_kernel();
                return;
        }

然后重新编译内核,试试看(我没试过啊)

论坛徽章:
0
16 [报告]
发表于 2006-11-24 10:50 |只看该作者
总感觉linux上对FAT的支持不够stable。

[ 本帖最后由 siasd 于 2006-11-24 10:54 编辑 ]

论坛徽章:
0
17 [报告]
发表于 2006-11-24 11:26 |只看该作者
全部的出错信息:
Filesystem panic (dev 08:01).
  fat_free: deleting beyond EOF
  File system has been set read-only
file_cluster badly computed!!! 0 <> 1
file_cluster badly computed!!! 1 <> 2
Filesystem panic (dev 08:01).
  File without EOF
cp: write: No space left on device

论坛徽章:
0
18 [报告]
发表于 2006-11-24 12:10 |只看该作者
有没有这样的错误信息:
bread in fat_access failed

论坛徽章:
0
19 [报告]
发表于 2006-11-24 17:02 |只看该作者
原帖由 siasd 于 2006-11-21 10:16 发表
比如可以这样直接不通过文件系统访问usb disk:dd if=/dev/zero of=/dev/sda1 bs=1M count=20。
不过之前我们有人遇到过fat32 filesystem panic,估计和你的情况差不多,听说是内核中fat32 文件系统代码本身的问题


dd命令也走文件系统.
这么说也不对,应该说你操纵的对象是sda1,那么你就应该走文件系统.

我所知有3种层次上可对disk进行读写操作:
1.正常的read/write() 普通设备,那么必会走VFS->具体文件系统->PAGE转换为BUFFER->块设备层->具体驱动
2.采用raw IO方式,具体你可以自己查,调用路线是VFS->raw IO设备(存在于字符设备中)->具体驱动
3.直接从驱动的ioctl()走,通过驱动提供的IOCTL()来直接操作底层寄存器,进而发送ATAPI命令,完成设备读写.
   调用路线VFS->具体驱动->裸设备

[ 本帖最后由 dozec 于 2006-11-24 17:07 编辑 ]

论坛徽章:
0
20 [报告]
发表于 2006-11-24 17:16 |只看该作者
原帖由 upcuiling 于 2006-11-24 11:26 发表
Filesystem panic (dev 08:01).
  fat_free: deleting beyond EOF
  File system has been set read-only
file_cluster badly computed!!! 0 <> 1
file_cluster badly computed!!! 1 <> 2
Filesystem panic (dev 08:01).
  File without EOF
cp: write: No space left on device.


建议你:
现在就从read/write()系统调用往下跟,一直跟到错误(看样子是FAT32本身)处附近.然后再来判定问题所在.
另外建议你查一下scsi storage驱动程序,看看有没有已说明的BUG.我的意思和上页楼上几位的一样,先确定不是底层驱动问题,然后就能确定是文件系统出问题了嘛?然后就跟.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP