免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1988 | 回复: 2
打印 上一主题 下一主题

nd.mnt->mnt_sb == sb [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-07-09 12:59 |只看该作者 |倒序浏览
if (nd.mnt && nd.mnt->mnt_sb == sb
                       && nd.mnt->mnt_root == nd.dentry)什么意思?
请指教,谢谢

long do_mount(char * dev_name, char * dir_name, char *type_page,
                  unsigned long flags, void *data_page)
{
        struct file_system_type * fstype;
        struct nameidata nd;
        struct vfsmount *mnt = NULL;
        struct super_block *sb;
        int retval = 0;

        /* Discard magic */
        if ((flags & MS_MGC_MSK) == MS_MGC_VAL)
                flags &= ~MS_MGC_MSK;

        /* Basic sanity checks */

        if (!dir_name || !*dir_name || !memchr(dir_name, 0, PAGE_SIZE))
                return -EINVAL;
        if (dev_name && !memchr(dev_name, 0, PAGE_SIZE))
                return -EINVAL;

        /* OK, looks good, now let's see what do they want */

        /* just change the flags? - capabilities are checked in do_remount() */
        if (flags & MS_REMOUNT)
                return do_remount(dir_name, flags & ~MS_REMOUNT,
                                  (char *) data_page);

        /* "mount --bind"? Equivalent to older "mount -t bind" */
        /* No capabilities? What if users do thousands of these? */
        if (flags & MS_BIND)
                return do_loopback(dev_name, dir_name);

        /* For the rest we need the type */

        if (!type_page || !memchr(type_page, 0, PAGE_SIZE))
                return -EINVAL;

#if 0        /* Can be deleted again. Introduced in patch-2.3.99-pre6 */
        /* loopback mount? This is special - requires fewer capabilities */
        if (strcmp(type_page, "bind")==0)
                return do_loopback(dev_name, dir_name);
#endif

        /* for the rest we _really_ need capabilities... */
        if (!capable(CAP_SYS_ADMIN))
                return -EPERM;

        /* ... filesystem driver... */
        fstype = get_fs_type(type_page);
        if (!fstype)               
                return -ENODEV;

        /* ... and mountpoint. Do the lookup first to force automounting. */
        if (path_init(dir_name,
                      LOOKUP_FOLLOW|LOOKUP_POSITIVE|LOOKUP_DIRECTORY, &nd))
                retval = path_walk(dir_name, &nd);
        if (retval)
                goto fs_out;

        /* get superblock, locks mount_sem on success */
        if (fstype->fs_flags & FS_NOMOUNT)
                sb = ERR_PTR(-EINVAL);
        else if (fstype->fs_flags & FS_REQUIRES_DEV)
                sb = get_sb_bdev(fstype, dev_name, flags, data_page);
        else if (fstype->fs_flags & FS_SINGLE)
                sb = get_sb_single(fstype, flags, data_page);
        else
                sb = get_sb_nodev(fstype, flags, data_page);

        retval = PTR_ERR(sb);
        if (IS_ERR(sb))
                goto dput_out;

        /* Something was mounted here while we slept */
        while(d_mountpoint(nd.dentry) && follow_down(&nd.mnt, &nd.dentry))
                ;

        /* Refuse the same filesystem on the same mount point */
        retval = -EBUSY;
        if (nd.mnt && nd.mnt->mnt_sb == sb
                       && nd.mnt->mnt_root == nd.dentry)
                goto fail;

        retval = -ENOENT;
        if (!nd.dentry->d_inode)
                goto fail;
        down(&nd.dentry->d_inode->i_zombie);
        if (!IS_DEADDIR(nd.dentry->d_inode)) {
                retval = -ENOMEM;
                mnt = add_vfsmnt(&nd, sb->s_root, dev_name);
        }
        up(&nd.dentry->d_inode->i_zombie);
        if (!mnt)
                goto fail;
        retval = 0;
unlock_out:
        up(&mount_sem);
dput_out:
        path_release(&nd);
fs_out:
        put_filesystem(fstype);
        return retval;

fail:
        if (list_empty(&sb->s_mounts))
                kill_super(sb, 0);
        goto unlock_out;
}

论坛徽章:
0
2 [报告]
发表于 2008-07-09 13:11 |只看该作者
理解那几个字段分别是什么意思
注释已经清晰了

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
3 [报告]
发表于 2008-07-09 13:20 |只看该作者
Refuse the same filesystem on the same mount point ,就是通过super block来检查是否已经mount到了具有相同文件系统的这个mount point 上,原则上是不允许的。

PS:在2.6里面似乎有一些变化了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP