NFSD端write流程分析

来源:互联网 发布:2017最新网络流行语 编辑:程序博客网 时间:2024/06/10 00:03

早晨走路来实验室,一路上头上瀑布,脚下海浪,还不慎滑倒,摔了一身水,想起初中时候每次下雨,都从家里百米冲刺到学校北墙,窜上墙头,翻进学校,两相对比,不禁感慨:人都会变老,谁也逃不掉。

言归正传,NFSD端write流程;

resp的定义相比read多了len + stable 两个成员,

struct nfsd3_writeargs {
    svc_fh            fh;
    __u64            offset;
    __u32            count;
    int            stable;
    __u32            len;
    int            vlen;
};

static __be32
nfsd3_proc_write(struct svc_rqst *rqstp, struct nfsd3_writeargs *argp,
                     struct nfsd3_writeres  *resp)
{
    __be32    nfserr;
    unsigned long cnt = argp->len;
    fh_copy(&resp->fh, &argp->fh);
    resp->committed = argp->stable;
    nfserr = nfsd_write(rqstp, &resp->fh, NULL,
                   argp->offset,
                   rqstp->rq_vec, argp->vlen,
                   &cnt,
                   &resp->committed);
    resp->count = cnt;

    RETURN_STATUS(nfserr);

}

这个len与count 有什么区别么?

nfsd_write()中并没有把count参数传递进去,推断count应该是废弃了。

nfsd_write()设置了stable变量,但是没看懂。。。大致判断不会影响下层的调用,之后

    host_err = vfs_writev(file, (struct iovec __user *)vec, vlen, &offset);
    set_fs(oldfs);
    if (host_err < 0)
        goto out_nfserr;
    *cnt = host_err;
    nfsdstats.io_write += host_err;

  nfsdstats是个全局变量,表征全局状态,然后看 vfs_writev();
    if (!(file->f_mode & FMODE_WRITE))
        return -EBADF;
    if (!file->f_op || (!file->f_op->aio_write && !file->f_op->write))
        return -EINVAL;

    return do_readv_writev(WRITE, file, vec, vlen, pos);

看 do_readv_writev();

剩下的代码与read的路径完全一致了,不再追谁。