连续两次打开同一个文件

本文探讨了在NFS(网络文件系统)中,当一个用户连续两次以只读权限打开同一文件时的情况。在第二次打开文件时,客户端不再向服务器发送OPEN请求,而是通过检查已有的状态来处理。文章提到了RPC(远程过程调用)的相关处理函数,如rpc_call_done()、rpc_count_stats()和rpc_release(),并详细阐述了在OPEN操作中,客户端如何利用can_open_cached()和nfs4.Try_open_cached()函数判断和处理已缓存的文件状态。
摘要由CSDN通过智能技术生成

        前面几篇文章中我们讲解了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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值