2012-10-25 194 views
1

我有一个FUSE文件系统中,我编写了getxattrsetxattr这样的:Linux的能力在FUSE文件系统

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

有一个保险丝邮件列表,我比SO运气更好。也值得尝试一下邮件列表。 –

+0

@ AndrewTomazos-Fathomling:我会试试,认为 – nsstl

+1

......然后回到这里告诉我们你学到了什么。 –

回答

-1

我觉得一个很好的起点是init函数。还有你作为一个

struct fuse_conn_info *conn

这个结构包含以下字段

  1. proto_major参数:FUSE的主要版本
  2. proto_minor:如果这样的:FUSE
  3. async_read的次要版本条目是> 0那么你的FS支持异步 读取
  4. max_write:什么是最大写支持d。如果你把一个值 是酒糟比4K将值直接恢复到4K
  5. max_readahead:最大预读值
  6. 能力:这是能力的FUSE内核模块支持 它编码为位标志
  7. 想:FUSE的客户想要什么样的能力,又位编码

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

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

我不确定这是多么有帮助,但这是一个开始。有人说,如果你真的可以禁用某些功能,你会获得很好的性能收益。 但我还没有找到如何做到这一点。

+1

认为你的回应,但我想要的不是我的fs程序的功能。我的保险丝fs必须复制底层目录中的确切行为,我的所有操作都成功地取消了ecxept的功能: - 如果在受监视的目录中有某些需要功能的程序,可以使用setcap设置它们并使用getcap 。 - 但是如果您执行该程序,它将不会获得这些功能并失败。 – nsstl