All of lore.kernel.org
 help / color / mirror / Atom feed
From: Mike Snitzer <snitzer@redhat.com>
To: Sergei Shtepa <sergei.shtepa@veeam.com>
Cc: axboe@kernel.dk, johannes.thumshirn@wdc.com, koct9i@gmail.com,
	ming.lei@redhat.com, hare@suse.de, josef@toxicpanda.com,
	steve@sk2.org, linux-block@vger.kernel.org,
	linux-kernel@vger.kernel.org, pavel.tide@veeam.com
Subject: Re: [PATCH 2/3] block: blk_interposer - sample
Date: Wed, 9 Dec 2020 09:36:06 -0500	[thread overview]
Message-ID: <20201209143606.GA494@redhat.com> (raw)
In-Reply-To: <1607518911-30692-3-git-send-email-sergei.shtepa@veeam.com>

On Wed, Dec 09 2020 at  8:01am -0500,
Sergei Shtepa <sergei.shtepa@veeam.com> wrote:

> This sample demonstrates how to use blk_interposer.
> It show how to properly connect the interposer module to kernel,
> and perform the simplest monitoring of the number of bio.
> 
> Signed-off-by: Sergei Shtepa <sergei.shtepa@veeam.com>
> ---
>  samples/blk_interposer/Makefile         |   2 +
>  samples/blk_interposer/blk-interposer.c | 276 ++++++++++++++++++++++++
>  2 files changed, 278 insertions(+)
>  create mode 100644 samples/blk_interposer/Makefile
>  create mode 100644 samples/blk_interposer/blk-interposer.c
> 
> diff --git a/samples/blk_interposer/Makefile b/samples/blk_interposer/Makefile
> new file mode 100644
> index 000000000000..b11aefde2b1c
> --- /dev/null
> +++ b/samples/blk_interposer/Makefile
> @@ -0,0 +1,2 @@
> +# SPDX-License-Identifier: GPL-2.0
> +obj-$(CONFIG_SAMPLE_BLK_INTERPOSER) += blk-interposer.o
> diff --git a/samples/blk_interposer/blk-interposer.c b/samples/blk_interposer/blk-interposer.c
> new file mode 100644
> index 000000000000..92b4c1fcf8f7
> --- /dev/null
> +++ b/samples/blk_interposer/blk-interposer.c
> @@ -0,0 +1,276 @@
> +// SPDX-License-Identifier: GPL-2.0
> +
> +/*
> + * Block layer interposer allow to interpose bio requests from kernel module.
> + * This allows you to monitor requests, modify requests, add new request,
> + * or even redirect requests to another devices.
> + *
> + * This sample demonstrates how to use blk_interposer.
> + * It show how to properly connect the interposer module to kernel,
> + * and perform the simplest monitoring of the number of bio.
> + */
> +
> +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
> +
> +#include <linux/module.h>
> +#include <linux/types.h>
> +#include <linux/errno.h>
> +#include <linux/blkdev.h>
> +#include <linux/genhd.h>
> +#include <linux/blk-mq.h>
> +
> +int device_major = 8;
> +int device_minor;
> +int fmode = FMODE_READ | FMODE_WRITE;
> +
> +/*
> + * Each interposer must have a common part in the form of the blk_interposer structure,
> + * as well as its own unique data.
> + */
> +struct my_interposer {
> +	/*
> +	 * Common part of block device interposer.
> +	 */
> +	struct blk_interposer interposer;
> +	/*
> +	 * Specific part for our interposer data.
> +	 */
> +	atomic_t counter;
> +};
> +
> +struct my_interposer my_ip;
> +
> +/**
> + * blk_interposer_attach - Attach interposer to disk
> + * @disk: target disk
> + * @interposer: block device interposer
> + */
> +static int blk_interposer_attach(struct gendisk *disk, struct blk_interposer *interposer)
> +{
> +	int ret = 0;
> +
> +	/*
> +	 * Stop disks queue processing.
> +	 */
> +	blk_mq_freeze_queue(disk->queue);
> +	blk_mq_quiesce_queue(disk->queue);
> +
> +	/*
> +	 * Check if the interposer is already busy.
> +	 * The interposer will only connect if it is not busy.
> +	 */
> +	if (blk_has_interposer(disk)) {
> +		pr_info("The interposer is already busy.\n");
> +		ret = -EBUSY;
> +		goto out;
> +	}
> +
> +	/*
> +	 * Attach the interposer.
> +	 */
> +	disk->interposer = interposer;
> +	/*
> +	 * And while the queue is stopped, we can do something specific for our module.
> +	 */
> +	pr_info("Block device interposer attached successfully.\n");
> +
> +out:
> +	/*
> +	 * Resume disks queue processing
> +	 */
> +	blk_mq_unquiesce_queue(disk->queue);
> +	blk_mq_unfreeze_queue(disk->queue);
> +
> +	return ret;
> +}
> +
> +/**
> + * blk_interposer_detach - Detach interposer from disk
> + * @disk: target disk
> + * @interposer: block device interposer
> + */
> +static int blk_interposer_detach(struct gendisk *disk, struct blk_interposer *interposer)
> +{
> +	int ret = 0;
> +
> +	if (WARN_ON(!disk))
> +		return -EINVAL;
> +
> +	/*
> +	 * Stop disks queue processing.
> +	 */
> +	blk_mq_freeze_queue(disk->queue);
> +	blk_mq_quiesce_queue(disk->queue);
> +
> +	/*
> +	 * Check if the interposer is still available.
> +	 */
> +	if (!disk->interposer) {
> +		pr_info("The interposer is not available.\n");
> +		return -ENOENT;
> +		goto out;
> +	}
> +	/*
> +	 * Check if it is really our interposer.
> +	 */
> +	if (disk->interposer->ip_submit_bio != interposer->ip_submit_bio) {
> +		pr_info("The interposer found is not ours.\n");
> +		return -EPERM;
> +		goto out;
> +	}
> +
> +	/*
> +	 * Detach interposer.
> +	 */
> +	disk->interposer = NULL;
> +	/*
> +	 * And while the queue is stopped, we can do something specific for our module.
> +	 */
> +	pr_info("Block device interposer detached successfully.\n");
> +
> +out:
> +	/*
> +	 * Resume disks queue processing.
> +	 */
> +	blk_mq_unquiesce_queue(disk->queue);
> +	blk_mq_unfreeze_queue(disk->queue);
> +
> +	return ret;
> +}

This attach and detach code needs to be elevated out of samples so that
any future consumer of blk_interposer doesn't reinvent it.  It is far
too fundamental.

The way you've proposed this be merged is very much unacceptable.

Nacked-by: Mike Snitzer <snitzer@redhat.com>


  reply	other threads:[~2020-12-09 14:38 UTC|newest]

Thread overview: 28+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-12-09 13:01 [PATCH 0/3] block: blk_interposer - Block Layer Interposer Sergei Shtepa
2020-12-09 13:01 ` [PATCH 1/3] " Sergei Shtepa
2020-12-09 13:01 ` [PATCH 2/3] block: blk_interposer - sample Sergei Shtepa
2020-12-09 14:36   ` Mike Snitzer [this message]
2020-12-10 15:54     ` Sergei Shtepa
2020-12-10 15:58       ` Mike Snitzer
2020-12-09 13:01 ` [PATCH 3/3] block: blk_interposer - sample config Sergei Shtepa
2020-12-09 13:51 ` [PATCH 0/3] block: blk_interposer - Block Layer Interposer Mike Snitzer
2020-12-10 14:58   ` Sergei Shtepa
2020-12-10 16:32     ` Mike Snitzer
2020-12-11 16:30       ` Mike Snitzer
2020-12-11 16:30         ` [dm-devel] " Mike Snitzer
2020-12-11 16:33         ` Jens Axboe
2020-12-11 16:33           ` [dm-devel] " Jens Axboe
2020-12-11 16:56           ` Hannes Reinecke
2020-12-11 16:56             ` [dm-devel] " Hannes Reinecke
2020-12-11 17:04             ` Jens Axboe
2020-12-11 17:04               ` [dm-devel] " Jens Axboe
2020-12-11 18:03               ` Hannes Reinecke
2020-12-11 18:03                 ` [dm-devel] " Hannes Reinecke
2020-12-12 18:14                 ` Jens Axboe
2020-12-12 18:14                   ` [dm-devel] " Jens Axboe
2020-12-15  6:51             ` Bob Liu
2020-12-15  6:51               ` [dm-devel] " Bob Liu
2020-12-15  7:41               ` Hannes Reinecke
2020-12-15  7:41                 ` [dm-devel] " Hannes Reinecke
2020-12-15 15:57               ` Sergei Shtepa
2020-12-15 15:57                 ` [dm-devel] " Sergei Shtepa

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20201209143606.GA494@redhat.com \
    --to=snitzer@redhat.com \
    --cc=axboe@kernel.dk \
    --cc=hare@suse.de \
    --cc=johannes.thumshirn@wdc.com \
    --cc=josef@toxicpanda.com \
    --cc=koct9i@gmail.com \
    --cc=linux-block@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=ming.lei@redhat.com \
    --cc=pavel.tide@veeam.com \
    --cc=sergei.shtepa@veeam.com \
    --cc=steve@sk2.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.