【ganesha】函数ceph_fsal_open2解析
函数ceph_fsal_open2解析
定义说明:
enum fsal_create_mode {
FSAL_NO_CREATE = 0,
FSAL_UNCHECKED = 1,
FSAL_GUARDED = 2,
FSAL_EXCLUSIVE = 3,
FSAL_EXCLUSIVE_41 = 4,
FSAL_EXCLUSIVE_9P,
};
表格说明:
模式 | 说明 |
FSAL_NO_CREATE | 不应创建新对象,仅尝试打开已存在文件。 |
FSAL_UNCHECKED | 忽略目标是否存在,直接尝试创建。NFSv3 中的默认行为。 |
FSAL_GUARDED | 若目标已存在则返回错误,确保不会覆盖已有文件 |
FSAL_EXCLUSIVE | 用于 NFSv3 中的 EXCLUSIVE 模式,要求创建时带有 verifier(校验值)以避免重放攻击 |
区分不同:
模式 | 文件不存在时行为 | 文件存在时行为 |
---|---|---|
FSAL_UNCHECKED |
创建 | 打开并可能设置属性 |
FSAL_GUARDED |
创建 | 失败(不能存在) |
FSAL_EXCLUSIVE |
创建(带 verifier) | 失败 |
FSAL_EXCLUSIVE_41 |
创建(带属性+verifier) | 失败 |
FSAL_NO_CREATE |
失败(不创建) | 打开 |
1. FSAL_NO_CREATE使用场景:比如在 nfs4_op_open() 中,判断客户端请求的 create 类型为 OPEN4_NOCREATE(即只打开,不创建),那么就会这样调用:
fsal_open(..., FSAL_NO_CREATE, ...)
表示:只允许打开,不允许新建。FSAL_NO_CREATE 是一个安全保护用的 create_mode 值,确保操作不会误触发对象创建。如果你在调试 FSAL 插件或处理 NFSv4 的 OPEN,看到这个模式就代表请求是仅打开,不创建”。
2.
来源背景:NFSv4.1 的 OPEN 语义
在 NFSv4 协议中,OPEN 有一个 open_claim_type 字段,可以表示不同的声明类型,比如:
- CLAIM_NULL
- CLAIM_PREVIOUS
- CLAIM_DELEGATE_CUR
当使用 CLAIM_NULL 并且 OPEN4args.createmode == EXCLUSIVE4_1 时,客户端会提交一个 create_verf 和属性集合。这个语义在 Ganesha 中会被翻译成 FSAL_EXCLUSIVE_41。
模式 | 校验 Verifier | 设置属性 | 语义来自 |
---|---|---|---|
FSAL_EXCLUSIVE |
✅ 是 | ❌ 否 | NFSv3 |
FSAL_EXCLUSIVE_41 |
✅ 是 | ✅ 是 | NFSv4.1 |