NFSD端write流程分析

本文深入解析NFSD端write流程,并详细解释了resp与argp结构体中成员len与count的区别,同时分析了nfsd_write函数内部逻辑及稳定变量stable的作用。此外,还对比了write与read流程,展示了全局变量nfsdstats的使用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

言归正传,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的路径完全一致了,不再追谁。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值