On Wed, Aug 12, 2020 at 06:33 PM CEST, Leah Rumancik wrote: > Introducing a new program type BPF_PROG_TYPE_IO_FILTER and a new > attach type BPF_BIO_SUBMIT. > > This program type is intended to help filter and monitor IO requests. > > Co-developed-by: Saranya Muruganandam <saranyamohan@xxxxxxxxxx> > Signed-off-by: Saranya Muruganandam <saranyamohan@xxxxxxxxxx> > Signed-off-by: Kjetil Ørbekk <orbekk@xxxxxxxxxx> > Signed-off-by: Harshad Shirwadkar <harshads@xxxxxxxxxx> > Signed-off-by: Leah Rumancik <leah.rumancik@xxxxxxxxx> > --- [...] > diff --git a/block/blk-bpf-io-filter.c b/block/blk-bpf-io-filter.c > new file mode 100644 > index 000000000000..453d6b156bd2 > --- /dev/null > +++ b/block/blk-bpf-io-filter.c [...] > +int io_filter_prog_attach(const union bpf_attr *attr, struct bpf_prog *prog) > +{ > + struct gendisk *disk; > + struct fd f; > + struct bpf_prog_array *old_array; > + struct bpf_prog_array *new_array; > + int ret; > + > + if (attr->attach_flags) > + return -EINVAL; > + > + f = fdget(attr->target_fd); ^^^^^ Missing corresponding fdput? As per Martin's suggestion, with bpf_link this will become the link_create callback, but the comment still stands. > + if (!f.file) > + return -EBADF; > + > + disk = I_BDEV(f.file->f_mapping->host)->bd_disk; > + if (disk == NULL) > + return -ENXIO; > + > + ret = mutex_lock_interruptible(&disk->io_filter_lock); > + if (ret) > + return ret; > + > + old_array = io_filter_rcu_dereference_progs(disk); > + if (old_array && bpf_prog_array_length(old_array) >= BPF_MAX_PROGS) { > + ret = -E2BIG; > + goto unlock; > + } > + > + ret = bpf_prog_array_copy(old_array, NULL, prog, &new_array); > + if (ret < 0) > + goto unlock; > + > + rcu_assign_pointer(disk->progs, new_array); > + bpf_prog_array_free(old_array); > + > +unlock: > + mutex_unlock(&disk->io_filter_lock); > + return ret; > +} [...]