1

我有一个 FUSE 文件系统,我在其中编写了getxattrsetxattr这样的代码:

int mfs_setxattr(const char *path, const char *name, const char *value, size_t size, int flags)
{
  ... /* some translation processing of path to rpath */

  int ret = lsetxattr(rpath, name, value, size, flags);

  ... /* some logging works */

  if (ret == -1) {
    return -errno;
  }

  return 0;
}

int mfs_getxattr(const char *path, const char *name, char *value, size_t size)
{
  ... /* some translation processing of path to rpath */

  int ret = lgetxattr(rpath, name, value, size);

  ... /* some logging works */

  if (ret == -1) {
    return -errno;
  }

  return ret;
}

我已经对此进行了测试,除了功能之外它工作得很好:当我使用 setcap 为程序设置功能并运行它时,程序无法执行特权工作。尽管 getcap 返回了我之前设置的功能。

有人可以告诉我一种跟踪问题的方法或给我一些关于正在发生的事情的指示吗?

4

1 回答 1

-1

我认为一个好的起点是 init 函数。在那里你得到一个论点

struct fuse_conn_info *conn

该结构包含以下字段

  1. proto_major:FUSE 的主要版本
  2. proto_minor:FUSE 的次要版本
  3. async_read:如果此条目 > 0,则您的 FS 支持异步读取
  4. max_write:支持的最大写入量是多少。如果您输入的值小于 4K,它将直接将该值恢复为 4K
  5. max_readahead:最大预读值
  6. 能力:这是 FUSE 内核模块支持的能力 它被编码为位标志
  7. 想要:FUSE 客户端想要什么功能,再次进行位编码

现在我还没有尝试过这个,但我敢打赌“想要”字段是你需要修改的。您拥有的选项如下

  • FUSE_CAP_DONT_MASK:如果设置,umask 不会应用于创建操作的文件。网上的一些说法没有真正实现
  • FUSE_CAP_EXPORT_SUPPORT:表示您的客户端是否处理“。” 或“..”本身或 FUSE 需要执行陷阱并处理它
  • FUSE_CAP_ASYNC_READ:如果你基本上使用异步读取,默认启用
  • FUSE_CAP_BIG_WRITES:如果 FS 可以处理大于 4KB 的写入,则应设置
  • FUSE_CAP_POSIX_LOCKS:如果 FS 客户端支持通过lock系统调用从远程实体锁定,则应设置
  • FUSE_CAP_ATOMIC_O_TRUNC:如果 FS 支持 O_TRUNC 作为打开标志,则应设置此项

我不确定这有多大帮助,但这是一个开始。有人说,如果您实际上可以以某种方式禁用这些功能,您将获得巨大的性能提升。但我仍然没有找到如何做到这一点。

于 2012-11-06T18:28:23.710 回答