早晨走路来实验室,一路上头上瀑布,脚下海浪,还不慎滑倒,摔了一身水,想起初中时候每次下雨,都从家里百米冲刺到学校北墙,窜上墙头,翻进学校,两相对比,不禁感慨:人都会变老,谁也逃不掉。
言归正传,NFSD端write流程;
resp的定义相比read多了len + stable 两个成员,
struct nfsd3_writeargs {
svc_fh fh;
__u64 offset;
__u32 count;
int stable;
__u32 len;
int vlen;
};
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的路径完全一致了,不再追谁。