io_uring: add ->show_fdinfo() for the io_uring file descriptor
It can be hard to know exactly what is registered with the ring. Especially for credentials, it'd be handy to be able to see which ones are registered, what personalities they have, and what the ID of each of them is. This adds support for showing information registered in the ring from the fdinfo of the io_uring fd. Here's an example from a test case that registers 4 files (two of them sparse), 4 buffers, and 2 personalities: pos: 0 flags: 02000002 mnt_id: 14 UserFiles: 4 0: file-no-1 1: file-no-2 2: <none> 3: <none> UserBufs: 4 0: 0x563817c46000/128 1: 0x563817c47000/256 2: 0x563817c48000/512 3: 0x563817c49000/1024 Personalities: 1 Uid: 0 0 0 0 Gid: 0 0 0 0 Groups: 0 CapEff: 0000003fffffffff 2 Uid: 0 0 0 0 Gid: 0 0 0 0 Groups: 0 CapEff: 0000003fffffffff Suggested-by: Jann Horn <jannh@google.com> Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
parent
39bed42de2
commit
87ce955b24
|
@ -6501,6 +6501,80 @@ out_fput:
|
||||||
return submitted ? submitted : ret;
|
return submitted ? submitted : ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int io_uring_show_cred(int id, void *p, void *data)
|
||||||
|
{
|
||||||
|
const struct cred *cred = p;
|
||||||
|
struct seq_file *m = data;
|
||||||
|
struct user_namespace *uns = seq_user_ns(m);
|
||||||
|
struct group_info *gi;
|
||||||
|
kernel_cap_t cap;
|
||||||
|
unsigned __capi;
|
||||||
|
int g;
|
||||||
|
|
||||||
|
seq_printf(m, "%5d\n", id);
|
||||||
|
seq_put_decimal_ull(m, "\tUid:\t", from_kuid_munged(uns, cred->uid));
|
||||||
|
seq_put_decimal_ull(m, "\t\t", from_kuid_munged(uns, cred->euid));
|
||||||
|
seq_put_decimal_ull(m, "\t\t", from_kuid_munged(uns, cred->suid));
|
||||||
|
seq_put_decimal_ull(m, "\t\t", from_kuid_munged(uns, cred->fsuid));
|
||||||
|
seq_put_decimal_ull(m, "\n\tGid:\t", from_kgid_munged(uns, cred->gid));
|
||||||
|
seq_put_decimal_ull(m, "\t\t", from_kgid_munged(uns, cred->egid));
|
||||||
|
seq_put_decimal_ull(m, "\t\t", from_kgid_munged(uns, cred->sgid));
|
||||||
|
seq_put_decimal_ull(m, "\t\t", from_kgid_munged(uns, cred->fsgid));
|
||||||
|
seq_puts(m, "\n\tGroups:\t");
|
||||||
|
gi = cred->group_info;
|
||||||
|
for (g = 0; g < gi->ngroups; g++) {
|
||||||
|
seq_put_decimal_ull(m, g ? " " : "",
|
||||||
|
from_kgid_munged(uns, gi->gid[g]));
|
||||||
|
}
|
||||||
|
seq_puts(m, "\n\tCapEff:\t");
|
||||||
|
cap = cred->cap_effective;
|
||||||
|
CAP_FOR_EACH_U32(__capi)
|
||||||
|
seq_put_hex_ll(m, NULL, cap.cap[CAP_LAST_U32 - __capi], 8);
|
||||||
|
seq_putc(m, '\n');
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void __io_uring_show_fdinfo(struct io_ring_ctx *ctx, struct seq_file *m)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
mutex_lock(&ctx->uring_lock);
|
||||||
|
seq_printf(m, "UserFiles:\t%u\n", ctx->nr_user_files);
|
||||||
|
for (i = 0; i < ctx->nr_user_files; i++) {
|
||||||
|
struct fixed_file_table *table;
|
||||||
|
struct file *f;
|
||||||
|
|
||||||
|
table = &ctx->file_data->table[i >> IORING_FILE_TABLE_SHIFT];
|
||||||
|
f = table->files[i & IORING_FILE_TABLE_MASK];
|
||||||
|
if (f)
|
||||||
|
seq_printf(m, "%5u: %s\n", i, file_dentry(f)->d_iname);
|
||||||
|
else
|
||||||
|
seq_printf(m, "%5u: <none>\n", i);
|
||||||
|
}
|
||||||
|
seq_printf(m, "UserBufs:\t%u\n", ctx->nr_user_bufs);
|
||||||
|
for (i = 0; i < ctx->nr_user_bufs; i++) {
|
||||||
|
struct io_mapped_ubuf *buf = &ctx->user_bufs[i];
|
||||||
|
|
||||||
|
seq_printf(m, "%5u: 0x%llx/%u\n", i, buf->ubuf,
|
||||||
|
(unsigned int) buf->len);
|
||||||
|
}
|
||||||
|
if (!idr_is_empty(&ctx->personality_idr)) {
|
||||||
|
seq_printf(m, "Personalities:\n");
|
||||||
|
idr_for_each(&ctx->personality_idr, io_uring_show_cred, m);
|
||||||
|
}
|
||||||
|
mutex_unlock(&ctx->uring_lock);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void io_uring_show_fdinfo(struct seq_file *m, struct file *f)
|
||||||
|
{
|
||||||
|
struct io_ring_ctx *ctx = f->private_data;
|
||||||
|
|
||||||
|
if (percpu_ref_tryget(&ctx->refs)) {
|
||||||
|
__io_uring_show_fdinfo(ctx, m);
|
||||||
|
percpu_ref_put(&ctx->refs);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static const struct file_operations io_uring_fops = {
|
static const struct file_operations io_uring_fops = {
|
||||||
.release = io_uring_release,
|
.release = io_uring_release,
|
||||||
.flush = io_uring_flush,
|
.flush = io_uring_flush,
|
||||||
|
@ -6511,6 +6585,7 @@ static const struct file_operations io_uring_fops = {
|
||||||
#endif
|
#endif
|
||||||
.poll = io_uring_poll,
|
.poll = io_uring_poll,
|
||||||
.fasync = io_uring_fasync,
|
.fasync = io_uring_fasync,
|
||||||
|
.show_fdinfo = io_uring_show_fdinfo,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int io_allocate_scq_urings(struct io_ring_ctx *ctx,
|
static int io_allocate_scq_urings(struct io_ring_ctx *ctx,
|
||||||
|
|
Loading…
Reference in New Issue