All of lore.kernel.org
 help / color / mirror / Atom feed
From: NeilBrown <neil@brown.name>
To: Christoph Hellwig <hch@lst.de>, linux-kernel@vger.kernel.org
Cc: "H. Peter Anvin" <hpa@zytor.com>, Song Liu <song@kernel.org>,
	Al Viro <viro@zeniv.linux.org.uk>,
	Linus Torvalds <torvalds@linux-foundation.org>,
	linux-raid@vger.kernel.org, linux-fsdevel@vger.kernel.org
Subject: Re: [PATCH 09/23] md: rewrite md_setup_drive to avoid ioctls
Date: Thu, 16 Jul 2020 09:50:49 +1000	[thread overview]
Message-ID: <87365sxrqe.fsf@notabene.neil.brown.name> (raw)
In-Reply-To: <20200714190427.4332-10-hch@lst.de>

[-- Attachment #1: Type: text/plain, Size: 10851 bytes --]

On Tue, Jul 14 2020, Christoph Hellwig wrote:

> md_setup_drive knows it works with md devices, so it is rather pointless
> to open a file descriptor and issue ioctls.  Just call directly into the
> relevant low-level md routines after getting a handle to the device using
> blkdev_get_by_dev instead.
>
> Signed-off-by: Christoph Hellwig <hch@lst.de>
> Acked-by: Song Liu <song@kernel.org>
> ---
>  drivers/md/md-autodetect.c | 127 ++++++++++++++++---------------------
>  drivers/md/md.c            |  20 +++---
>  drivers/md/md.h            |   6 ++
>  3 files changed, 71 insertions(+), 82 deletions(-)
>
> diff --git a/drivers/md/md-autodetect.c b/drivers/md/md-autodetect.c
> index a43a8f1580584c..5b24b5616d3acc 100644
> --- a/drivers/md/md-autodetect.c
> +++ b/drivers/md/md-autodetect.c
> @@ -2,7 +2,6 @@
>  #include <linux/kernel.h>
>  #include <linux/blkdev.h>
>  #include <linux/init.h>
> -#include <linux/syscalls.h>
>  #include <linux/mount.h>
>  #include <linux/major.h>
>  #include <linux/delay.h>
> @@ -120,37 +119,29 @@ static int __init md_setup(char *str)
>  	return 1;
>  }
>  
> -static inline int create_dev(char *name, dev_t dev)
> -{
> -	ksys_unlink(name);
> -	return ksys_mknod(name, S_IFBLK|0600, new_encode_dev(dev));
> -}
> -
>  static void __init md_setup_drive(struct md_setup_args *args)
>  {
> -	int minor, i, partitioned;
> -	dev_t dev;
> -	dev_t devices[MD_SB_DISKS+1];
> -	int fd;
> -	int err = 0;
> -	char *devname;
> -	mdu_disk_info_t dinfo;
> +	char *devname = args->device_names;
> +	dev_t devices[MD_SB_DISKS + 1], mdev;
> +	struct mdu_array_info_s ainfo = { };
> +	struct block_device *bdev;
> +	struct mddev *mddev;
> +	int err = 0, i;
>  	char name[16];
>  
> -	minor = args->minor;
> -	partitioned = args->partitioned;
> -	devname = args->device_names;
> +	if (args->partitioned) {
> +		mdev = MKDEV(mdp_major, args->minor << MdpMinorShift);
> +		sprintf(name, "md_d%d", args->minor);
> +	} else {
> +		mdev = MKDEV(MD_MAJOR, args->minor);
> +		sprintf(name, "md%d", args->minor);
> +	}
>  
> -	sprintf(name, "/dev/md%s%d", partitioned?"_d":"", minor);
> -	if (partitioned)
> -		dev = MKDEV(mdp_major, minor << MdpMinorShift);
> -	else
> -		dev = MKDEV(MD_MAJOR, minor);
> -	create_dev(name, dev);
>  	for (i = 0; i < MD_SB_DISKS && devname != NULL; i++) {
>  		struct kstat stat;
>  		char *p;
>  		char comp_name[64];
> +		dev_t dev;
>  
>  		p = strchr(devname, ',');
>  		if (p)
> @@ -163,7 +154,7 @@ static void __init md_setup_drive(struct md_setup_args *args)
>  		if (vfs_stat(comp_name, &stat) == 0 && S_ISBLK(stat.mode))
>  			dev = new_decode_dev(stat.rdev);
>  		if (!dev) {
> -			printk(KERN_WARNING "md: Unknown device name: %s\n", devname);
> +			pr_warn("md: Unknown device name: %s\n", devname);
>  			break;
>  		}
>  
> @@ -175,68 +166,64 @@ static void __init md_setup_drive(struct md_setup_args *args)
>  	if (!i)
>  		return;
>  
> -	printk(KERN_INFO "md: Loading md%s%d: %s\n",
> -		partitioned ? "_d" : "", minor,
> -		args->device_names);
> +	pr_info("md: Loading %s: %s\n", name, args->device_names);
>  
> -	fd = ksys_open(name, 0, 0);
> -	if (fd < 0) {
> -		printk(KERN_ERR "md: open failed - cannot start "
> -				"array %s\n", name);
> +	bdev = blkdev_get_by_dev(mdev, FMODE_READ, NULL);
> +	if (IS_ERR(bdev)) {
> +		pr_err("md: open failed - cannot start array %s\n", name);
>  		return;
>  	}
> -	if (ksys_ioctl(fd, SET_ARRAY_INFO, 0) == -EBUSY) {
> -		printk(KERN_WARNING
> -		       "md: Ignoring md=%d, already autodetected. (Use raid=noautodetect)\n",
> -		       minor);
> -		ksys_close(fd);
> -		return;

I'd be more comfortable if you added something like
	if (WARN(bdev->bd_disk->fops != md_fops,
                 "Opening block device %x resulted in non-md device\"))
                return;
here.  However even without that

Reviewed-by: NeilBrown <neilb@suse.de>

Thanks,
NeilBrown


> +	mddev = bdev->bd_disk->private_data;
> +
> +	err = mddev_lock(mddev);
> +	if (err) {
> +		pr_err("md: failed to lock array %s\n", name);
> +		goto out_blkdev_put;
> +	}
> +
> +	if (!list_empty(&mddev->disks) || mddev->raid_disks) {
> +		pr_warn("md: Ignoring %s, already autodetected. (Use raid=noautodetect)\n",
> +		       name);
> +		goto out_unlock;
>  	}
>  
>  	if (args->level != LEVEL_NONE) {
>  		/* non-persistent */
> -		mdu_array_info_t ainfo;
>  		ainfo.level = args->level;
> -		ainfo.size = 0;
> -		ainfo.nr_disks =0;
> -		ainfo.raid_disks =0;
> -		while (devices[ainfo.raid_disks])
> -			ainfo.raid_disks++;
> -		ainfo.md_minor =minor;
> +		ainfo.md_minor = args->minor;
>  		ainfo.not_persistent = 1;
> -
>  		ainfo.state = (1 << MD_SB_CLEAN);
> -		ainfo.layout = 0;
>  		ainfo.chunk_size = args->chunk;
> -		err = ksys_ioctl(fd, SET_ARRAY_INFO, (long)&ainfo);
> -		for (i = 0; !err && i <= MD_SB_DISKS; i++) {
> -			dev = devices[i];
> -			if (!dev)
> -				break;
> +		while (devices[ainfo.raid_disks])
> +			ainfo.raid_disks++;
> +	}
> +
> +	err = md_set_array_info(mddev, &ainfo);
> +
> +	for (i = 0; i <= MD_SB_DISKS && devices[i]; i++) {
> +		struct mdu_disk_info_s dinfo = {
> +			.major	= MAJOR(devices[i]),
> +			.minor	= MINOR(devices[i]),
> +		};
> +
> +		if (args->level != LEVEL_NONE) {
>  			dinfo.number = i;
>  			dinfo.raid_disk = i;
> -			dinfo.state = (1<<MD_DISK_ACTIVE)|(1<<MD_DISK_SYNC);
> -			dinfo.major = MAJOR(dev);
> -			dinfo.minor = MINOR(dev);
> -			err = ksys_ioctl(fd, ADD_NEW_DISK,
> -					 (long)&dinfo);
> -		}
> -	} else {
> -		/* persistent */
> -		for (i = 0; i <= MD_SB_DISKS; i++) {
> -			dev = devices[i];
> -			if (!dev)
> -				break;
> -			dinfo.major = MAJOR(dev);
> -			dinfo.minor = MINOR(dev);
> -			ksys_ioctl(fd, ADD_NEW_DISK, (long)&dinfo);
> +			dinfo.state =
> +				(1 << MD_DISK_ACTIVE) | (1 << MD_DISK_SYNC);
>  		}
> +
> +		md_add_new_disk(mddev, &dinfo);
>  	}
> +
>  	if (!err)
> -		err = ksys_ioctl(fd, RUN_ARRAY, 0);
> +		err = do_md_run(mddev);
>  	if (err)
> -		printk(KERN_WARNING "md: starting md%d failed\n", minor);
> -	ksys_close(fd);
> +		pr_warn("md: starting %s failed\n", name);
> +out_unlock:
> +	mddev_unlock(mddev);
> +out_blkdev_put:
> +	blkdev_put(bdev, FMODE_READ);
>  }
>  
>  static int __init raid_setup(char *str)
> @@ -286,8 +273,6 @@ void __init md_run_setup(void)
>  {
>  	int ent;
>  
> -	create_dev("/dev/md0", MKDEV(MD_MAJOR, 0));
> -
>  	if (raid_noautodetect)
>  		printk(KERN_INFO "md: Skipping autodetection of RAID arrays. (raid=autodetect will force)\n");
>  	else
> diff --git a/drivers/md/md.c b/drivers/md/md.c
> index 6e9a48da474848..9960cfeb59a50c 100644
> --- a/drivers/md/md.c
> +++ b/drivers/md/md.c
> @@ -4368,7 +4368,6 @@ array_state_show(struct mddev *mddev, char *page)
>  
>  static int do_md_stop(struct mddev *mddev, int ro, struct block_device *bdev);
>  static int md_set_readonly(struct mddev *mddev, struct block_device *bdev);
> -static int do_md_run(struct mddev *mddev);
>  static int restart_array(struct mddev *mddev);
>  
>  static ssize_t
> @@ -6015,7 +6014,7 @@ int md_run(struct mddev *mddev)
>  }
>  EXPORT_SYMBOL_GPL(md_run);
>  
> -static int do_md_run(struct mddev *mddev)
> +int do_md_run(struct mddev *mddev)
>  {
>  	int err;
>  
> @@ -6651,7 +6650,7 @@ static int get_disk_info(struct mddev *mddev, void __user * arg)
>  	return 0;
>  }
>  
> -static int add_new_disk(struct mddev *mddev, mdu_disk_info_t *info)
> +int md_add_new_disk(struct mddev *mddev, struct mdu_disk_info_s *info)
>  {
>  	char b[BDEVNAME_SIZE], b2[BDEVNAME_SIZE];
>  	struct md_rdev *rdev;
> @@ -6697,7 +6696,7 @@ static int add_new_disk(struct mddev *mddev, mdu_disk_info_t *info)
>  	}
>  
>  	/*
> -	 * add_new_disk can be used once the array is assembled
> +	 * md_add_new_disk can be used once the array is assembled
>  	 * to add "hot spares".  They must already have a superblock
>  	 * written
>  	 */
> @@ -6810,7 +6809,7 @@ static int add_new_disk(struct mddev *mddev, mdu_disk_info_t *info)
>  		return err;
>  	}
>  
> -	/* otherwise, add_new_disk is only allowed
> +	/* otherwise, md_add_new_disk is only allowed
>  	 * for major_version==0 superblocks
>  	 */
>  	if (mddev->major_version != 0) {
> @@ -7055,7 +7054,7 @@ static int set_bitmap_file(struct mddev *mddev, int fd)
>  }
>  
>  /*
> - * set_array_info is used two different ways
> + * md_set_array_info is used two different ways
>   * The original usage is when creating a new array.
>   * In this usage, raid_disks is > 0 and it together with
>   *  level, size, not_persistent,layout,chunksize determine the
> @@ -7067,9 +7066,8 @@ static int set_bitmap_file(struct mddev *mddev, int fd)
>   *  The minor and patch _version numbers are also kept incase the
>   *  super_block handler wishes to interpret them.
>   */
> -static int set_array_info(struct mddev *mddev, mdu_array_info_t *info)
> +int md_set_array_info(struct mddev *mddev, struct mdu_array_info_s *info)
>  {
> -
>  	if (info->raid_disks == 0) {
>  		/* just setting version number for superblock loading */
>  		if (info->major_version < 0 ||
> @@ -7560,7 +7558,7 @@ static int md_ioctl(struct block_device *bdev, fmode_t mode,
>  			err = -EBUSY;
>  			goto unlock;
>  		}
> -		err = set_array_info(mddev, &info);
> +		err = md_set_array_info(mddev, &info);
>  		if (err) {
>  			pr_warn("md: couldn't set array info. %d\n", err);
>  			goto unlock;
> @@ -7614,7 +7612,7 @@ static int md_ioctl(struct block_device *bdev, fmode_t mode,
>  				/* Need to clear read-only for this */
>  				break;
>  			else
> -				err = add_new_disk(mddev, &info);
> +				err = md_add_new_disk(mddev, &info);
>  			goto unlock;
>  		}
>  		break;
> @@ -7682,7 +7680,7 @@ static int md_ioctl(struct block_device *bdev, fmode_t mode,
>  		if (copy_from_user(&info, argp, sizeof(info)))
>  			err = -EFAULT;
>  		else
> -			err = add_new_disk(mddev, &info);
> +			err = md_add_new_disk(mddev, &info);
>  		goto unlock;
>  	}
>  
> diff --git a/drivers/md/md.h b/drivers/md/md.h
> index 6f8fff77ce10a5..7ee81aa2eac862 100644
> --- a/drivers/md/md.h
> +++ b/drivers/md/md.h
> @@ -801,7 +801,13 @@ static inline void mddev_check_write_zeroes(struct mddev *mddev, struct bio *bio
>  		mddev->queue->limits.max_write_zeroes_sectors = 0;
>  }
>  
> +struct mdu_array_info_s;
> +struct mdu_disk_info_s;
> +
>  extern int mdp_major;
>  void md_autostart_arrays(int part);
> +int md_set_array_info(struct mddev *mddev, struct mdu_array_info_s *info);
> +int md_add_new_disk(struct mddev *mddev, struct mdu_disk_info_s *info);
> +int do_md_run(struct mddev *mddev);
>  
>  #endif /* _MD_MD_H */
> -- 
> 2.27.0

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 832 bytes --]

  reply	other threads:[~2020-07-15 23:50 UTC|newest]

Thread overview: 55+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-07-14 19:04 decruft the early init / initrd / initramfs code v2 Christoph Hellwig
2020-07-14 19:04 ` [PATCH 01/23] fs: add a vfs_fchown helper Christoph Hellwig
2020-07-14 19:04 ` [PATCH 02/23] fs: add a vfs_fchmod helper Christoph Hellwig
2020-07-14 19:04 ` [PATCH 03/23] init: remove the bstat helper Christoph Hellwig
2020-07-15 23:14   ` NeilBrown
2020-07-14 19:04 ` [PATCH 04/23] md: move the early init autodetect code to drivers/md/ Christoph Hellwig
2020-07-14 19:04 ` [PATCH 05/23] md: replace the RAID_AUTORUN ioctl with a direct function call Christoph Hellwig
2020-07-15 23:33   ` NeilBrown
2020-07-14 19:04 ` [PATCH 06/23] md: remove the autoscan partition re-read Christoph Hellwig
2020-07-15 23:34   ` NeilBrown
2020-07-14 19:04 ` [PATCH 07/23] md: remove the kernel version of md_u.h Christoph Hellwig
2020-07-14 19:04 ` [PATCH 08/23] md: simplify md_setup_drive Christoph Hellwig
2020-07-15 23:37   ` NeilBrown
2020-07-14 19:04 ` [PATCH 09/23] md: rewrite md_setup_drive to avoid ioctls Christoph Hellwig
2020-07-15 23:50   ` NeilBrown [this message]
2020-07-16 13:38     ` Christoph Hellwig
2020-07-14 19:04 ` [PATCH 10/23] initrd: remove support for multiple floppies Christoph Hellwig
2020-07-14 19:04 ` [PATCH 11/23] initrd: remove the BLKFLSBUF call in handle_initrd Christoph Hellwig
2020-07-14 19:04 ` [PATCH 12/23] initrd: switch initrd loading to struct file based APIs Christoph Hellwig
2020-07-27  1:50   ` Al Viro
2020-07-14 19:04 ` [PATCH 13/23] initrd: mark init_linuxrc as __init Christoph Hellwig
2020-07-14 19:04 ` [PATCH 14/23] initrd: mark initrd support as deprecated Christoph Hellwig
2020-07-14 19:04 ` [PATCH 15/23] initramfs: remove the populate_initrd_image and clean_rootfs stubs Christoph Hellwig
2020-07-14 19:04 ` [PATCH 16/23] initramfs: simplify clean_rootfs Christoph Hellwig
     [not found]   ` <CGME20200717205549eucas1p13fca9a8496836faa71df515524743648@eucas1p1.samsung.com>
2020-07-17 20:55     ` Marek Szyprowski
2020-07-18 10:00       ` Christoph Hellwig
2020-07-23  9:22         ` Christoph Hellwig
2020-07-23 14:25           ` Lukasz Stelmach
2020-07-23 14:27             ` Christoph Hellwig
2020-07-27  2:41               ` Al Viro
2020-07-27  2:44                 ` Matthew Wilcox
2020-07-14 19:04 ` [PATCH 17/23] initramfs: switch initramfs unpacking to struct file based APIs Christoph Hellwig
2020-07-14 19:31   ` Linus Torvalds
2020-07-15  6:27     ` Christoph Hellwig
2020-07-27  2:55   ` Al Viro
2020-07-14 19:04 ` [PATCH 18/23] init: open code setting up stdin/stdout/stderr Christoph Hellwig
2020-07-27  3:05   ` Al Viro
2020-07-27  5:46     ` Christoph Hellwig
2020-07-27  6:03       ` Al Viro
2020-07-27  6:48         ` Christoph Hellwig
2020-07-27 15:54           ` Al Viro
2020-07-27 15:58             ` Christoph Hellwig
2020-07-27  6:20     ` hpa
2020-07-27  6:24       ` Christoph Hellwig
2020-07-27  6:36         ` hpa
2020-07-27  6:49           ` Christoph Hellwig
2020-07-14 19:04 ` [PATCH 19/23] fs: remove ksys_getdents64 Christoph Hellwig
2020-07-14 19:04 ` [PATCH 20/23] fs: remove ksys_open Christoph Hellwig
2020-07-14 19:04 ` [PATCH 21/23] fs: remove ksys_dup Christoph Hellwig
2020-07-14 19:04 ` [PATCH 22/23] fs: remove ksys_fchmod Christoph Hellwig
2020-07-14 19:04 ` [PATCH 23/23] fs: remove ksys_ioctl Christoph Hellwig
2020-07-14 19:34 ` decruft the early init / initrd / initramfs code v2 Linus Torvalds
2020-07-15  6:51   ` Christoph Hellwig
2020-07-16 15:57     ` Guoqing Jiang
2020-07-16 16:00       ` Christoph Hellwig

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=87365sxrqe.fsf@notabene.neil.brown.name \
    --to=neil@brown.name \
    --cc=hch@lst.de \
    --cc=hpa@zytor.com \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-raid@vger.kernel.org \
    --cc=song@kernel.org \
    --cc=torvalds@linux-foundation.org \
    --cc=viro@zeniv.linux.org.uk \
    /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.