前面几篇文章中我们讲解了OPEN操作中最基本的情况:打开服务器端存在的一个文件,接下来的几篇文章中,我们讨论几种特殊情况。这篇文章中我们先讨论第一种情况:同一个用户连续两次打开同一个文件。
用户user1以只读权限打开了文件file1,未关闭文件的情况下又以只读权限打开了文件file1。第一次执行正常的操作,向服务器发送OPEN请求。那么第二次呢?还需要向服务器发送OPEN请求吗?事实上第二次打开文件时就不向服务器发送OPEN请求了。RPC请求为应用程序预留了几个接口,应用程序在发起RPC请求的过程中可以注册几个处理函数。
struct rpc_call_ops {
void (*rpc_call_prepare)(struct rpc_task *, void *);
void (*rpc_call_done)(struct rpc_task *, void *);
void (*rpc_count_stats)(struct rpc_task *, void *);
void (*rpc_release)(void *);
};
rpc_call_prepare()是发起RPC请求报文前执行的函数
rpc_call_done()是处理完RPC应答报文后执行的函数
rpc_count_stats()是一个统计函数,也是在处理完RPC应答报文后执行
rpc_release()是释放资源的函数,比如释放RPC请求过程中申请的内存,当RPC执行完毕或者失败时都会调用这个函数。
OPEN操作中向RPC注册了几个处理函数,处理函数如下:
static const struct rpc_call_ops nfs4_open_ops = {
.rpc_call_prepare = nfs4_open_prepare,
.rpc_call_done = nfs4_open_done,
.rpc_release = nfs4_open_release,
};
这里我们重点关注nfs4_open_prepare(),这个函数代码如下:
// 发送RPC报文前调用这个函数.
static void nfs4_open_prepare(struct rpc_task *task, void *calldata)
{
struct nfs4_opendata *data = calldata; // 取出nfs4_opendata结构
struct nfs4_state_owner *sp = data->owner; // nfs4_stat