1

私は、次のようにコーディングgetxattrした FUSE ファイルシステムを持っています。setxattr

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 関数だと思います。そこで、引数としてaを取得します

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. want: FUSE クライアントが必要とする機能 (これもビット エンコード)

これはまだ試していませんが、「want」フィールドを変更する必要があることは間違いありません。あなたが持っているオプションは次のとおりです

  • 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 クライアントがlockシステム コールによるリモート エンティティからのロックをサポートする場合に設定する必要があります。
  • FUSE_CAP_ATOMIC_O_TRUNC: FS が O_TRUNC をオープン フラグとしてサポートしている場合、これを設定する必要があります。

これがどれほど役立つかはわかりませんが、それは始まりです。実際に何らかの方法で機能を無効にできれば、パフォーマンスが大幅に向上すると人々が言うスレッドがいくつかあります。しかし、私はまだそれを行う方法を見つけていません。

于 2012-11-06T18:28:23.710 に答える