FUSE文件系统的Linux功能

时间:2012-10-25 21:47:29

标签: linux fuse linux-capabilities xattr

我有一个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返回了我之前设置的功能。

有人可以告诉我一种方法来跟踪问题或者给我一些关于发生了什么的指示吗?

1 个答案:

答案 0 :(得分:-1)

我认为一个好的起点是init函数。你得到一个参数

struct fuse_conn_info *conn

此结构包含以下字段

  1. proto_major:FUSE的主要版本
  2. proto_minor:FUSE的次要版本
  3. async_read:如果此条目是> 0然后你的FS支持异步 读取
  4. max_write:支持的max-write是什么。如果你输入一个值 它是lees而不是4K,它将直接将值恢复为4K
  5. max_readahead:max readahead value
  6. 能力:这是FUSE内核模块支持的功能 它被编码为位标志
  7. 想要:FUSE客户端想要什么功能,再次进行位编码
  8. 现在我还没有对此进行过实验,但我打赌“想要”字段是您需要修改的。您拥有的选项如下

    • FUSE_CAP_DONT_MASK:如果设置,则umask不会应用于create ops上的文件。一些未真正实施的净索赔
    • FUSE_CAP_EXPORT_SUPPORT:如果您的客户端处理“。”或“..”本身或FUSE需要执行陷阱并处理它
    • FUSE_CAP_ASYNC_READ:如果您基本上使用异步读取,则默认启用
    • FUSE_CAP_BIG_WRITES:如果FS可以处理大于4KB的写入,则应设置
    • FUSE_CAP_POSIX_LOCKS:如果FS客户端支持通过锁定系统调用从远程实体锁定,则应设置
    • FUSE_CAP_ATOMIC_O_TRUNC:如果FS支持O_TRUNC作为开放标志,则应设置

    我不确定这有多大帮助,但这是一个开始。人们会说有一些线程,如果你实际上能够以某种方式禁用这些功能,那么你将获得巨大的性能提升。 但我还是没有找到如何做到这一点。