没有合适的资源?快使用搜索试试~ 我知道了~
资源详情
资源评论
资源推荐
57
3.3. posix
接口的那些事
前面讲了一些简单的数据结构在内存中的模型,那么知道了 loc_t 和 inode_t
这两个结构之后,如果要真正获取一个文件 inode 信息,那么这里需要怎么做
呢?这就需要用到 posix 接口了,所谓的 posix 接口,是可移植操作系统接口,
因为操作系统的差异可能会导致在具体某些功能实现上不同,但是接口的出入参
和功能确定好,那么调用的时候,调用者就不太需要关心实现细节了。当然,简
单来理解,也可以理解为 web 开发中常见的 restful api 接口。
那么 glusterfs 中要获取一个文件的 inode 信息,必然离不开一个基础的
posix 接口了,那就是 posix_lookup,下面来简单了解一下。
3.3.1. posix_lookup
首 先 这 个 接 口 的 实 现 代 码 在
xlators/storage/posix/src/posix-entry-ops.c 文件里面,下面来看看代码。
另外请注意下面提到的 inode 信息一般指代操作系统的 inode,而 inode_t 则
指代 glusterfs 的一个数据结构,也就是前面提到的。
1.
int32_t
2.
posix_lookup(call_frame_t *frame, xlator_t *this, loc_t *
loc, dict_t *xdata)
3.
{
4.
5.
....
6.
if (op_ret == -1) {
7.
if (op_errno != ENOENT) {
8.
gf_msg(this->name, GF_LOG_WARNING, op_errno,
P_MSG_LSTAT_FAILED,
9.
"lstat on %s failed", real_path ? real
_path : "null");
58
10.
}
11.
entry_ret = -1;
12. //这里意味着,loc 结构中只有 inode 和 gfid
13.
if (loc_is_nameless(loc)) {
14.
if (!op_errno)
15.
op_errno = ESTALE;
16.
loc_gfid(loc, gfid);
17. //这里是获取到绝对路径
18.
MAKE_HANDLE_ABSPATH_FD(gfid_path, this, gfid,
dfd);
19.
//
获取
stat
信息
20.
ret = sys_fstatat(dfd, gfid_path, &statbuf, 0)
;
21.
if (ret == 0 && ((statbuf.st_mode & S_IFMT) =
= S_IFDIR))
22.
goto parent;
23.
ret = sys_fstatat(dfd, gfid_path, &statbuf, A
T_SYMLINK_NOFOLLOW);
24.
if (ret == 0 && statbuf.st_nlink == 1) {
25.
gf_msg(this->name, GF_LOG_WARNING, op_err
no,
26.
P_MSG_HANDLE_DELETE,
27.
"Found stale gfid "
28.
"handle %s, removing it.",
29.
gfid_path);
30.
posix_handle_unset(this, gfid, NULL);
31.
}
32.
}
33.
goto parent;
34.
}
35.
...
36.
37.
}
首先这里要注意一下入参,这里入参的 xlator 是 glusterfs 中另外一个很重
要的功能模块化的概念,后面会提到。
在该函数中,主要四部分代码构成,前面还有一部分代码是处理 gfid 不存
59
在的情况的。在这段代码实现中,这里一开始入参中 loc_t *loc 是带有数据的,
然后如果这里走到了 loc_is_nameless 的判断中,这里的判断就是当 loc 中只
有 inode 和 gfid 信息的时候,需要进行获取一些其他的信息。另外这里还可以
看下函数 MAKE_HANDLE_ABSPATH_FD 的实现。
1.
#define MAKE_HANDLE_ABSPATH_FD(var, this, gfid, dfd)
\
2.
do {
\
3.
struct posix_private *__priv = this->private;
\
4.
int findex = gfid[0];
\
5.
int __len = POSIX_GFID_HASH2_LEN;
\
6.
var = alloca(__len);
\
7.
snprintf(var, __len, "%02x/%s", gfid[1], uuid_uto
a(gfid)); \
8.
dfd = __priv->arrdfd[findex];
\
9.
} while (0)
这段代码在 xlator/storage/posix/src/posix-handle.h 文件中,这里的
whil(0)就是只执行一次,然后使用宏定义封装函数,这样做的好处是避免编译
出错。这里的作用是根据 gfid 的规则,拼接获取文件的绝对路径的。获取到了
绝对路径,那么获取就可以获取 stat 信息了。
那么这里回到前面的函数,后面还有跳转到 parent 分支的,这里的思路其
实也是类似的。
总的来说,这个函数的作用,总结起来可以如下所示,就是通过 gfid 和目
录信息,获取到对应的 stat,然后最终获取到 inode_t 结构里面的其他信息。
剩余13页未读,继续阅读
东方捕
- 粉丝: 17
- 资源: 310
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0