免费注册 查看新帖 |

Chinaunix

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

[FreeBSD] VOP_WRITE_APV原形是什么? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-12-21 16:52 |只看该作者 |倒序浏览
本帖最后由 Roemer 于 2011-12-21 16:53 编辑

Vnode_if.h:

static __inline int VOP_WRITE(
    struct vnode *vp,
    struct uio *uio,
    int ioflag,
    struct ucred *cred)
{
    struct vop_write_args a;

    a.a_gen.a_desc = &vop_write_desc;
    a.a_vp = vp;
    a.a_uio = uio;
    a.a_ioflag = ioflag;
    a.a_cred = cred;
    return (VOP_WRITE_APV(vp->v_op, &a));
}

freebsd内核代码8.2:

vnode_if.src会由 vnode_if.awk生成Vnode_if.h
里面会自动生成VOP_WRITE函数,在系统调用时候使用
其中调用了VOP_WRITE_APV
我没有发现这个函数的定义在那里,那位知道吗?

论坛徽章:
0
2 [报告]
发表于 2011-12-28 05:17 |只看该作者
回复 1# Roemer


*_AP 和 *_APV (_AP的vector变体)都是由 vnode_if.awk 直接生成的。具体定义就在生成的 vnode_if.c 和 vnode_if.h 里。早期的代码中这些是直接 inline 的,现在的做法源于2005年前后的重构,这样做可以方便做类型检查。

论坛徽章:
0
3 [报告]
发表于 2011-12-28 08:20 |只看该作者
本帖最后由 Roemer 于 2011-12-28 08:25 编辑

回复 2# delphij

你好,我核对了一下,新生成的文件有三个vnode_if.h vnode_if_newproto.h vnode_if_typedef.h
里面有一个声明,int VOP_WRITE_APV(struct vop_vector *vop, struct vop_write_args *);
可是还是没有找到定义在那里?
vnode_if.c也没有找到~ (好像openbsd 有这个,不过内容也对不上,freebsd还真没看见。)

    src.zip (6.02 KB, 下载次数: 24)

论坛徽章:
0
4 [报告]
发表于 2011-12-31 14:27 |只看该作者
没有找到vnode_if.c 但确实有vnode_if.o

反汇编得到
int
VOP_WRITE_AP(struct vop_write_args *a)
{

        return(VOP_WRITE_APV(a->a_vp->v_op, a));
}

int
VOP_WRITE_APV(struct vop_vector *vop, struct vop_write_args *a)
{
        int rc;

        VNASSERT(a->a_gen.a_desc == &vop_write_desc, a->a_vp,
            ("Wrong a_desc in vop_write(%p, %p)", a->a_vp, a));
        while(vop != NULL && \
            vop->vop_write == NULL && vop->vop_bypass == NULL)
                vop = vop->vop_default;
        VNASSERT(vop != NULL, a->a_vp, ("No vop_write(%p, %p)", a->a_vp, a));
        SDT_PROBE(vfs, vop, vop_write, entry, a->a_vp, a, 0, 0, 0);

        ASSERT_VI_UNLOCKED(a->a_vp, "VOP_WRITE");
        ASSERT_VOP_LOCKED(a->a_vp, "VOP_WRITE");
        VOP_WRITE_PRE(a);
        if (vop->vop_write != NULL)
                rc = vop->vop_write(a);
        else
                rc = vop->vop_bypass(&a->a_gen);
        CTR4(KTR_VOP,
            "VOP_WRITE(vp 0x%lX, uio 0x%lX, ioflag %ld, cred 0x%lX)",
            a->a_vp, a->a_uio, a->a_ioflag, a->a_cred);
        SDT_PROBE(vfs, vop, vop_write, return, a->a_vp, a, rc, 0, 0);

        if (rc == 0) {
                ASSERT_VI_UNLOCKED(a->a_vp, "VOP_WRITE");
                ASSERT_VOP_LOCKED(a->a_vp, "VOP_WRITE");
        } else {
                ASSERT_VI_UNLOCKED(a->a_vp, "VOP_WRITE");
                ASSERT_VOP_LOCKED(a->a_vp, "VOP_WRITE");
        }
        VOP_WRITE_POST(a, rc);
        return (rc);
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP