LWN:quotactl_path() 变成了 quotactl_fd()

关注了就能看到更多这么棒的文章哦~

quotactl_path() becomes quotactl_fd()

By Jonathan Corbet
June 14, 2021
DeepL assisted translation
https://lwn.net/Articles/859679/

quotactl() 这个系统调用是用来操作文件系统上的磁盘配额(quota)的;它可以用来打开或关闭配额限制、改变配额、检索当前的使用信息等等。5.13 合并窗口带来了该系统调用的一个新变体,后来却由于 API 问题而被禁用。目前它的替代品正在开发中:

quotactl()的原型如下:

int quotactl(int cmd, const char *special, int id, caddr_t addr);

配额操作是一个面向文件系统的操作,但是 quotactl() 还要求调用者提供放置这个目标文件系统的块设备的名字(也就是 special 这个参数)。这可能需要用户(他通常会根据 mount 信息来确认)或用户空间工具进行查询,来找出哪个 block device 是放置目标文件系统的的设备。对于底层并不存放在块设备之上的文件系统来说,根本无法使用 quotactl()。除此之外,UBIFS 文件系统是使用持久性内存(persistent memory)进行存储的,也受这个问题的影响。

于是新增了这个系统调用来解决这些问题:

int quotactl_path(unsigned int cmd, const char *mountpoint, qid_t id,
          void *addr);

quotactl_path() 不需要设备的名称了,而是需要包含了这个文件系统 mount 位置的路径。

在这个新的系统调用被合入 mainline 之后不久(在 5.13 合并窗口期间),有一位 LWN 读者指出,quotactl_path() 没有遵循当前最新的系统调用最佳实践。具体来说,它缺少了一个以备未来扩展的 "flags" 参数,而且没有像 openat2() 这类系统调用中的目录文件描述符(directory file-descriptor)参数。作为对这些批评的回应,新的系统调用在 5.13-rc3 版本中被禁用了,希望能将这些问题解决干净。

6 月 2 日,Jan Kara 发布了一个替代 quotactl_path()的方案。这个新的调用不是简单地添加新的参数,而是彻底取消了路径名:

int quotactl_fd(unsigned int fd, unsigned int cmd, qid_t id, void *addr);

在 quotactl_fd() 函数中,调用者需要提供一个通过 open 得到的文件描述符,用来指明所要操作的目标文件系统。这样做的好处是可以把处理目录的文件描述符、解析标志等的全部复杂操作都推迟到 openat2(),而不需要在这里重复实现。对于涉及多次 quotactl_fd() 调用的情况下,重用一个只需要打开一次就能得到的文件描述符,应该效率会更好。

注意,这里仍然没有 "flags" 参数。在这种情况下这不是一个问题。系统调用总是可以通过添加新的 cmd 来扩展。简而言之,正如 Kara 在信中指出的那样,新的系统调用看起来很像 ioctl(),也拥有与该调用类似的灵活性。

从一个角度来看,这一事件似乎是展示的是一个失败的过程,也就是有这些问题的一个系统调用是如何进入 mainline 的?有时候,代码没有经过充分的 review 就匆匆进入内核,但是这个 patch set 在被合并之前发布过了三次(分别在 1 月、2月和 3 月)。开发人员显然看过了这些 patch,并做了一些修改,但没有人发现这个 API 的问题。

但这一事件也可以被看作是一个例子,说明这个 review 过程完全按照期望在进行。合并窗口结束之后,直到 5.13 版本发布之前,这段时间都是用来捕捉剩余问题的,而这个问题也如预期一样被挑了出来。该系统调用也就立即被禁用了,从而确保它不会用这种形式发布出去(然后就只能永远维护这么个接口)。而现在,更好的替代方案已经被开发了出来。

这个替代版本已经经过了一些相关开发者的审查(并得到了 approve),其中包括 Sascha Hauer,这是原来的 quotactl_path() patch 的作者。截至 5.13-rc6 的时候,它还没有被推入 mainline 内核。Kara 还没有说他是否计划在 5.13 发布之前将这项工作纳入 5.13。如果要赶在 5.13 里的话,时间已经不多了。当然也可以在 5.14 版本的合并窗口中再合入进去,这样就可以经过另一个审查周期,以确保真的没有其他遗留问题了。考虑到这个 API 已经经过一次返工,而 5.13 版本还有不到两周就要发布了,很可能应该选择等待下一版,这是更谨慎的做法。

全文完
LWN 文章遵循 CC BY-SA 4.0 许可协议。

欢迎分享、转载及基于现有协议再创作~

长按下面二维码关注,关注 LWN 深度文章以及开源社区的各种新近言论~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值