Eu não acho que seja possível. Aqui está o porquê. Tomei a abordagem ingênua, que era adicionar o pid do processo que abre /dev/fuse
aos metadados que o fusível cria no momento da montagem, struct fuse_conn
. Em seguida, usei essa informação para exibir um campo pid=
no comando mount. O patch é muito simples:
diff --git a/fs/fuse/fuse_i.h b/fs/fuse/fuse_i.h
index 7354dc1..32b05ca 100644
--- a/fs/fuse/fuse_i.h
+++ b/fs/fuse/fuse_i.h
@@ -402,6 +402,9 @@ struct fuse_conn {
/** The group id for this mount */
kgid_t group_id;
+ /** The pid mounting process */
+ pid_t pid;
+
/** The fuse mount flags for this mount */
unsigned flags;
diff --git a/fs/fuse/inode.c b/fs/fuse/inode.c
index e8799c1..23a27be 100644
--- a/fs/fuse/inode.c
+++ b/fs/fuse/inode.c
@@ -554,6 +554,7 @@ static int fuse_show_options(struct seq_file *m, struct dentry *root)
struct super_block *sb = root->d_sb;
struct fuse_conn *fc = get_fuse_conn_super(sb);
+ seq_printf(m, ",pid=%u", fc->pid);
seq_printf(m, ",user_id=%u", from_kuid_munged(&init_user_ns, fc->user_id));
seq_printf(m, ",group_id=%u", from_kgid_munged(&init_user_ns, fc->group_id));
if (fc->flags & FUSE_DEFAULT_PERMISSIONS)
@@ -1042,6 +1043,7 @@ static int fuse_fill_super(struct super_block *sb, void *data, int silent)
fc->release = fuse_free_conn;
fc->flags = d.flags;
+ fc->pid = current->pid;
fc->user_id = d.user_id;
fc->group_id = d.group_id;
fc->max_read = max_t(unsigned, 4096, d.max_read);
def@fractal [6:37] ~/p/linux -- master
Eu inicializei o kernel, montei sshfs, montei:
[email protected]:/tmp on /root/tmp type fuse.sshfs (rw,nosuid,nodev,relatime,pid=1549,user_id=0,group_id=0)
Sucesso? Infelizmente não:
root 1552 0.0 0.0 45152 332 ? Ssl 13:39 0:00 sshfs [email protected]:/tmp tmp
Então percebi: o processo sshfs restante é filho daquele que criou a montagem. Herdou do fd. Como o fusível é implementado, poderíamos ter uma infinidade de processos herdados do fd. Poderíamos ter o fd sendo passado em soquetes UNIX, completamente fora da árvore de processos original.
Podemos obter as informações 'quem possui esta porta TCP', porque os sockets têm esses metadados e simplesmente parsing / proc nos informa essa informação. Infelizmente, o fusível fd é um fd normal em /dev/fuse
. A menos que o fd de alguma forma se torne especial, não vejo como isso pode ser implementado.