11121 lines · 285.6 KB · C
RawDownload
// SPDX-License-Identifier: GPL-2.0-or-later/*   md.c : Multiple Devices driver for Linux     Copyright (C) 1998, 1999, 2000 Ingo Molnar      completely rewritten, based on the MD driver code from Marc Zyngier    Changes:    - RAID-1/RAID-5 extensions by Miguel de Icaza, Gadi Oxman, Ingo Molnar   - RAID-6 extensions by H. Peter Anvin <hpa@zytor.com>   - boot support for linear and striped mode by Harald Hoyer <HarryH@Royal.Net>   - kerneld support by Boris Tobotras <boris@xtalk.msk.su>   - kmod support by: Cyrus Durgin   - RAID0 bugfixes: Mark Anthony Lisher <markal@iname.com>   - Devfs support by Richard Gooch <rgooch@atnf.csiro.au>    - lots of fixes and improvements to the RAID1/RAID5 and generic     RAID code (such as request based resynchronization):      Neil Brown <neilb@cse.unsw.edu.au>.    - persistent bitmap code     Copyright (C) 2003-2004, Paul Clements, SteelEye Technology, Inc.     Errors, Warnings, etc.   Please use:     pr_crit() for error conditions that risk data loss     pr_err() for error conditions that are unexpected, like an IO error         or internal inconsistency     pr_warn() for error conditions that could have been predicated, like         adding a device to an array when it has incompatible metadata     pr_info() for every interesting, very rare events, like an array starting         or stopping, or resync starting or stopping     pr_debug() for everything else. */ #include <linux/sched/mm.h>#include <linux/sched/signal.h>#include <linux/kthread.h>#include <linux/blkdev.h>#include <linux/blk-integrity.h>#include <linux/badblocks.h>#include <linux/sysctl.h>#include <linux/seq_file.h>#include <linux/fs.h>#include <linux/poll.h>#include <linux/ctype.h>#include <linux/string.h>#include <linux/hdreg.h>#include <linux/proc_fs.h>#include <linux/random.h>#include <linux/major.h>#include <linux/module.h>#include <linux/reboot.h>#include <linux/file.h>#include <linux/compat.h>#include <linux/delay.h>#include <linux/raid/md_p.h>#include <linux/raid/md_u.h>#include <linux/raid/detect.h>#include <linux/slab.h>#include <linux/percpu-refcount.h>#include <linux/part_stat.h> #include "md.h"#include "md-bitmap.h"#include "md-cluster.h" static const char *action_name[NR_SYNC_ACTIONS] = {	[ACTION_RESYNC]		= "resync",	[ACTION_RECOVER]	= "recover",	[ACTION_CHECK]		= "check",	[ACTION_REPAIR]		= "repair",	[ACTION_RESHAPE]	= "reshape",	[ACTION_FROZEN]		= "frozen",	[ACTION_IDLE]		= "idle",}; static DEFINE_XARRAY(md_submodule); static const struct kobj_type md_ktype; static DECLARE_WAIT_QUEUE_HEAD(resync_wait); /* * This workqueue is used for sync_work to register new sync_thread, and for * del_work to remove rdev, and for event_work that is only set by dm-raid. * * Noted that sync_work will grab reconfig_mutex, hence never flush this * workqueue whith reconfig_mutex grabbed. */static struct workqueue_struct *md_misc_wq; static int remove_and_add_spares(struct mddev *mddev,				 struct md_rdev *this);static void mddev_detach(struct mddev *mddev);static void export_rdev(struct md_rdev *rdev);static void md_wakeup_thread_directly(struct md_thread __rcu **thread); /* * Default number of read corrections we'll attempt on an rdev * before ejecting it from the array. We divide the read error * count by 2 for every hour elapsed between read errors. */#define MD_DEFAULT_MAX_CORRECTED_READ_ERRORS 20/* Default safemode delay: 200 msec */#define DEFAULT_SAFEMODE_DELAY ((200 * HZ)/1000 +1)/* * Current RAID-1,4,5,6,10 parallel reconstruction 'guaranteed speed limit' * is sysctl_speed_limit_min, 1000 KB/sec by default, so the extra system load * does not show up that much. Increase it if you want to have more guaranteed * speed. Note that the RAID driver will use the maximum bandwidth * sysctl_speed_limit_max, 200 MB/sec by default, if the IO subsystem is idle. * * Background sync IO speed control: * * - below speed min: *   no limit; * - above speed min and below speed max: *   a) if mddev is idle, then no limit; *   b) if mddev is busy handling normal IO, then limit inflight sync IO *   to sync_io_depth; * - above speed max: *   sync IO can't be issued; * * Following configurations can be changed via /proc/sys/dev/raid/ for system * or /sys/block/mdX/md/ for one array. */static int sysctl_speed_limit_min = 1000;static int sysctl_speed_limit_max = 200000;static int sysctl_sync_io_depth = 32; static int speed_min(struct mddev *mddev){	return mddev->sync_speed_min ?		mddev->sync_speed_min : sysctl_speed_limit_min;} static int speed_max(struct mddev *mddev){	return mddev->sync_speed_max ?		mddev->sync_speed_max : sysctl_speed_limit_max;} static int sync_io_depth(struct mddev *mddev){	return mddev->sync_io_depth ?		mddev->sync_io_depth : sysctl_sync_io_depth;} static void rdev_uninit_serial(struct md_rdev *rdev){	if (!test_and_clear_bit(CollisionCheck, &rdev->flags))		return; 	kvfree(rdev->serial);	rdev->serial = NULL;} static void rdevs_uninit_serial(struct mddev *mddev){	struct md_rdev *rdev; 	rdev_for_each(rdev, mddev)		rdev_uninit_serial(rdev);} static int rdev_init_serial(struct md_rdev *rdev){	/* serial_nums equals with BARRIER_BUCKETS_NR */	int i, serial_nums = 1 << ((PAGE_SHIFT - ilog2(sizeof(atomic_t))));	struct serial_in_rdev *serial = NULL; 	if (test_bit(CollisionCheck, &rdev->flags))		return 0; 	serial = kvmalloc(sizeof(struct serial_in_rdev) * serial_nums,			  GFP_KERNEL);	if (!serial)		return -ENOMEM; 	for (i = 0; i < serial_nums; i++) {		struct serial_in_rdev *serial_tmp = &serial[i]; 		spin_lock_init(&serial_tmp->serial_lock);		serial_tmp->serial_rb = RB_ROOT_CACHED;	} 	rdev->serial = serial;	set_bit(CollisionCheck, &rdev->flags); 	return 0;} static int rdevs_init_serial(struct mddev *mddev){	struct md_rdev *rdev;	int ret = 0; 	rdev_for_each(rdev, mddev) {		ret = rdev_init_serial(rdev);		if (ret)			break;	} 	/* Free all resources if pool is not existed */	if (ret && !mddev->serial_info_pool)		rdevs_uninit_serial(mddev); 	return ret;} /* * rdev needs to enable serial stuffs if it meets the conditions: * 1. it is multi-queue device flaged with writemostly. * 2. the write-behind mode is enabled. */static int rdev_need_serial(struct md_rdev *rdev){	return (rdev && rdev->mddev->bitmap_info.max_write_behind > 0 &&		rdev->bdev->bd_disk->queue->nr_hw_queues != 1 &&		test_bit(WriteMostly, &rdev->flags));} /* * Init resource for rdev(s), then create serial_info_pool if: * 1. rdev is the first device which return true from rdev_enable_serial. * 2. rdev is NULL, means we want to enable serialization for all rdevs. */void mddev_create_serial_pool(struct mddev *mddev, struct md_rdev *rdev){	int ret = 0;	unsigned int noio_flags; 	if (!test_bit(MD_SERIALIZE_POLICY, &mddev->flags) &&	    rdev && !rdev_need_serial(rdev) &&	    !test_bit(CollisionCheck, &rdev->flags))		return; 	noio_flags = memalloc_noio_save();	if (!rdev)		ret = rdevs_init_serial(mddev);	else		ret = rdev_init_serial(rdev);	if (ret)		goto out; 	if (mddev->serial_info_pool == NULL) {		mddev->serial_info_pool =			mempool_create_kmalloc_pool(NR_SERIAL_INFOS,						sizeof(struct serial_info));		if (!mddev->serial_info_pool) {			rdevs_uninit_serial(mddev);			pr_err("can't alloc memory pool for serialization\n");		}	}out:	memalloc_noio_restore(noio_flags);} /* * Free resource from rdev(s), and destroy serial_info_pool under conditions: * 1. rdev is the last device flaged with CollisionCheck. * 2. when bitmap is destroyed while policy is not enabled. * 3. for disable policy, the pool is destroyed only when no rdev needs it. */void mddev_destroy_serial_pool(struct mddev *mddev, struct md_rdev *rdev){	if (rdev && !test_bit(CollisionCheck, &rdev->flags))		return; 	if (mddev->serial_info_pool) {		struct md_rdev *temp;		int num = 0; /* used to track if other rdevs need the pool */ 		rdev_for_each(temp, mddev) {			if (!rdev) {				if (!test_bit(MD_SERIALIZE_POLICY,					      &mddev->flags) ||				    !rdev_need_serial(temp))					rdev_uninit_serial(temp);				else					num++;			} else if (temp != rdev &&				   test_bit(CollisionCheck, &temp->flags))				num++;		} 		if (rdev)			rdev_uninit_serial(rdev); 		if (num)			pr_info("The mempool could be used by other devices\n");		else {			mempool_destroy(mddev->serial_info_pool);			mddev->serial_info_pool = NULL;		}	}} static struct ctl_table_header *raid_table_header; static const struct ctl_table raid_table[] = {	{		.procname	= "speed_limit_min",		.data		= &sysctl_speed_limit_min,		.maxlen		= sizeof(int),		.mode		= 0644,		.proc_handler	= proc_dointvec,	},	{		.procname	= "speed_limit_max",		.data		= &sysctl_speed_limit_max,		.maxlen		= sizeof(int),		.mode		= 0644,		.proc_handler	= proc_dointvec,	},	{		.procname	= "sync_io_depth",		.data		= &sysctl_sync_io_depth,		.maxlen		= sizeof(int),		.mode		= 0644,		.proc_handler	= proc_dointvec,	},}; static int start_readonly; /* * The original mechanism for creating an md device is to create * a device node in /dev and to open it.  This causes races with device-close. * The preferred method is to write to the "new_array" module parameter. * This can avoid races. * Setting create_on_open to false disables the original mechanism * so all the races disappear. */static bool create_on_open = true;static bool legacy_async_del_gendisk = true;static bool check_new_feature = true; /* * We have a system wide 'event count' that is incremented * on any 'interesting' event, and readers of /proc/mdstat * can use 'poll' or 'select' to find out when the event * count increases. * * Events are: *  start array, stop array, error, add device, remove device, *  start build, activate spare */static DECLARE_WAIT_QUEUE_HEAD(md_event_waiters);static atomic_t md_event_count;void md_new_event(void){	atomic_inc(&md_event_count);	wake_up(&md_event_waiters);}EXPORT_SYMBOL_GPL(md_new_event); /* * Enables to iterate over all existing md arrays * all_mddevs_lock protects this list. */static LIST_HEAD(all_mddevs);static DEFINE_SPINLOCK(all_mddevs_lock); static bool is_md_suspended(struct mddev *mddev){	return percpu_ref_is_dying(&mddev->active_io);}/* Rather than calling directly into the personality make_request function, * IO requests come here first so that we can check if the device is * being suspended pending a reconfiguration. * We hold a refcount over the call to ->make_request.  By the time that * call has finished, the bio has been linked into some internal structure * and so is visible to ->quiesce(), so we don't need the refcount any more. */static bool is_suspended(struct mddev *mddev, struct bio *bio){	if (is_md_suspended(mddev))		return true;	if (bio_data_dir(bio) != WRITE)		return false;	if (READ_ONCE(mddev->suspend_lo) >= READ_ONCE(mddev->suspend_hi))		return false;	if (bio->bi_iter.bi_sector >= READ_ONCE(mddev->suspend_hi))		return false;	if (bio_end_sector(bio) < READ_ONCE(mddev->suspend_lo))		return false;	return true;} bool md_handle_request(struct mddev *mddev, struct bio *bio){check_suspended:	if (unlikely(md_cloned_bio(mddev, bio))) {		/*		 * This bio is an MD cloned bio and already holds an		 * active_io reference, so percpu_ref_get() is safe here.		 */		percpu_ref_get(&mddev->active_io);	} else {		if (is_suspended(mddev, bio)) {			/* Bail out if REQ_NOWAIT is set for the bio */			if (bio->bi_opf & REQ_NOWAIT) {				bio_wouldblock_error(bio);				return true;			}			wait_event(mddev->sb_wait, !is_suspended(mddev, bio));		}		if (!percpu_ref_tryget_live(&mddev->active_io))			goto check_suspended;	}	if (!mddev->pers->make_request(mddev, bio)) {		percpu_ref_put(&mddev->active_io);		if (mddev_is_dm(mddev) && mddev->pers->prepare_suspend)			return false;		goto check_suspended;	} 	percpu_ref_put(&mddev->active_io);	return true;}EXPORT_SYMBOL(md_handle_request); static void md_submit_bio(struct bio *bio){	const int rw = bio_data_dir(bio);	struct mddev *mddev = bio->bi_bdev->bd_disk->private_data; 	if (mddev == NULL || mddev->pers == NULL) {		bio_io_error(bio);		return;	} 	if (unlikely(test_bit(MD_BROKEN, &mddev->flags)) && (rw == WRITE)) {		bio_io_error(bio);		return;	} 	bio = bio_split_to_limits(bio);	if (!bio)		return; 	if (mddev->ro == MD_RDONLY && unlikely(rw == WRITE)) {		if (bio_sectors(bio) != 0)			bio->bi_status = BLK_STS_IOERR;		bio_endio(bio);		return;	} 	/* bio could be mergeable after passing to underlayer */	bio->bi_opf &= ~REQ_NOMERGE; 	md_handle_request(mddev, bio);} /* * Make sure no new requests are submitted to the device, and any requests that * have been submitted are completely handled. */int mddev_suspend(struct mddev *mddev, bool interruptible){	int err = 0; 	/*	 * hold reconfig_mutex to wait for normal io will deadlock, because	 * other context can't update super_block, and normal io can rely on	 * updating super_block.	 */	lockdep_assert_not_held(&mddev->reconfig_mutex); 	if (interruptible)		err = mutex_lock_interruptible(&mddev->suspend_mutex);	else		mutex_lock(&mddev->suspend_mutex);	if (err)		return err; 	if (mddev->suspended) {		WRITE_ONCE(mddev->suspended, mddev->suspended + 1);		mutex_unlock(&mddev->suspend_mutex);		return 0;	} 	percpu_ref_kill(&mddev->active_io); 	/*	 * RAID456 IO can sleep in wait_for_reshape while still holding an	 * active_io reference. If reshape is already interrupted or frozen,	 * wake those waiters so they can abort and drop the reference instead	 * of deadlocking suspend.	 */	if (mddev->pers && mddev->pers->prepare_suspend &&	    reshape_interrupted(mddev))		mddev->pers->prepare_suspend(mddev); 

Lines 1–500 of 11121.