|
楼主 |
发表于 2008-3-12 23:15:00
|
显示全部楼层
备注一下
跟入内核,发现第一次mount返回了 -EACCES, 然后加上了 MS_RDONLY 标记重试才能mount上
为何用可写方式sys_mount会出现-EACCES的错误?
269 static int __init do_mount_root(char *name, char *fs, int flags, void *data)
270 {
271 int err;
272 /* add for debug */
273 printk("mounting root, root_device_name: %s\n", root_device_name);
274 printk("s_flags = %ld, flags = %d, MS_RDONLY = %d.\n",
275 current->fs->pwdmnt->mnt_sb->s_flags,
276 flags,
277 MS_RDONLY);
278
279 err = sys_mount(name, "/root", fs, flags, data);
280 if (err)
281 return err; (第一次mount失败,返回给mount_block_root,然后那边加上RDONLY重试)
282
283 sys_chdir("/root");
284 ROOT_DEV = current->fs->pwdmnt->mnt_sb->s_dev;
285 printk("VFS: Mounted root (%s filesystem)%s.\n",
286 current->fs->pwdmnt->mnt_sb->s_type->name,
287 current->fs->pwdmnt->mnt_sb->s_flags & MS_RDONLY ?
288 " readonly" : "");
289 return 0;
290 }
291
292 void __init mount_block_root(char *name, int flags)
293 {
294 char *fs_names = __getname();
295 char *p;
296 char b[BDEVNAME_SIZE];
297
298 get_fs_names(fs_names);
299 retry:
300 for (p = fs_names; *p; p += strlen(p)+1) {
301 int err = do_mount_root(name, p, flags, root_mount_data);
302 switch (err) {
303 case 0:
304 goto out;
305 case -EACCES: (第一次mount走这个流程)
306 printk("mount_block_root name:%s fs:%s flags:%d failed, retry do_mount_root read-only.\n", name, p, flags);
307 flags |= MS_RDONLY;
308 goto retry;
309 case -EINVAL:
310 continue;
311 } |
|