Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    1) // SPDX-License-Identifier: GPL-2.0-or-later
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    3)    md.c : Multiple Devices driver for Linux
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    4)      Copyright (C) 1998, 1999, 2000 Ingo Molnar
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    5) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    6)      completely rewritten, based on the MD driver code from Marc Zyngier
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    7) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    8)    Changes:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    9) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   10)    - RAID-1/RAID-5 extensions by Miguel de Icaza, Gadi Oxman, Ingo Molnar
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   11)    - RAID-6 extensions by H. Peter Anvin <hpa@zytor.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   12)    - boot support for linear and striped mode by Harald Hoyer <HarryH@Royal.Net>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   13)    - kerneld support by Boris Tobotras <boris@xtalk.msk.su>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   14)    - kmod support by: Cyrus Durgin
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   15)    - RAID0 bugfixes: Mark Anthony Lisher <markal@iname.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   16)    - Devfs support by Richard Gooch <rgooch@atnf.csiro.au>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   17) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   18)    - lots of fixes and improvements to the RAID1/RAID5 and generic
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   19)      RAID code (such as request based resynchronization):
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   20) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   21)      Neil Brown <neilb@cse.unsw.edu.au>.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   22) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   23)    - persistent bitmap code
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   24)      Copyright (C) 2003-2004, Paul Clements, SteelEye Technology, Inc.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   25) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   26) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   27)    Errors, Warnings, etc.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   28)    Please use:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   29)      pr_crit() for error conditions that risk data loss
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   30)      pr_err() for error conditions that are unexpected, like an IO error
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   31)          or internal inconsistency
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   32)      pr_warn() for error conditions that could have been predicated, like
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   33)          adding a device to an array when it has incompatible metadata
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   34)      pr_info() for every interesting, very rare events, like an array starting
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   35)          or stopping, or resync starting or stopping
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   36)      pr_debug() for everything else.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   37) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   38) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   39) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   40) #include <linux/sched/mm.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   41) #include <linux/sched/signal.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   42) #include <linux/kthread.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   43) #include <linux/blkdev.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   44) #include <linux/badblocks.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   45) #include <linux/sysctl.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   46) #include <linux/seq_file.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   47) #include <linux/fs.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   48) #include <linux/poll.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   49) #include <linux/ctype.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   50) #include <linux/string.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   51) #include <linux/hdreg.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   52) #include <linux/proc_fs.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   53) #include <linux/random.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   54) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   55) #include <linux/reboot.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   56) #include <linux/file.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   57) #include <linux/compat.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   58) #include <linux/delay.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   59) #include <linux/raid/md_p.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   60) #include <linux/raid/md_u.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   61) #include <linux/raid/detect.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   62) #include <linux/slab.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   63) #include <linux/percpu-refcount.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   64) #include <linux/part_stat.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   65) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   66) #include <trace/events/block.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   67) #include "md.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   68) #include "md-bitmap.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   69) #include "md-cluster.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   70) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   71) /* pers_list is a list of registered personalities protected
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   72)  * by pers_lock.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   73)  * pers_lock does extra service to protect accesses to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   74)  * mddev->thread when the mutex cannot be held.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   75)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   76) static LIST_HEAD(pers_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   77) static DEFINE_SPINLOCK(pers_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   78) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   79) static struct kobj_type md_ktype;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   80) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   81) struct md_cluster_operations *md_cluster_ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   82) EXPORT_SYMBOL(md_cluster_ops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   83) static struct module *md_cluster_mod;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   84) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   85) static DECLARE_WAIT_QUEUE_HEAD(resync_wait);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   86) static struct workqueue_struct *md_wq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   87) static struct workqueue_struct *md_misc_wq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   88) static struct workqueue_struct *md_rdev_misc_wq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   89) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   90) static int remove_and_add_spares(struct mddev *mddev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   91) 				 struct md_rdev *this);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   92) static void mddev_detach(struct mddev *mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   93) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   94) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   95)  * Default number of read corrections we'll attempt on an rdev
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   96)  * before ejecting it from the array. We divide the read error
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   97)  * count by 2 for every hour elapsed between read errors.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   98)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   99) #define MD_DEFAULT_MAX_CORRECTED_READ_ERRORS 20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  100) /* Default safemode delay: 200 msec */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  101) #define DEFAULT_SAFEMODE_DELAY ((200 * HZ)/1000 +1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  102) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  103)  * Current RAID-1,4,5 parallel reconstruction 'guaranteed speed limit'
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  104)  * is 1000 KB/sec, so the extra system load does not show up that much.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  105)  * Increase it if you want to have more _guaranteed_ speed. Note that
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  106)  * the RAID driver will use the maximum available bandwidth if the IO
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  107)  * subsystem is idle. There is also an 'absolute maximum' reconstruction
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  108)  * speed limit - in case reconstruction slows down your system despite
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  109)  * idle IO detection.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  110)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  111)  * you can change it via /proc/sys/dev/raid/speed_limit_min and _max.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  112)  * or /sys/block/mdX/md/sync_speed_{min,max}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  113)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  114) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  115) static int sysctl_speed_limit_min = 1000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  116) static int sysctl_speed_limit_max = 200000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  117) static inline int speed_min(struct mddev *mddev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  118) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  119) 	return mddev->sync_speed_min ?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  120) 		mddev->sync_speed_min : sysctl_speed_limit_min;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  121) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  122) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  123) static inline int speed_max(struct mddev *mddev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  124) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  125) 	return mddev->sync_speed_max ?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  126) 		mddev->sync_speed_max : sysctl_speed_limit_max;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  127) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  128) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  129) static void rdev_uninit_serial(struct md_rdev *rdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  130) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  131) 	if (!test_and_clear_bit(CollisionCheck, &rdev->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  132) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  133) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  134) 	kvfree(rdev->serial);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  135) 	rdev->serial = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  136) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  137) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  138) static void rdevs_uninit_serial(struct mddev *mddev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  139) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  140) 	struct md_rdev *rdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  141) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  142) 	rdev_for_each(rdev, mddev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  143) 		rdev_uninit_serial(rdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  144) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  145) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  146) static int rdev_init_serial(struct md_rdev *rdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  147) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  148) 	/* serial_nums equals with BARRIER_BUCKETS_NR */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  149) 	int i, serial_nums = 1 << ((PAGE_SHIFT - ilog2(sizeof(atomic_t))));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  150) 	struct serial_in_rdev *serial = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  151) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  152) 	if (test_bit(CollisionCheck, &rdev->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  153) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  154) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  155) 	serial = kvmalloc(sizeof(struct serial_in_rdev) * serial_nums,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  156) 			  GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  157) 	if (!serial)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  158) 		return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  159) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  160) 	for (i = 0; i < serial_nums; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  161) 		struct serial_in_rdev *serial_tmp = &serial[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  162) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  163) 		spin_lock_init(&serial_tmp->serial_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  164) 		serial_tmp->serial_rb = RB_ROOT_CACHED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  165) 		init_waitqueue_head(&serial_tmp->serial_io_wait);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  166) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  167) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  168) 	rdev->serial = serial;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  169) 	set_bit(CollisionCheck, &rdev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  170) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  171) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  172) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  173) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  174) static int rdevs_init_serial(struct mddev *mddev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  175) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  176) 	struct md_rdev *rdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  177) 	int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  178) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  179) 	rdev_for_each(rdev, mddev) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  180) 		ret = rdev_init_serial(rdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  181) 		if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  182) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  183) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  184) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  185) 	/* Free all resources if pool is not existed */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  186) 	if (ret && !mddev->serial_info_pool)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  187) 		rdevs_uninit_serial(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  188) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  189) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  190) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  191) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  192) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  193)  * rdev needs to enable serial stuffs if it meets the conditions:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  194)  * 1. it is multi-queue device flaged with writemostly.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  195)  * 2. the write-behind mode is enabled.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  196)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  197) static int rdev_need_serial(struct md_rdev *rdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  198) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  199) 	return (rdev && rdev->mddev->bitmap_info.max_write_behind > 0 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  200) 		rdev->bdev->bd_disk->queue->nr_hw_queues != 1 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  201) 		test_bit(WriteMostly, &rdev->flags));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  202) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  203) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  204) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  205)  * Init resource for rdev(s), then create serial_info_pool if:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  206)  * 1. rdev is the first device which return true from rdev_enable_serial.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  207)  * 2. rdev is NULL, means we want to enable serialization for all rdevs.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  208)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  209) void mddev_create_serial_pool(struct mddev *mddev, struct md_rdev *rdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  210) 			      bool is_suspend)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  211) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  212) 	int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  213) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  214) 	if (rdev && !rdev_need_serial(rdev) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  215) 	    !test_bit(CollisionCheck, &rdev->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  216) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  217) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  218) 	if (!is_suspend)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  219) 		mddev_suspend(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  220) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  221) 	if (!rdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  222) 		ret = rdevs_init_serial(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  223) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  224) 		ret = rdev_init_serial(rdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  225) 	if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  226) 		goto abort;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  227) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  228) 	if (mddev->serial_info_pool == NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  229) 		/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  230) 		 * already in memalloc noio context by
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  231) 		 * mddev_suspend()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  232) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  233) 		mddev->serial_info_pool =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  234) 			mempool_create_kmalloc_pool(NR_SERIAL_INFOS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  235) 						sizeof(struct serial_info));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  236) 		if (!mddev->serial_info_pool) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  237) 			rdevs_uninit_serial(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  238) 			pr_err("can't alloc memory pool for serialization\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  239) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  240) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  241) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  242) abort:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  243) 	if (!is_suspend)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  244) 		mddev_resume(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  245) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  246) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  247) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  248)  * Free resource from rdev(s), and destroy serial_info_pool under conditions:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  249)  * 1. rdev is the last device flaged with CollisionCheck.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  250)  * 2. when bitmap is destroyed while policy is not enabled.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  251)  * 3. for disable policy, the pool is destroyed only when no rdev needs it.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  252)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  253) void mddev_destroy_serial_pool(struct mddev *mddev, struct md_rdev *rdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  254) 			       bool is_suspend)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  255) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  256) 	if (rdev && !test_bit(CollisionCheck, &rdev->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  257) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  258) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  259) 	if (mddev->serial_info_pool) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  260) 		struct md_rdev *temp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  261) 		int num = 0; /* used to track if other rdevs need the pool */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  262) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  263) 		if (!is_suspend)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  264) 			mddev_suspend(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  265) 		rdev_for_each(temp, mddev) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  266) 			if (!rdev) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  267) 				if (!mddev->serialize_policy ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  268) 				    !rdev_need_serial(temp))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  269) 					rdev_uninit_serial(temp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  270) 				else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  271) 					num++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  272) 			} else if (temp != rdev &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  273) 				   test_bit(CollisionCheck, &temp->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  274) 				num++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  275) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  276) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  277) 		if (rdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  278) 			rdev_uninit_serial(rdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  279) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  280) 		if (num)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  281) 			pr_info("The mempool could be used by other devices\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  282) 		else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  283) 			mempool_destroy(mddev->serial_info_pool);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  284) 			mddev->serial_info_pool = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  285) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  286) 		if (!is_suspend)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  287) 			mddev_resume(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  288) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  289) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  290) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  291) static struct ctl_table_header *raid_table_header;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  292) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  293) static struct ctl_table raid_table[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  294) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  295) 		.procname	= "speed_limit_min",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  296) 		.data		= &sysctl_speed_limit_min,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  297) 		.maxlen		= sizeof(int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  298) 		.mode		= S_IRUGO|S_IWUSR,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  299) 		.proc_handler	= proc_dointvec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  300) 	},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  301) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  302) 		.procname	= "speed_limit_max",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  303) 		.data		= &sysctl_speed_limit_max,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  304) 		.maxlen		= sizeof(int),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  305) 		.mode		= S_IRUGO|S_IWUSR,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  306) 		.proc_handler	= proc_dointvec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  307) 	},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  308) 	{ }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  309) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  310) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  311) static struct ctl_table raid_dir_table[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  312) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  313) 		.procname	= "raid",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  314) 		.maxlen		= 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  315) 		.mode		= S_IRUGO|S_IXUGO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  316) 		.child		= raid_table,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  317) 	},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  318) 	{ }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  319) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  320) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  321) static struct ctl_table raid_root_table[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  322) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  323) 		.procname	= "dev",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  324) 		.maxlen		= 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  325) 		.mode		= 0555,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  326) 		.child		= raid_dir_table,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  327) 	},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  328) 	{  }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  329) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  330) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  331) static int start_readonly;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  332) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  333) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  334)  * The original mechanism for creating an md device is to create
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  335)  * a device node in /dev and to open it.  This causes races with device-close.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  336)  * The preferred method is to write to the "new_array" module parameter.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  337)  * This can avoid races.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  338)  * Setting create_on_open to false disables the original mechanism
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  339)  * so all the races disappear.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  340)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  341) static bool create_on_open = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  342) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  343) struct bio *bio_alloc_mddev(gfp_t gfp_mask, int nr_iovecs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  344) 			    struct mddev *mddev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  345) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  346) 	if (!mddev || !bioset_initialized(&mddev->bio_set))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  347) 		return bio_alloc(gfp_mask, nr_iovecs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  348) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  349) 	return bio_alloc_bioset(gfp_mask, nr_iovecs, &mddev->bio_set);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  350) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  351) EXPORT_SYMBOL_GPL(bio_alloc_mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  352) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  353) static struct bio *md_bio_alloc_sync(struct mddev *mddev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  354) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  355) 	if (!mddev || !bioset_initialized(&mddev->sync_set))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  356) 		return bio_alloc(GFP_NOIO, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  357) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  358) 	return bio_alloc_bioset(GFP_NOIO, 1, &mddev->sync_set);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  359) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  360) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  361) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  362)  * We have a system wide 'event count' that is incremented
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  363)  * on any 'interesting' event, and readers of /proc/mdstat
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  364)  * can use 'poll' or 'select' to find out when the event
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  365)  * count increases.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  366)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  367)  * Events are:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  368)  *  start array, stop array, error, add device, remove device,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  369)  *  start build, activate spare
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  370)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  371) static DECLARE_WAIT_QUEUE_HEAD(md_event_waiters);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  372) static atomic_t md_event_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  373) void md_new_event(struct mddev *mddev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  374) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  375) 	atomic_inc(&md_event_count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  376) 	wake_up(&md_event_waiters);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  377) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  378) EXPORT_SYMBOL_GPL(md_new_event);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  379) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  380) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  381)  * Enables to iterate over all existing md arrays
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  382)  * all_mddevs_lock protects this list.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  383)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  384) static LIST_HEAD(all_mddevs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  385) static DEFINE_SPINLOCK(all_mddevs_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  386) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  387) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  388)  * iterates through all used mddevs in the system.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  389)  * We take care to grab the all_mddevs_lock whenever navigating
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  390)  * the list, and to always hold a refcount when unlocked.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  391)  * Any code which breaks out of this loop while own
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  392)  * a reference to the current mddev and must mddev_put it.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  393)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  394) #define for_each_mddev(_mddev,_tmp)					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  395) 									\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  396) 	for (({ spin_lock(&all_mddevs_lock);				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  397) 		_tmp = all_mddevs.next;					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  398) 		_mddev = NULL;});					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  399) 	     ({ if (_tmp != &all_mddevs)				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  400) 			mddev_get(list_entry(_tmp, struct mddev, all_mddevs));\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  401) 		spin_unlock(&all_mddevs_lock);				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  402) 		if (_mddev) mddev_put(_mddev);				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  403) 		_mddev = list_entry(_tmp, struct mddev, all_mddevs);	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  404) 		_tmp != &all_mddevs;});					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  405) 	     ({ spin_lock(&all_mddevs_lock);				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  406) 		_tmp = _tmp->next;})					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  407) 		)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  408) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  409) /* Rather than calling directly into the personality make_request function,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  410)  * IO requests come here first so that we can check if the device is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  411)  * being suspended pending a reconfiguration.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  412)  * We hold a refcount over the call to ->make_request.  By the time that
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  413)  * call has finished, the bio has been linked into some internal structure
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  414)  * and so is visible to ->quiesce(), so we don't need the refcount any more.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  415)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  416) static bool is_suspended(struct mddev *mddev, struct bio *bio)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  417) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  418) 	if (mddev->suspended)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  419) 		return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  420) 	if (bio_data_dir(bio) != WRITE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  421) 		return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  422) 	if (mddev->suspend_lo >= mddev->suspend_hi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  423) 		return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  424) 	if (bio->bi_iter.bi_sector >= mddev->suspend_hi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  425) 		return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  426) 	if (bio_end_sector(bio) < mddev->suspend_lo)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  427) 		return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  428) 	return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  429) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  430) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  431) void md_handle_request(struct mddev *mddev, struct bio *bio)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  432) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  433) check_suspended:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  434) 	rcu_read_lock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  435) 	if (is_suspended(mddev, bio)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  436) 		DEFINE_WAIT(__wait);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  437) 		for (;;) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  438) 			prepare_to_wait(&mddev->sb_wait, &__wait,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  439) 					TASK_UNINTERRUPTIBLE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  440) 			if (!is_suspended(mddev, bio))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  441) 				break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  442) 			rcu_read_unlock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  443) 			schedule();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  444) 			rcu_read_lock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  445) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  446) 		finish_wait(&mddev->sb_wait, &__wait);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  447) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  448) 	atomic_inc(&mddev->active_io);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  449) 	rcu_read_unlock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  450) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  451) 	if (!mddev->pers->make_request(mddev, bio)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  452) 		atomic_dec(&mddev->active_io);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  453) 		wake_up(&mddev->sb_wait);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  454) 		goto check_suspended;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  455) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  456) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  457) 	if (atomic_dec_and_test(&mddev->active_io) && mddev->suspended)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  458) 		wake_up(&mddev->sb_wait);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  459) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  460) EXPORT_SYMBOL(md_handle_request);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  461) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  462) static blk_qc_t md_submit_bio(struct bio *bio)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  463) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  464) 	const int rw = bio_data_dir(bio);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  465) 	const int sgrp = op_stat_group(bio_op(bio));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  466) 	struct mddev *mddev = bio->bi_disk->private_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  467) 	unsigned int sectors;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  468) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  469) 	if (mddev == NULL || mddev->pers == NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  470) 		bio_io_error(bio);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  471) 		return BLK_QC_T_NONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  472) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  473) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  474) 	if (unlikely(test_bit(MD_BROKEN, &mddev->flags)) && (rw == WRITE)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  475) 		bio_io_error(bio);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  476) 		return BLK_QC_T_NONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  477) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  478) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  479) 	blk_queue_split(&bio);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  480) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  481) 	if (mddev->ro == 1 && unlikely(rw == WRITE)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  482) 		if (bio_sectors(bio) != 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  483) 			bio->bi_status = BLK_STS_IOERR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  484) 		bio_endio(bio);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  485) 		return BLK_QC_T_NONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  486) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  487) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  488) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  489) 	 * save the sectors now since our bio can
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  490) 	 * go away inside make_request
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  491) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  492) 	sectors = bio_sectors(bio);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  493) 	/* bio could be mergeable after passing to underlayer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  494) 	bio->bi_opf &= ~REQ_NOMERGE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  495) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  496) 	md_handle_request(mddev, bio);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  497) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  498) 	part_stat_lock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  499) 	part_stat_inc(&mddev->gendisk->part0, ios[sgrp]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  500) 	part_stat_add(&mddev->gendisk->part0, sectors[sgrp], sectors);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  501) 	part_stat_unlock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  502) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  503) 	return BLK_QC_T_NONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  504) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  505) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  506) /* mddev_suspend makes sure no new requests are submitted
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  507)  * to the device, and that any requests that have been submitted
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  508)  * are completely handled.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  509)  * Once mddev_detach() is called and completes, the module will be
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  510)  * completely unused.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  511)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  512) void mddev_suspend(struct mddev *mddev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  513) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  514) 	WARN_ON_ONCE(mddev->thread && current == mddev->thread->tsk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  515) 	lockdep_assert_held(&mddev->reconfig_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  516) 	if (mddev->suspended++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  517) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  518) 	synchronize_rcu();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  519) 	wake_up(&mddev->sb_wait);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  520) 	set_bit(MD_ALLOW_SB_UPDATE, &mddev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  521) 	smp_mb__after_atomic();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  522) 	wait_event(mddev->sb_wait, atomic_read(&mddev->active_io) == 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  523) 	mddev->pers->quiesce(mddev, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  524) 	clear_bit_unlock(MD_ALLOW_SB_UPDATE, &mddev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  525) 	wait_event(mddev->sb_wait, !test_bit(MD_UPDATING_SB, &mddev->flags));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  526) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  527) 	del_timer_sync(&mddev->safemode_timer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  528) 	/* restrict memory reclaim I/O during raid array is suspend */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  529) 	mddev->noio_flag = memalloc_noio_save();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  530) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  531) EXPORT_SYMBOL_GPL(mddev_suspend);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  532) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  533) void mddev_resume(struct mddev *mddev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  534) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  535) 	/* entred the memalloc scope from mddev_suspend() */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  536) 	memalloc_noio_restore(mddev->noio_flag);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  537) 	lockdep_assert_held(&mddev->reconfig_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  538) 	if (--mddev->suspended)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  539) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  540) 	wake_up(&mddev->sb_wait);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  541) 	mddev->pers->quiesce(mddev, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  542) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  543) 	set_bit(MD_RECOVERY_NEEDED, &mddev->recovery);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  544) 	md_wakeup_thread(mddev->thread);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  545) 	md_wakeup_thread(mddev->sync_thread); /* possibly kick off a reshape */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  546) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  547) EXPORT_SYMBOL_GPL(mddev_resume);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  548) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  549) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  550)  * Generic flush handling for md
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  551)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  552) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  553) static void md_end_flush(struct bio *bio)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  554) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  555) 	struct md_rdev *rdev = bio->bi_private;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  556) 	struct mddev *mddev = rdev->mddev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  557) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  558) 	rdev_dec_pending(rdev, mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  559) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  560) 	if (atomic_dec_and_test(&mddev->flush_pending)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  561) 		/* The pre-request flush has finished */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  562) 		queue_work(md_wq, &mddev->flush_work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  563) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  564) 	bio_put(bio);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  565) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  566) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  567) static void md_submit_flush_data(struct work_struct *ws);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  568) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  569) static void submit_flushes(struct work_struct *ws)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  570) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  571) 	struct mddev *mddev = container_of(ws, struct mddev, flush_work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  572) 	struct md_rdev *rdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  573) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  574) 	mddev->start_flush = ktime_get_boottime();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  575) 	INIT_WORK(&mddev->flush_work, md_submit_flush_data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  576) 	atomic_set(&mddev->flush_pending, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  577) 	rcu_read_lock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  578) 	rdev_for_each_rcu(rdev, mddev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  579) 		if (rdev->raid_disk >= 0 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  580) 		    !test_bit(Faulty, &rdev->flags)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  581) 			/* Take two references, one is dropped
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  582) 			 * when request finishes, one after
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  583) 			 * we reclaim rcu_read_lock
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  584) 			 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  585) 			struct bio *bi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  586) 			atomic_inc(&rdev->nr_pending);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  587) 			atomic_inc(&rdev->nr_pending);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  588) 			rcu_read_unlock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  589) 			bi = bio_alloc_mddev(GFP_NOIO, 0, mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  590) 			bi->bi_end_io = md_end_flush;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  591) 			bi->bi_private = rdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  592) 			bio_set_dev(bi, rdev->bdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  593) 			bi->bi_opf = REQ_OP_WRITE | REQ_PREFLUSH;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  594) 			atomic_inc(&mddev->flush_pending);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  595) 			submit_bio(bi);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  596) 			rcu_read_lock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  597) 			rdev_dec_pending(rdev, mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  598) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  599) 	rcu_read_unlock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  600) 	if (atomic_dec_and_test(&mddev->flush_pending))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  601) 		queue_work(md_wq, &mddev->flush_work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  602) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  603) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  604) static void md_submit_flush_data(struct work_struct *ws)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  605) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  606) 	struct mddev *mddev = container_of(ws, struct mddev, flush_work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  607) 	struct bio *bio = mddev->flush_bio;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  608) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  609) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  610) 	 * must reset flush_bio before calling into md_handle_request to avoid a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  611) 	 * deadlock, because other bios passed md_handle_request suspend check
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  612) 	 * could wait for this and below md_handle_request could wait for those
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  613) 	 * bios because of suspend check
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  614) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  615) 	spin_lock_irq(&mddev->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  616) 	mddev->last_flush = mddev->start_flush;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  617) 	mddev->flush_bio = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  618) 	spin_unlock_irq(&mddev->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  619) 	wake_up(&mddev->sb_wait);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  620) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  621) 	if (bio->bi_iter.bi_size == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  622) 		/* an empty barrier - all done */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  623) 		bio_endio(bio);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  624) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  625) 		bio->bi_opf &= ~REQ_PREFLUSH;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  626) 		md_handle_request(mddev, bio);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  627) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  628) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  629) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  630) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  631)  * Manages consolidation of flushes and submitting any flushes needed for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  632)  * a bio with REQ_PREFLUSH.  Returns true if the bio is finished or is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  633)  * being finished in another context.  Returns false if the flushing is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  634)  * complete but still needs the I/O portion of the bio to be processed.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  635)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  636) bool md_flush_request(struct mddev *mddev, struct bio *bio)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  637) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  638) 	ktime_t start = ktime_get_boottime();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  639) 	spin_lock_irq(&mddev->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  640) 	wait_event_lock_irq(mddev->sb_wait,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  641) 			    !mddev->flush_bio ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  642) 			    ktime_after(mddev->last_flush, start),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  643) 			    mddev->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  644) 	if (!ktime_after(mddev->last_flush, start)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  645) 		WARN_ON(mddev->flush_bio);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  646) 		mddev->flush_bio = bio;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  647) 		bio = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  648) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  649) 	spin_unlock_irq(&mddev->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  650) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  651) 	if (!bio) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  652) 		INIT_WORK(&mddev->flush_work, submit_flushes);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  653) 		queue_work(md_wq, &mddev->flush_work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  654) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  655) 		/* flush was performed for some other bio while we waited. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  656) 		if (bio->bi_iter.bi_size == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  657) 			/* an empty barrier - all done */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  658) 			bio_endio(bio);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  659) 		else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  660) 			bio->bi_opf &= ~REQ_PREFLUSH;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  661) 			return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  662) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  663) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  664) 	return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  665) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  666) EXPORT_SYMBOL(md_flush_request);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  667) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  668) static inline struct mddev *mddev_get(struct mddev *mddev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  669) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  670) 	atomic_inc(&mddev->active);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  671) 	return mddev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  672) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  673) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  674) static void mddev_delayed_delete(struct work_struct *ws);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  675) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  676) static void mddev_put(struct mddev *mddev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  677) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  678) 	if (!atomic_dec_and_lock(&mddev->active, &all_mddevs_lock))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  679) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  680) 	if (!mddev->raid_disks && list_empty(&mddev->disks) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  681) 	    mddev->ctime == 0 && !mddev->hold_active) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  682) 		/* Array is not configured at all, and not held active,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  683) 		 * so destroy it */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  684) 		list_del_init(&mddev->all_mddevs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  685) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  686) 		/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  687) 		 * Call queue_work inside the spinlock so that
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  688) 		 * flush_workqueue() after mddev_find will succeed in waiting
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  689) 		 * for the work to be done.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  690) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  691) 		INIT_WORK(&mddev->del_work, mddev_delayed_delete);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  692) 		queue_work(md_misc_wq, &mddev->del_work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  693) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  694) 	spin_unlock(&all_mddevs_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  695) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  696) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  697) static void md_safemode_timeout(struct timer_list *t);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  698) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  699) void mddev_init(struct mddev *mddev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  700) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  701) 	kobject_init(&mddev->kobj, &md_ktype);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  702) 	mutex_init(&mddev->open_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  703) 	mutex_init(&mddev->reconfig_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  704) 	mutex_init(&mddev->bitmap_info.mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  705) 	INIT_LIST_HEAD(&mddev->disks);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  706) 	INIT_LIST_HEAD(&mddev->all_mddevs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  707) 	timer_setup(&mddev->safemode_timer, md_safemode_timeout, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  708) 	atomic_set(&mddev->active, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  709) 	atomic_set(&mddev->openers, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  710) 	atomic_set(&mddev->active_io, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  711) 	spin_lock_init(&mddev->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  712) 	atomic_set(&mddev->flush_pending, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  713) 	init_waitqueue_head(&mddev->sb_wait);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  714) 	init_waitqueue_head(&mddev->recovery_wait);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  715) 	mddev->reshape_position = MaxSector;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  716) 	mddev->reshape_backwards = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  717) 	mddev->last_sync_action = "none";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  718) 	mddev->resync_min = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  719) 	mddev->resync_max = MaxSector;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  720) 	mddev->level = LEVEL_NONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  721) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  722) EXPORT_SYMBOL_GPL(mddev_init);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  723) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  724) static struct mddev *mddev_find_locked(dev_t unit)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  725) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  726) 	struct mddev *mddev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  727) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  728) 	list_for_each_entry(mddev, &all_mddevs, all_mddevs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  729) 		if (mddev->unit == unit)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  730) 			return mddev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  731) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  732) 	return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  733) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  734) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  735) static struct mddev *mddev_find(dev_t unit)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  736) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  737) 	struct mddev *mddev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  738) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  739) 	if (MAJOR(unit) != MD_MAJOR)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  740) 		unit &= ~((1 << MdpMinorShift) - 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  741) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  742) 	spin_lock(&all_mddevs_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  743) 	mddev = mddev_find_locked(unit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  744) 	if (mddev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  745) 		mddev_get(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  746) 	spin_unlock(&all_mddevs_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  747) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  748) 	return mddev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  749) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  750) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  751) static struct mddev *mddev_find_or_alloc(dev_t unit)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  752) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  753) 	struct mddev *mddev, *new = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  754) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  755) 	if (unit && MAJOR(unit) != MD_MAJOR)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  756) 		unit &= ~((1<<MdpMinorShift)-1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  757) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  758)  retry:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  759) 	spin_lock(&all_mddevs_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  760) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  761) 	if (unit) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  762) 		mddev = mddev_find_locked(unit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  763) 		if (mddev) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  764) 			mddev_get(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  765) 			spin_unlock(&all_mddevs_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  766) 			kfree(new);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  767) 			return mddev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  768) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  769) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  770) 		if (new) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  771) 			list_add(&new->all_mddevs, &all_mddevs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  772) 			spin_unlock(&all_mddevs_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  773) 			new->hold_active = UNTIL_IOCTL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  774) 			return new;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  775) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  776) 	} else if (new) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  777) 		/* find an unused unit number */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  778) 		static int next_minor = 512;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  779) 		int start = next_minor;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  780) 		int is_free = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  781) 		int dev = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  782) 		while (!is_free) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  783) 			dev = MKDEV(MD_MAJOR, next_minor);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  784) 			next_minor++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  785) 			if (next_minor > MINORMASK)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  786) 				next_minor = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  787) 			if (next_minor == start) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  788) 				/* Oh dear, all in use. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  789) 				spin_unlock(&all_mddevs_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  790) 				kfree(new);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  791) 				return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  792) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  793) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  794) 			is_free = !mddev_find_locked(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  795) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  796) 		new->unit = dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  797) 		new->md_minor = MINOR(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  798) 		new->hold_active = UNTIL_STOP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  799) 		list_add(&new->all_mddevs, &all_mddevs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  800) 		spin_unlock(&all_mddevs_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  801) 		return new;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  802) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  803) 	spin_unlock(&all_mddevs_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  804) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  805) 	new = kzalloc(sizeof(*new), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  806) 	if (!new)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  807) 		return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  808) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  809) 	new->unit = unit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  810) 	if (MAJOR(unit) == MD_MAJOR)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  811) 		new->md_minor = MINOR(unit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  812) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  813) 		new->md_minor = MINOR(unit) >> MdpMinorShift;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  814) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  815) 	mddev_init(new);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  816) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  817) 	goto retry;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  818) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  819) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  820) static struct attribute_group md_redundancy_group;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  821) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  822) void mddev_unlock(struct mddev *mddev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  823) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  824) 	if (mddev->to_remove) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  825) 		/* These cannot be removed under reconfig_mutex as
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  826) 		 * an access to the files will try to take reconfig_mutex
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  827) 		 * while holding the file unremovable, which leads to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  828) 		 * a deadlock.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  829) 		 * So hold set sysfs_active while the remove in happeing,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  830) 		 * and anything else which might set ->to_remove or my
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  831) 		 * otherwise change the sysfs namespace will fail with
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  832) 		 * -EBUSY if sysfs_active is still set.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  833) 		 * We set sysfs_active under reconfig_mutex and elsewhere
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  834) 		 * test it under the same mutex to ensure its correct value
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  835) 		 * is seen.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  836) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  837) 		struct attribute_group *to_remove = mddev->to_remove;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  838) 		mddev->to_remove = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  839) 		mddev->sysfs_active = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  840) 		mutex_unlock(&mddev->reconfig_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  841) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  842) 		if (mddev->kobj.sd) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  843) 			if (to_remove != &md_redundancy_group)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  844) 				sysfs_remove_group(&mddev->kobj, to_remove);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  845) 			if (mddev->pers == NULL ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  846) 			    mddev->pers->sync_request == NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  847) 				sysfs_remove_group(&mddev->kobj, &md_redundancy_group);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  848) 				if (mddev->sysfs_action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  849) 					sysfs_put(mddev->sysfs_action);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  850) 				if (mddev->sysfs_completed)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  851) 					sysfs_put(mddev->sysfs_completed);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  852) 				if (mddev->sysfs_degraded)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  853) 					sysfs_put(mddev->sysfs_degraded);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  854) 				mddev->sysfs_action = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  855) 				mddev->sysfs_completed = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  856) 				mddev->sysfs_degraded = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  857) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  858) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  859) 		mddev->sysfs_active = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  860) 	} else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  861) 		mutex_unlock(&mddev->reconfig_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  862) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  863) 	/* As we've dropped the mutex we need a spinlock to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  864) 	 * make sure the thread doesn't disappear
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  865) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  866) 	spin_lock(&pers_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  867) 	md_wakeup_thread(mddev->thread);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  868) 	wake_up(&mddev->sb_wait);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  869) 	spin_unlock(&pers_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  870) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  871) EXPORT_SYMBOL_GPL(mddev_unlock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  872) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  873) struct md_rdev *md_find_rdev_nr_rcu(struct mddev *mddev, int nr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  874) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  875) 	struct md_rdev *rdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  876) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  877) 	rdev_for_each_rcu(rdev, mddev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  878) 		if (rdev->desc_nr == nr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  879) 			return rdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  880) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  881) 	return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  882) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  883) EXPORT_SYMBOL_GPL(md_find_rdev_nr_rcu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  884) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  885) static struct md_rdev *find_rdev(struct mddev *mddev, dev_t dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  886) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  887) 	struct md_rdev *rdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  888) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  889) 	rdev_for_each(rdev, mddev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  890) 		if (rdev->bdev->bd_dev == dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  891) 			return rdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  892) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  893) 	return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  894) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  895) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  896) struct md_rdev *md_find_rdev_rcu(struct mddev *mddev, dev_t dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  897) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  898) 	struct md_rdev *rdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  899) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  900) 	rdev_for_each_rcu(rdev, mddev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  901) 		if (rdev->bdev->bd_dev == dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  902) 			return rdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  903) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  904) 	return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  905) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  906) EXPORT_SYMBOL_GPL(md_find_rdev_rcu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  907) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  908) static struct md_personality *find_pers(int level, char *clevel)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  909) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  910) 	struct md_personality *pers;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  911) 	list_for_each_entry(pers, &pers_list, list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  912) 		if (level != LEVEL_NONE && pers->level == level)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  913) 			return pers;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  914) 		if (strcmp(pers->name, clevel)==0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  915) 			return pers;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  916) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  917) 	return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  918) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  919) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  920) /* return the offset of the super block in 512byte sectors */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  921) static inline sector_t calc_dev_sboffset(struct md_rdev *rdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  922) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  923) 	sector_t num_sectors = i_size_read(rdev->bdev->bd_inode) / 512;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  924) 	return MD_NEW_SIZE_SECTORS(num_sectors);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  925) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  926) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  927) static int alloc_disk_sb(struct md_rdev *rdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  928) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  929) 	rdev->sb_page = alloc_page(GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  930) 	if (!rdev->sb_page)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  931) 		return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  932) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  933) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  934) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  935) void md_rdev_clear(struct md_rdev *rdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  936) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  937) 	if (rdev->sb_page) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  938) 		put_page(rdev->sb_page);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  939) 		rdev->sb_loaded = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  940) 		rdev->sb_page = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  941) 		rdev->sb_start = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  942) 		rdev->sectors = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  943) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  944) 	if (rdev->bb_page) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  945) 		put_page(rdev->bb_page);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  946) 		rdev->bb_page = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  947) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  948) 	badblocks_exit(&rdev->badblocks);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  949) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  950) EXPORT_SYMBOL_GPL(md_rdev_clear);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  951) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  952) static void super_written(struct bio *bio)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  953) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  954) 	struct md_rdev *rdev = bio->bi_private;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  955) 	struct mddev *mddev = rdev->mddev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  956) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  957) 	if (bio->bi_status) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  958) 		pr_err("md: %s gets error=%d\n", __func__,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  959) 		       blk_status_to_errno(bio->bi_status));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  960) 		md_error(mddev, rdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  961) 		if (!test_bit(Faulty, &rdev->flags)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  962) 		    && (bio->bi_opf & MD_FAILFAST)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  963) 			set_bit(MD_SB_NEED_REWRITE, &mddev->sb_flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  964) 			set_bit(LastDev, &rdev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  965) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  966) 	} else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  967) 		clear_bit(LastDev, &rdev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  968) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  969) 	if (atomic_dec_and_test(&mddev->pending_writes))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  970) 		wake_up(&mddev->sb_wait);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  971) 	rdev_dec_pending(rdev, mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  972) 	bio_put(bio);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  973) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  974) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  975) void md_super_write(struct mddev *mddev, struct md_rdev *rdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  976) 		   sector_t sector, int size, struct page *page)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  977) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  978) 	/* write first size bytes of page to sector of rdev
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  979) 	 * Increment mddev->pending_writes before returning
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  980) 	 * and decrement it on completion, waking up sb_wait
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  981) 	 * if zero is reached.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  982) 	 * If an error occurred, call md_error
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  983) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  984) 	struct bio *bio;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  985) 	int ff = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  986) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  987) 	if (!page)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  988) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  989) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  990) 	if (test_bit(Faulty, &rdev->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  991) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  992) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  993) 	bio = md_bio_alloc_sync(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  994) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  995) 	atomic_inc(&rdev->nr_pending);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  996) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  997) 	bio_set_dev(bio, rdev->meta_bdev ? rdev->meta_bdev : rdev->bdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  998) 	bio->bi_iter.bi_sector = sector;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  999) 	bio_add_page(bio, page, size, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1000) 	bio->bi_private = rdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1001) 	bio->bi_end_io = super_written;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1002) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1003) 	if (test_bit(MD_FAILFAST_SUPPORTED, &mddev->flags) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1004) 	    test_bit(FailFast, &rdev->flags) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1005) 	    !test_bit(LastDev, &rdev->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1006) 		ff = MD_FAILFAST;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1007) 	bio->bi_opf = REQ_OP_WRITE | REQ_SYNC | REQ_PREFLUSH | REQ_FUA | ff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1008) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1009) 	atomic_inc(&mddev->pending_writes);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1010) 	submit_bio(bio);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1011) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1012) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1013) int md_super_wait(struct mddev *mddev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1014) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1015) 	/* wait for all superblock writes that were scheduled to complete */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1016) 	wait_event(mddev->sb_wait, atomic_read(&mddev->pending_writes)==0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1017) 	if (test_and_clear_bit(MD_SB_NEED_REWRITE, &mddev->sb_flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1018) 		return -EAGAIN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1019) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1020) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1021) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1022) int sync_page_io(struct md_rdev *rdev, sector_t sector, int size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1023) 		 struct page *page, int op, int op_flags, bool metadata_op)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1024) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1025) 	struct bio *bio = md_bio_alloc_sync(rdev->mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1026) 	int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1027) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1028) 	if (metadata_op && rdev->meta_bdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1029) 		bio_set_dev(bio, rdev->meta_bdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1030) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1031) 		bio_set_dev(bio, rdev->bdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1032) 	bio_set_op_attrs(bio, op, op_flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1033) 	if (metadata_op)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1034) 		bio->bi_iter.bi_sector = sector + rdev->sb_start;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1035) 	else if (rdev->mddev->reshape_position != MaxSector &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1036) 		 (rdev->mddev->reshape_backwards ==
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1037) 		  (sector >= rdev->mddev->reshape_position)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1038) 		bio->bi_iter.bi_sector = sector + rdev->new_data_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1039) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1040) 		bio->bi_iter.bi_sector = sector + rdev->data_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1041) 	bio_add_page(bio, page, size, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1042) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1043) 	submit_bio_wait(bio);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1044) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1045) 	ret = !bio->bi_status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1046) 	bio_put(bio);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1047) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1048) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1049) EXPORT_SYMBOL_GPL(sync_page_io);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1050) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1051) static int read_disk_sb(struct md_rdev *rdev, int size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1052) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1053) 	char b[BDEVNAME_SIZE];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1054) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1055) 	if (rdev->sb_loaded)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1056) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1057) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1058) 	if (!sync_page_io(rdev, 0, size, rdev->sb_page, REQ_OP_READ, 0, true))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1059) 		goto fail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1060) 	rdev->sb_loaded = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1061) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1062) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1063) fail:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1064) 	pr_err("md: disabled device %s, could not read superblock.\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1065) 	       bdevname(rdev->bdev,b));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1066) 	return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1067) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1068) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1069) static int md_uuid_equal(mdp_super_t *sb1, mdp_super_t *sb2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1070) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1071) 	return	sb1->set_uuid0 == sb2->set_uuid0 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1072) 		sb1->set_uuid1 == sb2->set_uuid1 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1073) 		sb1->set_uuid2 == sb2->set_uuid2 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1074) 		sb1->set_uuid3 == sb2->set_uuid3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1075) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1076) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1077) static int md_sb_equal(mdp_super_t *sb1, mdp_super_t *sb2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1078) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1079) 	int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1080) 	mdp_super_t *tmp1, *tmp2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1081) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1082) 	tmp1 = kmalloc(sizeof(*tmp1),GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1083) 	tmp2 = kmalloc(sizeof(*tmp2),GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1084) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1085) 	if (!tmp1 || !tmp2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1086) 		ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1087) 		goto abort;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1088) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1089) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1090) 	*tmp1 = *sb1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1091) 	*tmp2 = *sb2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1092) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1093) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1094) 	 * nr_disks is not constant
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1095) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1096) 	tmp1->nr_disks = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1097) 	tmp2->nr_disks = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1098) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1099) 	ret = (memcmp(tmp1, tmp2, MD_SB_GENERIC_CONSTANT_WORDS * 4) == 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1100) abort:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1101) 	kfree(tmp1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1102) 	kfree(tmp2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1103) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1104) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1105) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1106) static u32 md_csum_fold(u32 csum)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1107) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1108) 	csum = (csum & 0xffff) + (csum >> 16);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1109) 	return (csum & 0xffff) + (csum >> 16);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1110) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1111) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1112) static unsigned int calc_sb_csum(mdp_super_t *sb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1113) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1114) 	u64 newcsum = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1115) 	u32 *sb32 = (u32*)sb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1116) 	int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1117) 	unsigned int disk_csum, csum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1118) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1119) 	disk_csum = sb->sb_csum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1120) 	sb->sb_csum = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1121) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1122) 	for (i = 0; i < MD_SB_BYTES/4 ; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1123) 		newcsum += sb32[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1124) 	csum = (newcsum & 0xffffffff) + (newcsum>>32);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1125) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1126) #ifdef CONFIG_ALPHA
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1127) 	/* This used to use csum_partial, which was wrong for several
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1128) 	 * reasons including that different results are returned on
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1129) 	 * different architectures.  It isn't critical that we get exactly
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1130) 	 * the same return value as before (we always csum_fold before
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1131) 	 * testing, and that removes any differences).  However as we
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1132) 	 * know that csum_partial always returned a 16bit value on
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1133) 	 * alphas, do a fold to maximise conformity to previous behaviour.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1134) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1135) 	sb->sb_csum = md_csum_fold(disk_csum);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1136) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1137) 	sb->sb_csum = disk_csum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1138) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1139) 	return csum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1140) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1141) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1142) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1143)  * Handle superblock details.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1144)  * We want to be able to handle multiple superblock formats
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1145)  * so we have a common interface to them all, and an array of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1146)  * different handlers.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1147)  * We rely on user-space to write the initial superblock, and support
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1148)  * reading and updating of superblocks.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1149)  * Interface methods are:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1150)  *   int load_super(struct md_rdev *dev, struct md_rdev *refdev, int minor_version)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1151)  *      loads and validates a superblock on dev.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1152)  *      if refdev != NULL, compare superblocks on both devices
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1153)  *    Return:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1154)  *      0 - dev has a superblock that is compatible with refdev
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1155)  *      1 - dev has a superblock that is compatible and newer than refdev
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1156)  *          so dev should be used as the refdev in future
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1157)  *     -EINVAL superblock incompatible or invalid
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1158)  *     -othererror e.g. -EIO
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1159)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1160)  *   int validate_super(struct mddev *mddev, struct md_rdev *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1161)  *      Verify that dev is acceptable into mddev.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1162)  *       The first time, mddev->raid_disks will be 0, and data from
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1163)  *       dev should be merged in.  Subsequent calls check that dev
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1164)  *       is new enough.  Return 0 or -EINVAL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1165)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1166)  *   void sync_super(struct mddev *mddev, struct md_rdev *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1167)  *     Update the superblock for rdev with data in mddev
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1168)  *     This does not write to disc.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1169)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1170)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1171) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1172) struct super_type  {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1173) 	char		    *name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1174) 	struct module	    *owner;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1175) 	int		    (*load_super)(struct md_rdev *rdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1176) 					  struct md_rdev *refdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1177) 					  int minor_version);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1178) 	int		    (*validate_super)(struct mddev *mddev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1179) 					      struct md_rdev *rdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1180) 	void		    (*sync_super)(struct mddev *mddev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1181) 					  struct md_rdev *rdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1182) 	unsigned long long  (*rdev_size_change)(struct md_rdev *rdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1183) 						sector_t num_sectors);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1184) 	int		    (*allow_new_offset)(struct md_rdev *rdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1185) 						unsigned long long new_offset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1186) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1187) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1188) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1189)  * Check that the given mddev has no bitmap.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1190)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1191)  * This function is called from the run method of all personalities that do not
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1192)  * support bitmaps. It prints an error message and returns non-zero if mddev
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1193)  * has a bitmap. Otherwise, it returns 0.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1194)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1195)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1196) int md_check_no_bitmap(struct mddev *mddev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1197) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1198) 	if (!mddev->bitmap_info.file && !mddev->bitmap_info.offset)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1199) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1200) 	pr_warn("%s: bitmaps are not supported for %s\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1201) 		mdname(mddev), mddev->pers->name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1202) 	return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1203) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1204) EXPORT_SYMBOL(md_check_no_bitmap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1205) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1206) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1207)  * load_super for 0.90.0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1208)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1209) static int super_90_load(struct md_rdev *rdev, struct md_rdev *refdev, int minor_version)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1210) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1211) 	char b[BDEVNAME_SIZE], b2[BDEVNAME_SIZE];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1212) 	mdp_super_t *sb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1213) 	int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1214) 	bool spare_disk = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1215) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1216) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1217) 	 * Calculate the position of the superblock (512byte sectors),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1218) 	 * it's at the end of the disk.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1219) 	 *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1220) 	 * It also happens to be a multiple of 4Kb.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1221) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1222) 	rdev->sb_start = calc_dev_sboffset(rdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1223) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1224) 	ret = read_disk_sb(rdev, MD_SB_BYTES);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1225) 	if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1226) 		return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1227) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1228) 	ret = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1229) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1230) 	bdevname(rdev->bdev, b);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1231) 	sb = page_address(rdev->sb_page);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1232) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1233) 	if (sb->md_magic != MD_SB_MAGIC) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1234) 		pr_warn("md: invalid raid superblock magic on %s\n", b);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1235) 		goto abort;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1236) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1237) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1238) 	if (sb->major_version != 0 ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1239) 	    sb->minor_version < 90 ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1240) 	    sb->minor_version > 91) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1241) 		pr_warn("Bad version number %d.%d on %s\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1242) 			sb->major_version, sb->minor_version, b);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1243) 		goto abort;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1244) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1245) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1246) 	if (sb->raid_disks <= 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1247) 		goto abort;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1248) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1249) 	if (md_csum_fold(calc_sb_csum(sb)) != md_csum_fold(sb->sb_csum)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1250) 		pr_warn("md: invalid superblock checksum on %s\n", b);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1251) 		goto abort;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1252) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1253) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1254) 	rdev->preferred_minor = sb->md_minor;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1255) 	rdev->data_offset = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1256) 	rdev->new_data_offset = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1257) 	rdev->sb_size = MD_SB_BYTES;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1258) 	rdev->badblocks.shift = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1259) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1260) 	if (sb->level == LEVEL_MULTIPATH)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1261) 		rdev->desc_nr = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1262) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1263) 		rdev->desc_nr = sb->this_disk.number;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1264) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1265) 	/* not spare disk, or LEVEL_MULTIPATH */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1266) 	if (sb->level == LEVEL_MULTIPATH ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1267) 		(rdev->desc_nr >= 0 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1268) 		 rdev->desc_nr < MD_SB_DISKS &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1269) 		 sb->disks[rdev->desc_nr].state &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1270) 		 ((1<<MD_DISK_SYNC) | (1 << MD_DISK_ACTIVE))))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1271) 		spare_disk = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1272) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1273) 	if (!refdev) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1274) 		if (!spare_disk)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1275) 			ret = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1276) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1277) 			ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1278) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1279) 		__u64 ev1, ev2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1280) 		mdp_super_t *refsb = page_address(refdev->sb_page);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1281) 		if (!md_uuid_equal(refsb, sb)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1282) 			pr_warn("md: %s has different UUID to %s\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1283) 				b, bdevname(refdev->bdev,b2));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1284) 			goto abort;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1285) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1286) 		if (!md_sb_equal(refsb, sb)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1287) 			pr_warn("md: %s has same UUID but different superblock to %s\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1288) 				b, bdevname(refdev->bdev, b2));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1289) 			goto abort;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1290) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1291) 		ev1 = md_event(sb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1292) 		ev2 = md_event(refsb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1293) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1294) 		if (!spare_disk && ev1 > ev2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1295) 			ret = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1296) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1297) 			ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1298) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1299) 	rdev->sectors = rdev->sb_start;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1300) 	/* Limit to 4TB as metadata cannot record more than that.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1301) 	 * (not needed for Linear and RAID0 as metadata doesn't
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1302) 	 * record this size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1303) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1304) 	if ((u64)rdev->sectors >= (2ULL << 32) && sb->level >= 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1305) 		rdev->sectors = (sector_t)(2ULL << 32) - 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1306) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1307) 	if (rdev->sectors < ((sector_t)sb->size) * 2 && sb->level >= 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1308) 		/* "this cannot possibly happen" ... */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1309) 		ret = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1310) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1311)  abort:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1312) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1313) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1314) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1315) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1316)  * validate_super for 0.90.0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1317)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1318) static int super_90_validate(struct mddev *mddev, struct md_rdev *rdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1319) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1320) 	mdp_disk_t *desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1321) 	mdp_super_t *sb = page_address(rdev->sb_page);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1322) 	__u64 ev1 = md_event(sb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1323) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1324) 	rdev->raid_disk = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1325) 	clear_bit(Faulty, &rdev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1326) 	clear_bit(In_sync, &rdev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1327) 	clear_bit(Bitmap_sync, &rdev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1328) 	clear_bit(WriteMostly, &rdev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1329) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1330) 	if (mddev->raid_disks == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1331) 		mddev->major_version = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1332) 		mddev->minor_version = sb->minor_version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1333) 		mddev->patch_version = sb->patch_version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1334) 		mddev->external = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1335) 		mddev->chunk_sectors = sb->chunk_size >> 9;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1336) 		mddev->ctime = sb->ctime;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1337) 		mddev->utime = sb->utime;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1338) 		mddev->level = sb->level;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1339) 		mddev->clevel[0] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1340) 		mddev->layout = sb->layout;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1341) 		mddev->raid_disks = sb->raid_disks;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1342) 		mddev->dev_sectors = ((sector_t)sb->size) * 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1343) 		mddev->events = ev1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1344) 		mddev->bitmap_info.offset = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1345) 		mddev->bitmap_info.space = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1346) 		/* bitmap can use 60 K after the 4K superblocks */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1347) 		mddev->bitmap_info.default_offset = MD_SB_BYTES >> 9;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1348) 		mddev->bitmap_info.default_space = 64*2 - (MD_SB_BYTES >> 9);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1349) 		mddev->reshape_backwards = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1350) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1351) 		if (mddev->minor_version >= 91) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1352) 			mddev->reshape_position = sb->reshape_position;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1353) 			mddev->delta_disks = sb->delta_disks;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1354) 			mddev->new_level = sb->new_level;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1355) 			mddev->new_layout = sb->new_layout;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1356) 			mddev->new_chunk_sectors = sb->new_chunk >> 9;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1357) 			if (mddev->delta_disks < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1358) 				mddev->reshape_backwards = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1359) 		} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1360) 			mddev->reshape_position = MaxSector;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1361) 			mddev->delta_disks = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1362) 			mddev->new_level = mddev->level;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1363) 			mddev->new_layout = mddev->layout;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1364) 			mddev->new_chunk_sectors = mddev->chunk_sectors;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1365) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1366) 		if (mddev->level == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1367) 			mddev->layout = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1368) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1369) 		if (sb->state & (1<<MD_SB_CLEAN))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1370) 			mddev->recovery_cp = MaxSector;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1371) 		else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1372) 			if (sb->events_hi == sb->cp_events_hi &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1373) 				sb->events_lo == sb->cp_events_lo) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1374) 				mddev->recovery_cp = sb->recovery_cp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1375) 			} else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1376) 				mddev->recovery_cp = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1377) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1378) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1379) 		memcpy(mddev->uuid+0, &sb->set_uuid0, 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1380) 		memcpy(mddev->uuid+4, &sb->set_uuid1, 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1381) 		memcpy(mddev->uuid+8, &sb->set_uuid2, 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1382) 		memcpy(mddev->uuid+12,&sb->set_uuid3, 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1383) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1384) 		mddev->max_disks = MD_SB_DISKS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1385) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1386) 		if (sb->state & (1<<MD_SB_BITMAP_PRESENT) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1387) 		    mddev->bitmap_info.file == NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1388) 			mddev->bitmap_info.offset =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1389) 				mddev->bitmap_info.default_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1390) 			mddev->bitmap_info.space =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1391) 				mddev->bitmap_info.default_space;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1392) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1393) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1394) 	} else if (mddev->pers == NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1395) 		/* Insist on good event counter while assembling, except
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1396) 		 * for spares (which don't need an event count) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1397) 		++ev1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1398) 		if (sb->disks[rdev->desc_nr].state & (
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1399) 			    (1<<MD_DISK_SYNC) | (1 << MD_DISK_ACTIVE)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1400) 			if (ev1 < mddev->events)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1401) 				return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1402) 	} else if (mddev->bitmap) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1403) 		/* if adding to array with a bitmap, then we can accept an
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1404) 		 * older device ... but not too old.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1405) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1406) 		if (ev1 < mddev->bitmap->events_cleared)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1407) 			return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1408) 		if (ev1 < mddev->events)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1409) 			set_bit(Bitmap_sync, &rdev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1410) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1411) 		if (ev1 < mddev->events)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1412) 			/* just a hot-add of a new device, leave raid_disk at -1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1413) 			return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1414) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1415) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1416) 	if (mddev->level != LEVEL_MULTIPATH) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1417) 		desc = sb->disks + rdev->desc_nr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1418) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1419) 		if (desc->state & (1<<MD_DISK_FAULTY))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1420) 			set_bit(Faulty, &rdev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1421) 		else if (desc->state & (1<<MD_DISK_SYNC) /* &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1422) 			    desc->raid_disk < mddev->raid_disks */) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1423) 			set_bit(In_sync, &rdev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1424) 			rdev->raid_disk = desc->raid_disk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1425) 			rdev->saved_raid_disk = desc->raid_disk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1426) 		} else if (desc->state & (1<<MD_DISK_ACTIVE)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1427) 			/* active but not in sync implies recovery up to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1428) 			 * reshape position.  We don't know exactly where
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1429) 			 * that is, so set to zero for now */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1430) 			if (mddev->minor_version >= 91) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1431) 				rdev->recovery_offset = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1432) 				rdev->raid_disk = desc->raid_disk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1433) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1434) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1435) 		if (desc->state & (1<<MD_DISK_WRITEMOSTLY))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1436) 			set_bit(WriteMostly, &rdev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1437) 		if (desc->state & (1<<MD_DISK_FAILFAST))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1438) 			set_bit(FailFast, &rdev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1439) 	} else /* MULTIPATH are always insync */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1440) 		set_bit(In_sync, &rdev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1441) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1442) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1443) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1444) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1445)  * sync_super for 0.90.0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1446)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1447) static void super_90_sync(struct mddev *mddev, struct md_rdev *rdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1448) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1449) 	mdp_super_t *sb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1450) 	struct md_rdev *rdev2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1451) 	int next_spare = mddev->raid_disks;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1452) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1453) 	/* make rdev->sb match mddev data..
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1454) 	 *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1455) 	 * 1/ zero out disks
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1456) 	 * 2/ Add info for each disk, keeping track of highest desc_nr (next_spare);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1457) 	 * 3/ any empty disks < next_spare become removed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1458) 	 *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1459) 	 * disks[0] gets initialised to REMOVED because
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1460) 	 * we cannot be sure from other fields if it has
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1461) 	 * been initialised or not.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1462) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1463) 	int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1464) 	int active=0, working=0,failed=0,spare=0,nr_disks=0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1465) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1466) 	rdev->sb_size = MD_SB_BYTES;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1467) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1468) 	sb = page_address(rdev->sb_page);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1469) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1470) 	memset(sb, 0, sizeof(*sb));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1471) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1472) 	sb->md_magic = MD_SB_MAGIC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1473) 	sb->major_version = mddev->major_version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1474) 	sb->patch_version = mddev->patch_version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1475) 	sb->gvalid_words  = 0; /* ignored */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1476) 	memcpy(&sb->set_uuid0, mddev->uuid+0, 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1477) 	memcpy(&sb->set_uuid1, mddev->uuid+4, 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1478) 	memcpy(&sb->set_uuid2, mddev->uuid+8, 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1479) 	memcpy(&sb->set_uuid3, mddev->uuid+12,4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1480) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1481) 	sb->ctime = clamp_t(time64_t, mddev->ctime, 0, U32_MAX);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1482) 	sb->level = mddev->level;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1483) 	sb->size = mddev->dev_sectors / 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1484) 	sb->raid_disks = mddev->raid_disks;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1485) 	sb->md_minor = mddev->md_minor;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1486) 	sb->not_persistent = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1487) 	sb->utime = clamp_t(time64_t, mddev->utime, 0, U32_MAX);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1488) 	sb->state = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1489) 	sb->events_hi = (mddev->events>>32);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1490) 	sb->events_lo = (u32)mddev->events;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1491) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1492) 	if (mddev->reshape_position == MaxSector)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1493) 		sb->minor_version = 90;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1494) 	else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1495) 		sb->minor_version = 91;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1496) 		sb->reshape_position = mddev->reshape_position;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1497) 		sb->new_level = mddev->new_level;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1498) 		sb->delta_disks = mddev->delta_disks;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1499) 		sb->new_layout = mddev->new_layout;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1500) 		sb->new_chunk = mddev->new_chunk_sectors << 9;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1501) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1502) 	mddev->minor_version = sb->minor_version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1503) 	if (mddev->in_sync)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1504) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1505) 		sb->recovery_cp = mddev->recovery_cp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1506) 		sb->cp_events_hi = (mddev->events>>32);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1507) 		sb->cp_events_lo = (u32)mddev->events;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1508) 		if (mddev->recovery_cp == MaxSector)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1509) 			sb->state = (1<< MD_SB_CLEAN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1510) 	} else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1511) 		sb->recovery_cp = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1512) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1513) 	sb->layout = mddev->layout;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1514) 	sb->chunk_size = mddev->chunk_sectors << 9;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1515) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1516) 	if (mddev->bitmap && mddev->bitmap_info.file == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1517) 		sb->state |= (1<<MD_SB_BITMAP_PRESENT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1518) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1519) 	sb->disks[0].state = (1<<MD_DISK_REMOVED);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1520) 	rdev_for_each(rdev2, mddev) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1521) 		mdp_disk_t *d;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1522) 		int desc_nr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1523) 		int is_active = test_bit(In_sync, &rdev2->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1524) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1525) 		if (rdev2->raid_disk >= 0 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1526) 		    sb->minor_version >= 91)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1527) 			/* we have nowhere to store the recovery_offset,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1528) 			 * but if it is not below the reshape_position,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1529) 			 * we can piggy-back on that.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1530) 			 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1531) 			is_active = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1532) 		if (rdev2->raid_disk < 0 ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1533) 		    test_bit(Faulty, &rdev2->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1534) 			is_active = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1535) 		if (is_active)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1536) 			desc_nr = rdev2->raid_disk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1537) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1538) 			desc_nr = next_spare++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1539) 		rdev2->desc_nr = desc_nr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1540) 		d = &sb->disks[rdev2->desc_nr];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1541) 		nr_disks++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1542) 		d->number = rdev2->desc_nr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1543) 		d->major = MAJOR(rdev2->bdev->bd_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1544) 		d->minor = MINOR(rdev2->bdev->bd_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1545) 		if (is_active)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1546) 			d->raid_disk = rdev2->raid_disk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1547) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1548) 			d->raid_disk = rdev2->desc_nr; /* compatibility */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1549) 		if (test_bit(Faulty, &rdev2->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1550) 			d->state = (1<<MD_DISK_FAULTY);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1551) 		else if (is_active) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1552) 			d->state = (1<<MD_DISK_ACTIVE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1553) 			if (test_bit(In_sync, &rdev2->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1554) 				d->state |= (1<<MD_DISK_SYNC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1555) 			active++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1556) 			working++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1557) 		} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1558) 			d->state = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1559) 			spare++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1560) 			working++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1561) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1562) 		if (test_bit(WriteMostly, &rdev2->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1563) 			d->state |= (1<<MD_DISK_WRITEMOSTLY);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1564) 		if (test_bit(FailFast, &rdev2->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1565) 			d->state |= (1<<MD_DISK_FAILFAST);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1566) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1567) 	/* now set the "removed" and "faulty" bits on any missing devices */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1568) 	for (i=0 ; i < mddev->raid_disks ; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1569) 		mdp_disk_t *d = &sb->disks[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1570) 		if (d->state == 0 && d->number == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1571) 			d->number = i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1572) 			d->raid_disk = i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1573) 			d->state = (1<<MD_DISK_REMOVED);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1574) 			d->state |= (1<<MD_DISK_FAULTY);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1575) 			failed++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1576) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1577) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1578) 	sb->nr_disks = nr_disks;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1579) 	sb->active_disks = active;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1580) 	sb->working_disks = working;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1581) 	sb->failed_disks = failed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1582) 	sb->spare_disks = spare;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1583) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1584) 	sb->this_disk = sb->disks[rdev->desc_nr];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1585) 	sb->sb_csum = calc_sb_csum(sb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1586) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1587) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1588) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1589)  * rdev_size_change for 0.90.0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1590)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1591) static unsigned long long
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1592) super_90_rdev_size_change(struct md_rdev *rdev, sector_t num_sectors)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1593) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1594) 	if (num_sectors && num_sectors < rdev->mddev->dev_sectors)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1595) 		return 0; /* component must fit device */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1596) 	if (rdev->mddev->bitmap_info.offset)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1597) 		return 0; /* can't move bitmap */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1598) 	rdev->sb_start = calc_dev_sboffset(rdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1599) 	if (!num_sectors || num_sectors > rdev->sb_start)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1600) 		num_sectors = rdev->sb_start;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1601) 	/* Limit to 4TB as metadata cannot record more than that.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1602) 	 * 4TB == 2^32 KB, or 2*2^32 sectors.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1603) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1604) 	if ((u64)num_sectors >= (2ULL << 32) && rdev->mddev->level >= 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1605) 		num_sectors = (sector_t)(2ULL << 32) - 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1606) 	do {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1607) 		md_super_write(rdev->mddev, rdev, rdev->sb_start, rdev->sb_size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1608) 		       rdev->sb_page);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1609) 	} while (md_super_wait(rdev->mddev) < 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1610) 	return num_sectors;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1611) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1612) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1613) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1614) super_90_allow_new_offset(struct md_rdev *rdev, unsigned long long new_offset)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1615) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1616) 	/* non-zero offset changes not possible with v0.90 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1617) 	return new_offset == 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1618) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1619) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1620) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1621)  * version 1 superblock
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1622)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1623) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1624) static __le32 calc_sb_1_csum(struct mdp_superblock_1 *sb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1625) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1626) 	__le32 disk_csum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1627) 	u32 csum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1628) 	unsigned long long newcsum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1629) 	int size = 256 + le32_to_cpu(sb->max_dev)*2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1630) 	__le32 *isuper = (__le32*)sb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1631) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1632) 	disk_csum = sb->sb_csum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1633) 	sb->sb_csum = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1634) 	newcsum = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1635) 	for (; size >= 4; size -= 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1636) 		newcsum += le32_to_cpu(*isuper++);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1637) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1638) 	if (size == 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1639) 		newcsum += le16_to_cpu(*(__le16*) isuper);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1640) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1641) 	csum = (newcsum & 0xffffffff) + (newcsum >> 32);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1642) 	sb->sb_csum = disk_csum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1643) 	return cpu_to_le32(csum);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1644) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1645) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1646) static int super_1_load(struct md_rdev *rdev, struct md_rdev *refdev, int minor_version)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1647) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1648) 	struct mdp_superblock_1 *sb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1649) 	int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1650) 	sector_t sb_start;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1651) 	sector_t sectors;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1652) 	char b[BDEVNAME_SIZE], b2[BDEVNAME_SIZE];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1653) 	int bmask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1654) 	bool spare_disk = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1655) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1656) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1657) 	 * Calculate the position of the superblock in 512byte sectors.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1658) 	 * It is always aligned to a 4K boundary and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1659) 	 * depeding on minor_version, it can be:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1660) 	 * 0: At least 8K, but less than 12K, from end of device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1661) 	 * 1: At start of device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1662) 	 * 2: 4K from start of device.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1663) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1664) 	switch(minor_version) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1665) 	case 0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1666) 		sb_start = i_size_read(rdev->bdev->bd_inode) >> 9;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1667) 		sb_start -= 8*2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1668) 		sb_start &= ~(sector_t)(4*2-1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1669) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1670) 	case 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1671) 		sb_start = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1672) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1673) 	case 2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1674) 		sb_start = 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1675) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1676) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1677) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1678) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1679) 	rdev->sb_start = sb_start;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1680) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1681) 	/* superblock is rarely larger than 1K, but it can be larger,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1682) 	 * and it is safe to read 4k, so we do that
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1683) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1684) 	ret = read_disk_sb(rdev, 4096);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1685) 	if (ret) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1686) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1687) 	sb = page_address(rdev->sb_page);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1688) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1689) 	if (sb->magic != cpu_to_le32(MD_SB_MAGIC) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1690) 	    sb->major_version != cpu_to_le32(1) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1691) 	    le32_to_cpu(sb->max_dev) > (4096-256)/2 ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1692) 	    le64_to_cpu(sb->super_offset) != rdev->sb_start ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1693) 	    (le32_to_cpu(sb->feature_map) & ~MD_FEATURE_ALL) != 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1694) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1695) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1696) 	if (calc_sb_1_csum(sb) != sb->sb_csum) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1697) 		pr_warn("md: invalid superblock checksum on %s\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1698) 			bdevname(rdev->bdev,b));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1699) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1700) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1701) 	if (le64_to_cpu(sb->data_size) < 10) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1702) 		pr_warn("md: data_size too small on %s\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1703) 			bdevname(rdev->bdev,b));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1704) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1705) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1706) 	if (sb->pad0 ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1707) 	    sb->pad3[0] ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1708) 	    memcmp(sb->pad3, sb->pad3+1, sizeof(sb->pad3) - sizeof(sb->pad3[1])))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1709) 		/* Some padding is non-zero, might be a new feature */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1710) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1711) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1712) 	rdev->preferred_minor = 0xffff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1713) 	rdev->data_offset = le64_to_cpu(sb->data_offset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1714) 	rdev->new_data_offset = rdev->data_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1715) 	if ((le32_to_cpu(sb->feature_map) & MD_FEATURE_RESHAPE_ACTIVE) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1716) 	    (le32_to_cpu(sb->feature_map) & MD_FEATURE_NEW_OFFSET))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1717) 		rdev->new_data_offset += (s32)le32_to_cpu(sb->new_offset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1718) 	atomic_set(&rdev->corrected_errors, le32_to_cpu(sb->cnt_corrected_read));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1719) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1720) 	rdev->sb_size = le32_to_cpu(sb->max_dev) * 2 + 256;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1721) 	bmask = queue_logical_block_size(rdev->bdev->bd_disk->queue)-1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1722) 	if (rdev->sb_size & bmask)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1723) 		rdev->sb_size = (rdev->sb_size | bmask) + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1724) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1725) 	if (minor_version
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1726) 	    && rdev->data_offset < sb_start + (rdev->sb_size/512))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1727) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1728) 	if (minor_version
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1729) 	    && rdev->new_data_offset < sb_start + (rdev->sb_size/512))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1730) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1731) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1732) 	if (sb->level == cpu_to_le32(LEVEL_MULTIPATH))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1733) 		rdev->desc_nr = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1734) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1735) 		rdev->desc_nr = le32_to_cpu(sb->dev_number);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1736) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1737) 	if (!rdev->bb_page) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1738) 		rdev->bb_page = alloc_page(GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1739) 		if (!rdev->bb_page)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1740) 			return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1741) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1742) 	if ((le32_to_cpu(sb->feature_map) & MD_FEATURE_BAD_BLOCKS) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1743) 	    rdev->badblocks.count == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1744) 		/* need to load the bad block list.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1745) 		 * Currently we limit it to one page.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1746) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1747) 		s32 offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1748) 		sector_t bb_sector;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1749) 		__le64 *bbp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1750) 		int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1751) 		int sectors = le16_to_cpu(sb->bblog_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1752) 		if (sectors > (PAGE_SIZE / 512))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1753) 			return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1754) 		offset = le32_to_cpu(sb->bblog_offset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1755) 		if (offset == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1756) 			return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1757) 		bb_sector = (long long)offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1758) 		if (!sync_page_io(rdev, bb_sector, sectors << 9,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1759) 				  rdev->bb_page, REQ_OP_READ, 0, true))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1760) 			return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1761) 		bbp = (__le64 *)page_address(rdev->bb_page);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1762) 		rdev->badblocks.shift = sb->bblog_shift;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1763) 		for (i = 0 ; i < (sectors << (9-3)) ; i++, bbp++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1764) 			u64 bb = le64_to_cpu(*bbp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1765) 			int count = bb & (0x3ff);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1766) 			u64 sector = bb >> 10;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1767) 			sector <<= sb->bblog_shift;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1768) 			count <<= sb->bblog_shift;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1769) 			if (bb + 1 == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1770) 				break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1771) 			if (badblocks_set(&rdev->badblocks, sector, count, 1))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1772) 				return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1773) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1774) 	} else if (sb->bblog_offset != 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1775) 		rdev->badblocks.shift = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1776) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1777) 	if ((le32_to_cpu(sb->feature_map) &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1778) 	    (MD_FEATURE_PPL | MD_FEATURE_MULTIPLE_PPLS))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1779) 		rdev->ppl.offset = (__s16)le16_to_cpu(sb->ppl.offset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1780) 		rdev->ppl.size = le16_to_cpu(sb->ppl.size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1781) 		rdev->ppl.sector = rdev->sb_start + rdev->ppl.offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1782) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1783) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1784) 	if ((le32_to_cpu(sb->feature_map) & MD_FEATURE_RAID0_LAYOUT) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1785) 	    sb->level != 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1786) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1787) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1788) 	/* not spare disk, or LEVEL_MULTIPATH */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1789) 	if (sb->level == cpu_to_le32(LEVEL_MULTIPATH) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1790) 		(rdev->desc_nr >= 0 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1791) 		rdev->desc_nr < le32_to_cpu(sb->max_dev) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1792) 		(le16_to_cpu(sb->dev_roles[rdev->desc_nr]) < MD_DISK_ROLE_MAX ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1793) 		 le16_to_cpu(sb->dev_roles[rdev->desc_nr]) == MD_DISK_ROLE_JOURNAL)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1794) 		spare_disk = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1795) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1796) 	if (!refdev) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1797) 		if (!spare_disk)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1798) 			ret = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1799) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1800) 			ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1801) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1802) 		__u64 ev1, ev2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1803) 		struct mdp_superblock_1 *refsb = page_address(refdev->sb_page);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1804) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1805) 		if (memcmp(sb->set_uuid, refsb->set_uuid, 16) != 0 ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1806) 		    sb->level != refsb->level ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1807) 		    sb->layout != refsb->layout ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1808) 		    sb->chunksize != refsb->chunksize) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1809) 			pr_warn("md: %s has strangely different superblock to %s\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1810) 				bdevname(rdev->bdev,b),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1811) 				bdevname(refdev->bdev,b2));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1812) 			return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1813) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1814) 		ev1 = le64_to_cpu(sb->events);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1815) 		ev2 = le64_to_cpu(refsb->events);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1816) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1817) 		if (!spare_disk && ev1 > ev2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1818) 			ret = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1819) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1820) 			ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1821) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1822) 	if (minor_version) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1823) 		sectors = (i_size_read(rdev->bdev->bd_inode) >> 9);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1824) 		sectors -= rdev->data_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1825) 	} else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1826) 		sectors = rdev->sb_start;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1827) 	if (sectors < le64_to_cpu(sb->data_size))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1828) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1829) 	rdev->sectors = le64_to_cpu(sb->data_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1830) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1831) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1832) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1833) static int super_1_validate(struct mddev *mddev, struct md_rdev *rdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1834) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1835) 	struct mdp_superblock_1 *sb = page_address(rdev->sb_page);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1836) 	__u64 ev1 = le64_to_cpu(sb->events);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1837) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1838) 	rdev->raid_disk = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1839) 	clear_bit(Faulty, &rdev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1840) 	clear_bit(In_sync, &rdev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1841) 	clear_bit(Bitmap_sync, &rdev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1842) 	clear_bit(WriteMostly, &rdev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1843) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1844) 	if (mddev->raid_disks == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1845) 		mddev->major_version = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1846) 		mddev->patch_version = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1847) 		mddev->external = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1848) 		mddev->chunk_sectors = le32_to_cpu(sb->chunksize);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1849) 		mddev->ctime = le64_to_cpu(sb->ctime);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1850) 		mddev->utime = le64_to_cpu(sb->utime);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1851) 		mddev->level = le32_to_cpu(sb->level);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1852) 		mddev->clevel[0] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1853) 		mddev->layout = le32_to_cpu(sb->layout);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1854) 		mddev->raid_disks = le32_to_cpu(sb->raid_disks);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1855) 		mddev->dev_sectors = le64_to_cpu(sb->size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1856) 		mddev->events = ev1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1857) 		mddev->bitmap_info.offset = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1858) 		mddev->bitmap_info.space = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1859) 		/* Default location for bitmap is 1K after superblock
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1860) 		 * using 3K - total of 4K
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1861) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1862) 		mddev->bitmap_info.default_offset = 1024 >> 9;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1863) 		mddev->bitmap_info.default_space = (4096-1024) >> 9;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1864) 		mddev->reshape_backwards = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1865) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1866) 		mddev->recovery_cp = le64_to_cpu(sb->resync_offset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1867) 		memcpy(mddev->uuid, sb->set_uuid, 16);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1868) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1869) 		mddev->max_disks =  (4096-256)/2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1870) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1871) 		if ((le32_to_cpu(sb->feature_map) & MD_FEATURE_BITMAP_OFFSET) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1872) 		    mddev->bitmap_info.file == NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1873) 			mddev->bitmap_info.offset =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1874) 				(__s32)le32_to_cpu(sb->bitmap_offset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1875) 			/* Metadata doesn't record how much space is available.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1876) 			 * For 1.0, we assume we can use up to the superblock
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1877) 			 * if before, else to 4K beyond superblock.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1878) 			 * For others, assume no change is possible.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1879) 			 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1880) 			if (mddev->minor_version > 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1881) 				mddev->bitmap_info.space = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1882) 			else if (mddev->bitmap_info.offset > 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1883) 				mddev->bitmap_info.space =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1884) 					8 - mddev->bitmap_info.offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1885) 			else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1886) 				mddev->bitmap_info.space =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1887) 					-mddev->bitmap_info.offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1888) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1889) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1890) 		if ((le32_to_cpu(sb->feature_map) & MD_FEATURE_RESHAPE_ACTIVE)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1891) 			mddev->reshape_position = le64_to_cpu(sb->reshape_position);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1892) 			mddev->delta_disks = le32_to_cpu(sb->delta_disks);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1893) 			mddev->new_level = le32_to_cpu(sb->new_level);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1894) 			mddev->new_layout = le32_to_cpu(sb->new_layout);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1895) 			mddev->new_chunk_sectors = le32_to_cpu(sb->new_chunk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1896) 			if (mddev->delta_disks < 0 ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1897) 			    (mddev->delta_disks == 0 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1898) 			     (le32_to_cpu(sb->feature_map)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1899) 			      & MD_FEATURE_RESHAPE_BACKWARDS)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1900) 				mddev->reshape_backwards = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1901) 		} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1902) 			mddev->reshape_position = MaxSector;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1903) 			mddev->delta_disks = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1904) 			mddev->new_level = mddev->level;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1905) 			mddev->new_layout = mddev->layout;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1906) 			mddev->new_chunk_sectors = mddev->chunk_sectors;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1907) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1908) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1909) 		if (mddev->level == 0 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1910) 		    !(le32_to_cpu(sb->feature_map) & MD_FEATURE_RAID0_LAYOUT))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1911) 			mddev->layout = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1912) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1913) 		if (le32_to_cpu(sb->feature_map) & MD_FEATURE_JOURNAL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1914) 			set_bit(MD_HAS_JOURNAL, &mddev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1915) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1916) 		if (le32_to_cpu(sb->feature_map) &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1917) 		    (MD_FEATURE_PPL | MD_FEATURE_MULTIPLE_PPLS)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1918) 			if (le32_to_cpu(sb->feature_map) &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1919) 			    (MD_FEATURE_BITMAP_OFFSET | MD_FEATURE_JOURNAL))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1920) 				return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1921) 			if ((le32_to_cpu(sb->feature_map) & MD_FEATURE_PPL) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1922) 			    (le32_to_cpu(sb->feature_map) &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1923) 					    MD_FEATURE_MULTIPLE_PPLS))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1924) 				return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1925) 			set_bit(MD_HAS_PPL, &mddev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1926) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1927) 	} else if (mddev->pers == NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1928) 		/* Insist of good event counter while assembling, except for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1929) 		 * spares (which don't need an event count) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1930) 		++ev1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1931) 		if (rdev->desc_nr >= 0 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1932) 		    rdev->desc_nr < le32_to_cpu(sb->max_dev) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1933) 		    (le16_to_cpu(sb->dev_roles[rdev->desc_nr]) < MD_DISK_ROLE_MAX ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1934) 		     le16_to_cpu(sb->dev_roles[rdev->desc_nr]) == MD_DISK_ROLE_JOURNAL))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1935) 			if (ev1 < mddev->events)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1936) 				return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1937) 	} else if (mddev->bitmap) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1938) 		/* If adding to array with a bitmap, then we can accept an
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1939) 		 * older device, but not too old.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1940) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1941) 		if (ev1 < mddev->bitmap->events_cleared)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1942) 			return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1943) 		if (ev1 < mddev->events)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1944) 			set_bit(Bitmap_sync, &rdev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1945) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1946) 		if (ev1 < mddev->events)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1947) 			/* just a hot-add of a new device, leave raid_disk at -1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1948) 			return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1949) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1950) 	if (mddev->level != LEVEL_MULTIPATH) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1951) 		int role;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1952) 		if (rdev->desc_nr < 0 ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1953) 		    rdev->desc_nr >= le32_to_cpu(sb->max_dev)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1954) 			role = MD_DISK_ROLE_SPARE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1955) 			rdev->desc_nr = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1956) 		} else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1957) 			role = le16_to_cpu(sb->dev_roles[rdev->desc_nr]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1958) 		switch(role) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1959) 		case MD_DISK_ROLE_SPARE: /* spare */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1960) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1961) 		case MD_DISK_ROLE_FAULTY: /* faulty */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1962) 			set_bit(Faulty, &rdev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1963) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1964) 		case MD_DISK_ROLE_JOURNAL: /* journal device */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1965) 			if (!(le32_to_cpu(sb->feature_map) & MD_FEATURE_JOURNAL)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1966) 				/* journal device without journal feature */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1967) 				pr_warn("md: journal device provided without journal feature, ignoring the device\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1968) 				return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1969) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1970) 			set_bit(Journal, &rdev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1971) 			rdev->journal_tail = le64_to_cpu(sb->journal_tail);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1972) 			rdev->raid_disk = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1973) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1974) 		default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1975) 			rdev->saved_raid_disk = role;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1976) 			if ((le32_to_cpu(sb->feature_map) &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1977) 			     MD_FEATURE_RECOVERY_OFFSET)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1978) 				rdev->recovery_offset = le64_to_cpu(sb->recovery_offset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1979) 				if (!(le32_to_cpu(sb->feature_map) &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1980) 				      MD_FEATURE_RECOVERY_BITMAP))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1981) 					rdev->saved_raid_disk = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1982) 			} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1983) 				/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1984) 				 * If the array is FROZEN, then the device can't
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1985) 				 * be in_sync with rest of array.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1986) 				 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1987) 				if (!test_bit(MD_RECOVERY_FROZEN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1988) 					      &mddev->recovery))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1989) 					set_bit(In_sync, &rdev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1990) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1991) 			rdev->raid_disk = role;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1992) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1993) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1994) 		if (sb->devflags & WriteMostly1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1995) 			set_bit(WriteMostly, &rdev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1996) 		if (sb->devflags & FailFast1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1997) 			set_bit(FailFast, &rdev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1998) 		if (le32_to_cpu(sb->feature_map) & MD_FEATURE_REPLACEMENT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1999) 			set_bit(Replacement, &rdev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2000) 	} else /* MULTIPATH are always insync */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2001) 		set_bit(In_sync, &rdev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2002) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2003) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2004) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2005) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2006) static void super_1_sync(struct mddev *mddev, struct md_rdev *rdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2007) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2008) 	struct mdp_superblock_1 *sb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2009) 	struct md_rdev *rdev2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2010) 	int max_dev, i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2011) 	/* make rdev->sb match mddev and rdev data. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2012) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2013) 	sb = page_address(rdev->sb_page);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2014) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2015) 	sb->feature_map = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2016) 	sb->pad0 = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2017) 	sb->recovery_offset = cpu_to_le64(0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2018) 	memset(sb->pad3, 0, sizeof(sb->pad3));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2019) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2020) 	sb->utime = cpu_to_le64((__u64)mddev->utime);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2021) 	sb->events = cpu_to_le64(mddev->events);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2022) 	if (mddev->in_sync)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2023) 		sb->resync_offset = cpu_to_le64(mddev->recovery_cp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2024) 	else if (test_bit(MD_JOURNAL_CLEAN, &mddev->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2025) 		sb->resync_offset = cpu_to_le64(MaxSector);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2026) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2027) 		sb->resync_offset = cpu_to_le64(0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2028) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2029) 	sb->cnt_corrected_read = cpu_to_le32(atomic_read(&rdev->corrected_errors));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2030) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2031) 	sb->raid_disks = cpu_to_le32(mddev->raid_disks);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2032) 	sb->size = cpu_to_le64(mddev->dev_sectors);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2033) 	sb->chunksize = cpu_to_le32(mddev->chunk_sectors);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2034) 	sb->level = cpu_to_le32(mddev->level);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2035) 	sb->layout = cpu_to_le32(mddev->layout);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2036) 	if (test_bit(FailFast, &rdev->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2037) 		sb->devflags |= FailFast1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2038) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2039) 		sb->devflags &= ~FailFast1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2040) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2041) 	if (test_bit(WriteMostly, &rdev->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2042) 		sb->devflags |= WriteMostly1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2043) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2044) 		sb->devflags &= ~WriteMostly1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2045) 	sb->data_offset = cpu_to_le64(rdev->data_offset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2046) 	sb->data_size = cpu_to_le64(rdev->sectors);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2047) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2048) 	if (mddev->bitmap && mddev->bitmap_info.file == NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2049) 		sb->bitmap_offset = cpu_to_le32((__u32)mddev->bitmap_info.offset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2050) 		sb->feature_map = cpu_to_le32(MD_FEATURE_BITMAP_OFFSET);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2051) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2052) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2053) 	if (rdev->raid_disk >= 0 && !test_bit(Journal, &rdev->flags) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2054) 	    !test_bit(In_sync, &rdev->flags)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2055) 		sb->feature_map |=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2056) 			cpu_to_le32(MD_FEATURE_RECOVERY_OFFSET);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2057) 		sb->recovery_offset =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2058) 			cpu_to_le64(rdev->recovery_offset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2059) 		if (rdev->saved_raid_disk >= 0 && mddev->bitmap)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2060) 			sb->feature_map |=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2061) 				cpu_to_le32(MD_FEATURE_RECOVERY_BITMAP);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2062) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2063) 	/* Note: recovery_offset and journal_tail share space  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2064) 	if (test_bit(Journal, &rdev->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2065) 		sb->journal_tail = cpu_to_le64(rdev->journal_tail);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2066) 	if (test_bit(Replacement, &rdev->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2067) 		sb->feature_map |=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2068) 			cpu_to_le32(MD_FEATURE_REPLACEMENT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2069) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2070) 	if (mddev->reshape_position != MaxSector) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2071) 		sb->feature_map |= cpu_to_le32(MD_FEATURE_RESHAPE_ACTIVE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2072) 		sb->reshape_position = cpu_to_le64(mddev->reshape_position);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2073) 		sb->new_layout = cpu_to_le32(mddev->new_layout);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2074) 		sb->delta_disks = cpu_to_le32(mddev->delta_disks);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2075) 		sb->new_level = cpu_to_le32(mddev->new_level);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2076) 		sb->new_chunk = cpu_to_le32(mddev->new_chunk_sectors);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2077) 		if (mddev->delta_disks == 0 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2078) 		    mddev->reshape_backwards)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2079) 			sb->feature_map
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2080) 				|= cpu_to_le32(MD_FEATURE_RESHAPE_BACKWARDS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2081) 		if (rdev->new_data_offset != rdev->data_offset) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2082) 			sb->feature_map
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2083) 				|= cpu_to_le32(MD_FEATURE_NEW_OFFSET);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2084) 			sb->new_offset = cpu_to_le32((__u32)(rdev->new_data_offset
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2085) 							     - rdev->data_offset));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2086) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2087) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2088) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2089) 	if (mddev_is_clustered(mddev))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2090) 		sb->feature_map |= cpu_to_le32(MD_FEATURE_CLUSTERED);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2091) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2092) 	if (rdev->badblocks.count == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2093) 		/* Nothing to do for bad blocks*/ ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2094) 	else if (sb->bblog_offset == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2095) 		/* Cannot record bad blocks on this device */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2096) 		md_error(mddev, rdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2097) 	else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2098) 		struct badblocks *bb = &rdev->badblocks;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2099) 		__le64 *bbp = (__le64 *)page_address(rdev->bb_page);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2100) 		u64 *p = bb->page;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2101) 		sb->feature_map |= cpu_to_le32(MD_FEATURE_BAD_BLOCKS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2102) 		if (bb->changed) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2103) 			unsigned seq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2104) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2105) retry:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2106) 			seq = read_seqbegin(&bb->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2107) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2108) 			memset(bbp, 0xff, PAGE_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2109) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2110) 			for (i = 0 ; i < bb->count ; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2111) 				u64 internal_bb = p[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2112) 				u64 store_bb = ((BB_OFFSET(internal_bb) << 10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2113) 						| BB_LEN(internal_bb));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2114) 				bbp[i] = cpu_to_le64(store_bb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2115) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2116) 			bb->changed = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2117) 			if (read_seqretry(&bb->lock, seq))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2118) 				goto retry;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2119) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2120) 			bb->sector = (rdev->sb_start +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2121) 				      (int)le32_to_cpu(sb->bblog_offset));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2122) 			bb->size = le16_to_cpu(sb->bblog_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2123) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2124) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2125) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2126) 	max_dev = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2127) 	rdev_for_each(rdev2, mddev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2128) 		if (rdev2->desc_nr+1 > max_dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2129) 			max_dev = rdev2->desc_nr+1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2130) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2131) 	if (max_dev > le32_to_cpu(sb->max_dev)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2132) 		int bmask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2133) 		sb->max_dev = cpu_to_le32(max_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2134) 		rdev->sb_size = max_dev * 2 + 256;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2135) 		bmask = queue_logical_block_size(rdev->bdev->bd_disk->queue)-1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2136) 		if (rdev->sb_size & bmask)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2137) 			rdev->sb_size = (rdev->sb_size | bmask) + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2138) 	} else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2139) 		max_dev = le32_to_cpu(sb->max_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2140) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2141) 	for (i=0; i<max_dev;i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2142) 		sb->dev_roles[i] = cpu_to_le16(MD_DISK_ROLE_SPARE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2143) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2144) 	if (test_bit(MD_HAS_JOURNAL, &mddev->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2145) 		sb->feature_map |= cpu_to_le32(MD_FEATURE_JOURNAL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2146) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2147) 	if (test_bit(MD_HAS_PPL, &mddev->flags)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2148) 		if (test_bit(MD_HAS_MULTIPLE_PPLS, &mddev->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2149) 			sb->feature_map |=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2150) 			    cpu_to_le32(MD_FEATURE_MULTIPLE_PPLS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2151) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2152) 			sb->feature_map |= cpu_to_le32(MD_FEATURE_PPL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2153) 		sb->ppl.offset = cpu_to_le16(rdev->ppl.offset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2154) 		sb->ppl.size = cpu_to_le16(rdev->ppl.size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2155) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2156) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2157) 	rdev_for_each(rdev2, mddev) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2158) 		i = rdev2->desc_nr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2159) 		if (test_bit(Faulty, &rdev2->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2160) 			sb->dev_roles[i] = cpu_to_le16(MD_DISK_ROLE_FAULTY);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2161) 		else if (test_bit(In_sync, &rdev2->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2162) 			sb->dev_roles[i] = cpu_to_le16(rdev2->raid_disk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2163) 		else if (test_bit(Journal, &rdev2->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2164) 			sb->dev_roles[i] = cpu_to_le16(MD_DISK_ROLE_JOURNAL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2165) 		else if (rdev2->raid_disk >= 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2166) 			sb->dev_roles[i] = cpu_to_le16(rdev2->raid_disk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2167) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2168) 			sb->dev_roles[i] = cpu_to_le16(MD_DISK_ROLE_SPARE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2169) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2170) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2171) 	sb->sb_csum = calc_sb_1_csum(sb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2172) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2173) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2174) static sector_t super_1_choose_bm_space(sector_t dev_size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2175) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2176) 	sector_t bm_space;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2177) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2178) 	/* if the device is bigger than 8Gig, save 64k for bitmap
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2179) 	 * usage, if bigger than 200Gig, save 128k
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2180) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2181) 	if (dev_size < 64*2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2182) 		bm_space = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2183) 	else if (dev_size - 64*2 >= 200*1024*1024*2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2184) 		bm_space = 128*2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2185) 	else if (dev_size - 4*2 > 8*1024*1024*2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2186) 		bm_space = 64*2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2187) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2188) 		bm_space = 4*2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2189) 	return bm_space;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2190) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2191) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2192) static unsigned long long
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2193) super_1_rdev_size_change(struct md_rdev *rdev, sector_t num_sectors)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2194) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2195) 	struct mdp_superblock_1 *sb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2196) 	sector_t max_sectors;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2197) 	if (num_sectors && num_sectors < rdev->mddev->dev_sectors)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2198) 		return 0; /* component must fit device */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2199) 	if (rdev->data_offset != rdev->new_data_offset)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2200) 		return 0; /* too confusing */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2201) 	if (rdev->sb_start < rdev->data_offset) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2202) 		/* minor versions 1 and 2; superblock before data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2203) 		max_sectors = i_size_read(rdev->bdev->bd_inode) >> 9;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2204) 		max_sectors -= rdev->data_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2205) 		if (!num_sectors || num_sectors > max_sectors)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2206) 			num_sectors = max_sectors;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2207) 	} else if (rdev->mddev->bitmap_info.offset) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2208) 		/* minor version 0 with bitmap we can't move */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2209) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2210) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2211) 		/* minor version 0; superblock after data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2212) 		sector_t sb_start, bm_space;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2213) 		sector_t dev_size = i_size_read(rdev->bdev->bd_inode) >> 9;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2214) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2215) 		/* 8K is for superblock */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2216) 		sb_start = dev_size - 8*2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2217) 		sb_start &= ~(sector_t)(4*2 - 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2218) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2219) 		bm_space = super_1_choose_bm_space(dev_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2220) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2221) 		/* Space that can be used to store date needs to decrease
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2222) 		 * superblock bitmap space and bad block space(4K)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2223) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2224) 		max_sectors = sb_start - bm_space - 4*2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2225) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2226) 		if (!num_sectors || num_sectors > max_sectors)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2227) 			num_sectors = max_sectors;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2228) 		rdev->sb_start = sb_start;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2229) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2230) 	sb = page_address(rdev->sb_page);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2231) 	sb->data_size = cpu_to_le64(num_sectors);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2232) 	sb->super_offset = cpu_to_le64(rdev->sb_start);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2233) 	sb->sb_csum = calc_sb_1_csum(sb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2234) 	do {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2235) 		md_super_write(rdev->mddev, rdev, rdev->sb_start, rdev->sb_size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2236) 			       rdev->sb_page);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2237) 	} while (md_super_wait(rdev->mddev) < 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2238) 	return num_sectors;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2239) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2240) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2241) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2242) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2243) super_1_allow_new_offset(struct md_rdev *rdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2244) 			 unsigned long long new_offset)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2245) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2246) 	/* All necessary checks on new >= old have been done */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2247) 	struct bitmap *bitmap;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2248) 	if (new_offset >= rdev->data_offset)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2249) 		return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2250) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2251) 	/* with 1.0 metadata, there is no metadata to tread on
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2252) 	 * so we can always move back */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2253) 	if (rdev->mddev->minor_version == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2254) 		return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2255) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2256) 	/* otherwise we must be sure not to step on
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2257) 	 * any metadata, so stay:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2258) 	 * 36K beyond start of superblock
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2259) 	 * beyond end of badblocks
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2260) 	 * beyond write-intent bitmap
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2261) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2262) 	if (rdev->sb_start + (32+4)*2 > new_offset)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2263) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2264) 	bitmap = rdev->mddev->bitmap;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2265) 	if (bitmap && !rdev->mddev->bitmap_info.file &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2266) 	    rdev->sb_start + rdev->mddev->bitmap_info.offset +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2267) 	    bitmap->storage.file_pages * (PAGE_SIZE>>9) > new_offset)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2268) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2269) 	if (rdev->badblocks.sector + rdev->badblocks.size > new_offset)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2270) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2271) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2272) 	return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2273) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2274) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2275) static struct super_type super_types[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2276) 	[0] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2277) 		.name	= "0.90.0",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2278) 		.owner	= THIS_MODULE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2279) 		.load_super	    = super_90_load,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2280) 		.validate_super	    = super_90_validate,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2281) 		.sync_super	    = super_90_sync,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2282) 		.rdev_size_change   = super_90_rdev_size_change,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2283) 		.allow_new_offset   = super_90_allow_new_offset,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2284) 	},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2285) 	[1] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2286) 		.name	= "md-1",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2287) 		.owner	= THIS_MODULE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2288) 		.load_super	    = super_1_load,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2289) 		.validate_super	    = super_1_validate,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2290) 		.sync_super	    = super_1_sync,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2291) 		.rdev_size_change   = super_1_rdev_size_change,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2292) 		.allow_new_offset   = super_1_allow_new_offset,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2293) 	},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2294) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2295) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2296) static void sync_super(struct mddev *mddev, struct md_rdev *rdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2297) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2298) 	if (mddev->sync_super) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2299) 		mddev->sync_super(mddev, rdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2300) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2301) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2302) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2303) 	BUG_ON(mddev->major_version >= ARRAY_SIZE(super_types));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2304) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2305) 	super_types[mddev->major_version].sync_super(mddev, rdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2306) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2307) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2308) static int match_mddev_units(struct mddev *mddev1, struct mddev *mddev2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2309) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2310) 	struct md_rdev *rdev, *rdev2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2311) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2312) 	rcu_read_lock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2313) 	rdev_for_each_rcu(rdev, mddev1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2314) 		if (test_bit(Faulty, &rdev->flags) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2315) 		    test_bit(Journal, &rdev->flags) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2316) 		    rdev->raid_disk == -1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2317) 			continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2318) 		rdev_for_each_rcu(rdev2, mddev2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2319) 			if (test_bit(Faulty, &rdev2->flags) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2320) 			    test_bit(Journal, &rdev2->flags) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2321) 			    rdev2->raid_disk == -1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2322) 				continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2323) 			if (rdev->bdev->bd_disk == rdev2->bdev->bd_disk) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2324) 				rcu_read_unlock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2325) 				return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2326) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2327) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2328) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2329) 	rcu_read_unlock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2330) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2331) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2332) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2333) static LIST_HEAD(pending_raid_disks);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2334) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2335) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2336)  * Try to register data integrity profile for an mddev
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2337)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2338)  * This is called when an array is started and after a disk has been kicked
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2339)  * from the array. It only succeeds if all working and active component devices
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2340)  * are integrity capable with matching profiles.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2341)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2342) int md_integrity_register(struct mddev *mddev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2343) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2344) 	struct md_rdev *rdev, *reference = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2345) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2346) 	if (list_empty(&mddev->disks))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2347) 		return 0; /* nothing to do */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2348) 	if (!mddev->gendisk || blk_get_integrity(mddev->gendisk))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2349) 		return 0; /* shouldn't register, or already is */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2350) 	rdev_for_each(rdev, mddev) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2351) 		/* skip spares and non-functional disks */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2352) 		if (test_bit(Faulty, &rdev->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2353) 			continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2354) 		if (rdev->raid_disk < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2355) 			continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2356) 		if (!reference) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2357) 			/* Use the first rdev as the reference */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2358) 			reference = rdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2359) 			continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2360) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2361) 		/* does this rdev's profile match the reference profile? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2362) 		if (blk_integrity_compare(reference->bdev->bd_disk,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2363) 				rdev->bdev->bd_disk) < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2364) 			return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2365) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2366) 	if (!reference || !bdev_get_integrity(reference->bdev))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2367) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2368) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2369) 	 * All component devices are integrity capable and have matching
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2370) 	 * profiles, register the common profile for the md device.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2371) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2372) 	blk_integrity_register(mddev->gendisk,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2373) 			       bdev_get_integrity(reference->bdev));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2374) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2375) 	pr_debug("md: data integrity enabled on %s\n", mdname(mddev));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2376) 	if (bioset_integrity_create(&mddev->bio_set, BIO_POOL_SIZE)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2377) 		pr_err("md: failed to create integrity pool for %s\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2378) 		       mdname(mddev));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2379) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2380) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2381) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2382) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2383) EXPORT_SYMBOL(md_integrity_register);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2384) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2385) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2386)  * Attempt to add an rdev, but only if it is consistent with the current
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2387)  * integrity profile
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2388)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2389) int md_integrity_add_rdev(struct md_rdev *rdev, struct mddev *mddev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2390) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2391) 	struct blk_integrity *bi_mddev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2392) 	char name[BDEVNAME_SIZE];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2393) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2394) 	if (!mddev->gendisk)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2395) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2396) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2397) 	bi_mddev = blk_get_integrity(mddev->gendisk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2398) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2399) 	if (!bi_mddev) /* nothing to do */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2400) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2401) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2402) 	if (blk_integrity_compare(mddev->gendisk, rdev->bdev->bd_disk) != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2403) 		pr_err("%s: incompatible integrity profile for %s\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2404) 		       mdname(mddev), bdevname(rdev->bdev, name));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2405) 		return -ENXIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2406) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2407) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2408) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2409) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2410) EXPORT_SYMBOL(md_integrity_add_rdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2411) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2412) static int bind_rdev_to_array(struct md_rdev *rdev, struct mddev *mddev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2413) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2414) 	char b[BDEVNAME_SIZE];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2415) 	struct kobject *ko;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2416) 	int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2417) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2418) 	/* prevent duplicates */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2419) 	if (find_rdev(mddev, rdev->bdev->bd_dev))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2420) 		return -EEXIST;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2421) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2422) 	if ((bdev_read_only(rdev->bdev) || bdev_read_only(rdev->meta_bdev)) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2423) 	    mddev->pers)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2424) 		return -EROFS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2425) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2426) 	/* make sure rdev->sectors exceeds mddev->dev_sectors */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2427) 	if (!test_bit(Journal, &rdev->flags) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2428) 	    rdev->sectors &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2429) 	    (mddev->dev_sectors == 0 || rdev->sectors < mddev->dev_sectors)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2430) 		if (mddev->pers) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2431) 			/* Cannot change size, so fail
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2432) 			 * If mddev->level <= 0, then we don't care
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2433) 			 * about aligning sizes (e.g. linear)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2434) 			 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2435) 			if (mddev->level > 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2436) 				return -ENOSPC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2437) 		} else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2438) 			mddev->dev_sectors = rdev->sectors;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2439) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2440) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2441) 	/* Verify rdev->desc_nr is unique.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2442) 	 * If it is -1, assign a free number, else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2443) 	 * check number is not in use
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2444) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2445) 	rcu_read_lock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2446) 	if (rdev->desc_nr < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2447) 		int choice = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2448) 		if (mddev->pers)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2449) 			choice = mddev->raid_disks;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2450) 		while (md_find_rdev_nr_rcu(mddev, choice))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2451) 			choice++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2452) 		rdev->desc_nr = choice;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2453) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2454) 		if (md_find_rdev_nr_rcu(mddev, rdev->desc_nr)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2455) 			rcu_read_unlock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2456) 			return -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2457) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2458) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2459) 	rcu_read_unlock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2460) 	if (!test_bit(Journal, &rdev->flags) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2461) 	    mddev->max_disks && rdev->desc_nr >= mddev->max_disks) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2462) 		pr_warn("md: %s: array is limited to %d devices\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2463) 			mdname(mddev), mddev->max_disks);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2464) 		return -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2465) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2466) 	bdevname(rdev->bdev,b);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2467) 	strreplace(b, '/', '!');
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2468) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2469) 	rdev->mddev = mddev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2470) 	pr_debug("md: bind<%s>\n", b);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2471) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2472) 	if (mddev->raid_disks)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2473) 		mddev_create_serial_pool(mddev, rdev, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2474) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2475) 	if ((err = kobject_add(&rdev->kobj, &mddev->kobj, "dev-%s", b)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2476) 		goto fail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2477) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2478) 	ko = &part_to_dev(rdev->bdev->bd_part)->kobj;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2479) 	/* failure here is OK */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2480) 	err = sysfs_create_link(&rdev->kobj, ko, "block");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2481) 	rdev->sysfs_state = sysfs_get_dirent_safe(rdev->kobj.sd, "state");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2482) 	rdev->sysfs_unack_badblocks =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2483) 		sysfs_get_dirent_safe(rdev->kobj.sd, "unacknowledged_bad_blocks");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2484) 	rdev->sysfs_badblocks =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2485) 		sysfs_get_dirent_safe(rdev->kobj.sd, "bad_blocks");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2486) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2487) 	list_add_rcu(&rdev->same_set, &mddev->disks);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2488) 	bd_link_disk_holder(rdev->bdev, mddev->gendisk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2489) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2490) 	/* May as well allow recovery to be retried once */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2491) 	mddev->recovery_disabled++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2492) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2493) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2494) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2495)  fail:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2496) 	pr_warn("md: failed to register dev-%s for %s\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2497) 		b, mdname(mddev));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2498) 	return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2499) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2500) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2501) static void rdev_delayed_delete(struct work_struct *ws)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2502) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2503) 	struct md_rdev *rdev = container_of(ws, struct md_rdev, del_work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2504) 	kobject_del(&rdev->kobj);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2505) 	kobject_put(&rdev->kobj);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2506) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2507) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2508) static void unbind_rdev_from_array(struct md_rdev *rdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2509) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2510) 	char b[BDEVNAME_SIZE];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2511) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2512) 	bd_unlink_disk_holder(rdev->bdev, rdev->mddev->gendisk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2513) 	list_del_rcu(&rdev->same_set);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2514) 	pr_debug("md: unbind<%s>\n", bdevname(rdev->bdev,b));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2515) 	mddev_destroy_serial_pool(rdev->mddev, rdev, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2516) 	rdev->mddev = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2517) 	sysfs_remove_link(&rdev->kobj, "block");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2518) 	sysfs_put(rdev->sysfs_state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2519) 	sysfs_put(rdev->sysfs_unack_badblocks);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2520) 	sysfs_put(rdev->sysfs_badblocks);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2521) 	rdev->sysfs_state = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2522) 	rdev->sysfs_unack_badblocks = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2523) 	rdev->sysfs_badblocks = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2524) 	rdev->badblocks.count = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2525) 	/* We need to delay this, otherwise we can deadlock when
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2526) 	 * writing to 'remove' to "dev/state".  We also need
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2527) 	 * to delay it due to rcu usage.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2528) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2529) 	synchronize_rcu();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2530) 	INIT_WORK(&rdev->del_work, rdev_delayed_delete);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2531) 	kobject_get(&rdev->kobj);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2532) 	queue_work(md_rdev_misc_wq, &rdev->del_work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2533) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2534) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2535) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2536)  * prevent the device from being mounted, repartitioned or
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2537)  * otherwise reused by a RAID array (or any other kernel
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2538)  * subsystem), by bd_claiming the device.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2539)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2540) static int lock_rdev(struct md_rdev *rdev, dev_t dev, int shared)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2541) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2542) 	int err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2543) 	struct block_device *bdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2544) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2545) 	bdev = blkdev_get_by_dev(dev, FMODE_READ|FMODE_WRITE|FMODE_EXCL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2546) 				 shared ? (struct md_rdev *)lock_rdev : rdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2547) 	if (IS_ERR(bdev)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2548) 		pr_warn("md: could not open device unknown-block(%u,%u).\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2549) 			MAJOR(dev), MINOR(dev));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2550) 		return PTR_ERR(bdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2551) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2552) 	rdev->bdev = bdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2553) 	return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2554) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2555) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2556) static void unlock_rdev(struct md_rdev *rdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2557) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2558) 	struct block_device *bdev = rdev->bdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2559) 	rdev->bdev = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2560) 	blkdev_put(bdev, FMODE_READ|FMODE_WRITE|FMODE_EXCL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2561) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2562) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2563) void md_autodetect_dev(dev_t dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2564) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2565) static void export_rdev(struct md_rdev *rdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2566) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2567) 	char b[BDEVNAME_SIZE];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2568) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2569) 	pr_debug("md: export_rdev(%s)\n", bdevname(rdev->bdev,b));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2570) 	md_rdev_clear(rdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2571) #ifndef MODULE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2572) 	if (test_bit(AutoDetected, &rdev->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2573) 		md_autodetect_dev(rdev->bdev->bd_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2574) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2575) 	unlock_rdev(rdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2576) 	kobject_put(&rdev->kobj);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2577) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2578) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2579) void md_kick_rdev_from_array(struct md_rdev *rdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2580) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2581) 	unbind_rdev_from_array(rdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2582) 	export_rdev(rdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2583) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2584) EXPORT_SYMBOL_GPL(md_kick_rdev_from_array);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2585) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2586) static void export_array(struct mddev *mddev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2587) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2588) 	struct md_rdev *rdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2589) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2590) 	while (!list_empty(&mddev->disks)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2591) 		rdev = list_first_entry(&mddev->disks, struct md_rdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2592) 					same_set);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2593) 		md_kick_rdev_from_array(rdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2594) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2595) 	mddev->raid_disks = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2596) 	mddev->major_version = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2597) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2598) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2599) static bool set_in_sync(struct mddev *mddev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2600) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2601) 	lockdep_assert_held(&mddev->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2602) 	if (!mddev->in_sync) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2603) 		mddev->sync_checkers++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2604) 		spin_unlock(&mddev->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2605) 		percpu_ref_switch_to_atomic_sync(&mddev->writes_pending);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2606) 		spin_lock(&mddev->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2607) 		if (!mddev->in_sync &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2608) 		    percpu_ref_is_zero(&mddev->writes_pending)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2609) 			mddev->in_sync = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2610) 			/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2611) 			 * Ensure ->in_sync is visible before we clear
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2612) 			 * ->sync_checkers.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2613) 			 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2614) 			smp_mb();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2615) 			set_bit(MD_SB_CHANGE_CLEAN, &mddev->sb_flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2616) 			sysfs_notify_dirent_safe(mddev->sysfs_state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2617) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2618) 		if (--mddev->sync_checkers == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2619) 			percpu_ref_switch_to_percpu(&mddev->writes_pending);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2620) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2621) 	if (mddev->safemode == 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2622) 		mddev->safemode = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2623) 	return mddev->in_sync;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2624) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2625) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2626) static void sync_sbs(struct mddev *mddev, int nospares)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2627) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2628) 	/* Update each superblock (in-memory image), but
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2629) 	 * if we are allowed to, skip spares which already
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2630) 	 * have the right event counter, or have one earlier
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2631) 	 * (which would mean they aren't being marked as dirty
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2632) 	 * with the rest of the array)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2633) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2634) 	struct md_rdev *rdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2635) 	rdev_for_each(rdev, mddev) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2636) 		if (rdev->sb_events == mddev->events ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2637) 		    (nospares &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2638) 		     rdev->raid_disk < 0 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2639) 		     rdev->sb_events+1 == mddev->events)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2640) 			/* Don't update this superblock */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2641) 			rdev->sb_loaded = 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2642) 		} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2643) 			sync_super(mddev, rdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2644) 			rdev->sb_loaded = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2645) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2646) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2647) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2648) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2649) static bool does_sb_need_changing(struct mddev *mddev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2650) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2651) 	struct md_rdev *rdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2652) 	struct mdp_superblock_1 *sb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2653) 	int role;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2654) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2655) 	/* Find a good rdev */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2656) 	rdev_for_each(rdev, mddev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2657) 		if ((rdev->raid_disk >= 0) && !test_bit(Faulty, &rdev->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2658) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2659) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2660) 	/* No good device found. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2661) 	if (!rdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2662) 		return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2663) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2664) 	sb = page_address(rdev->sb_page);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2665) 	/* Check if a device has become faulty or a spare become active */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2666) 	rdev_for_each(rdev, mddev) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2667) 		role = le16_to_cpu(sb->dev_roles[rdev->desc_nr]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2668) 		/* Device activated? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2669) 		if (role == 0xffff && rdev->raid_disk >=0 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2670) 		    !test_bit(Faulty, &rdev->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2671) 			return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2672) 		/* Device turned faulty? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2673) 		if (test_bit(Faulty, &rdev->flags) && (role < 0xfffd))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2674) 			return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2675) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2676) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2677) 	/* Check if any mddev parameters have changed */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2678) 	if ((mddev->dev_sectors != le64_to_cpu(sb->size)) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2679) 	    (mddev->reshape_position != le64_to_cpu(sb->reshape_position)) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2680) 	    (mddev->layout != le32_to_cpu(sb->layout)) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2681) 	    (mddev->raid_disks != le32_to_cpu(sb->raid_disks)) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2682) 	    (mddev->chunk_sectors != le32_to_cpu(sb->chunksize)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2683) 		return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2684) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2685) 	return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2686) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2687) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2688) void md_update_sb(struct mddev *mddev, int force_change)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2689) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2690) 	struct md_rdev *rdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2691) 	int sync_req;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2692) 	int nospares = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2693) 	int any_badblocks_changed = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2694) 	int ret = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2695) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2696) 	if (mddev->ro) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2697) 		if (force_change)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2698) 			set_bit(MD_SB_CHANGE_DEVS, &mddev->sb_flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2699) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2700) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2701) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2702) repeat:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2703) 	if (mddev_is_clustered(mddev)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2704) 		if (test_and_clear_bit(MD_SB_CHANGE_DEVS, &mddev->sb_flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2705) 			force_change = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2706) 		if (test_and_clear_bit(MD_SB_CHANGE_CLEAN, &mddev->sb_flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2707) 			nospares = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2708) 		ret = md_cluster_ops->metadata_update_start(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2709) 		/* Has someone else has updated the sb */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2710) 		if (!does_sb_need_changing(mddev)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2711) 			if (ret == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2712) 				md_cluster_ops->metadata_update_cancel(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2713) 			bit_clear_unless(&mddev->sb_flags, BIT(MD_SB_CHANGE_PENDING),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2714) 							 BIT(MD_SB_CHANGE_DEVS) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2715) 							 BIT(MD_SB_CHANGE_CLEAN));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2716) 			return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2717) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2718) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2719) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2720) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2721) 	 * First make sure individual recovery_offsets are correct
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2722) 	 * curr_resync_completed can only be used during recovery.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2723) 	 * During reshape/resync it might use array-addresses rather
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2724) 	 * that device addresses.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2725) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2726) 	rdev_for_each(rdev, mddev) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2727) 		if (rdev->raid_disk >= 0 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2728) 		    mddev->delta_disks >= 0 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2729) 		    test_bit(MD_RECOVERY_RUNNING, &mddev->recovery) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2730) 		    test_bit(MD_RECOVERY_RECOVER, &mddev->recovery) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2731) 		    !test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2732) 		    !test_bit(Journal, &rdev->flags) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2733) 		    !test_bit(In_sync, &rdev->flags) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2734) 		    mddev->curr_resync_completed > rdev->recovery_offset)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2735) 				rdev->recovery_offset = mddev->curr_resync_completed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2736) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2737) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2738) 	if (!mddev->persistent) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2739) 		clear_bit(MD_SB_CHANGE_CLEAN, &mddev->sb_flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2740) 		clear_bit(MD_SB_CHANGE_DEVS, &mddev->sb_flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2741) 		if (!mddev->external) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2742) 			clear_bit(MD_SB_CHANGE_PENDING, &mddev->sb_flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2743) 			rdev_for_each(rdev, mddev) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2744) 				if (rdev->badblocks.changed) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2745) 					rdev->badblocks.changed = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2746) 					ack_all_badblocks(&rdev->badblocks);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2747) 					md_error(mddev, rdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2748) 				}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2749) 				clear_bit(Blocked, &rdev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2750) 				clear_bit(BlockedBadBlocks, &rdev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2751) 				wake_up(&rdev->blocked_wait);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2752) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2753) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2754) 		wake_up(&mddev->sb_wait);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2755) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2756) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2757) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2758) 	spin_lock(&mddev->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2759) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2760) 	mddev->utime = ktime_get_real_seconds();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2761) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2762) 	if (test_and_clear_bit(MD_SB_CHANGE_DEVS, &mddev->sb_flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2763) 		force_change = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2764) 	if (test_and_clear_bit(MD_SB_CHANGE_CLEAN, &mddev->sb_flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2765) 		/* just a clean<-> dirty transition, possibly leave spares alone,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2766) 		 * though if events isn't the right even/odd, we will have to do
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2767) 		 * spares after all
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2768) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2769) 		nospares = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2770) 	if (force_change)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2771) 		nospares = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2772) 	if (mddev->degraded)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2773) 		/* If the array is degraded, then skipping spares is both
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2774) 		 * dangerous and fairly pointless.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2775) 		 * Dangerous because a device that was removed from the array
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2776) 		 * might have a event_count that still looks up-to-date,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2777) 		 * so it can be re-added without a resync.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2778) 		 * Pointless because if there are any spares to skip,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2779) 		 * then a recovery will happen and soon that array won't
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2780) 		 * be degraded any more and the spare can go back to sleep then.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2781) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2782) 		nospares = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2783) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2784) 	sync_req = mddev->in_sync;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2785) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2786) 	/* If this is just a dirty<->clean transition, and the array is clean
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2787) 	 * and 'events' is odd, we can roll back to the previous clean state */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2788) 	if (nospares
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2789) 	    && (mddev->in_sync && mddev->recovery_cp == MaxSector)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2790) 	    && mddev->can_decrease_events
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2791) 	    && mddev->events != 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2792) 		mddev->events--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2793) 		mddev->can_decrease_events = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2794) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2795) 		/* otherwise we have to go forward and ... */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2796) 		mddev->events ++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2797) 		mddev->can_decrease_events = nospares;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2798) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2799) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2800) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2801) 	 * This 64-bit counter should never wrap.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2802) 	 * Either we are in around ~1 trillion A.C., assuming
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2803) 	 * 1 reboot per second, or we have a bug...
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2804) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2805) 	WARN_ON(mddev->events == 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2806) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2807) 	rdev_for_each(rdev, mddev) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2808) 		if (rdev->badblocks.changed)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2809) 			any_badblocks_changed++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2810) 		if (test_bit(Faulty, &rdev->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2811) 			set_bit(FaultRecorded, &rdev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2812) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2813) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2814) 	sync_sbs(mddev, nospares);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2815) 	spin_unlock(&mddev->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2816) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2817) 	pr_debug("md: updating %s RAID superblock on device (in sync %d)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2818) 		 mdname(mddev), mddev->in_sync);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2819) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2820) 	if (mddev->queue)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2821) 		blk_add_trace_msg(mddev->queue, "md md_update_sb");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2822) rewrite:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2823) 	md_bitmap_update_sb(mddev->bitmap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2824) 	rdev_for_each(rdev, mddev) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2825) 		char b[BDEVNAME_SIZE];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2826) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2827) 		if (rdev->sb_loaded != 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2828) 			continue; /* no noise on spare devices */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2829) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2830) 		if (!test_bit(Faulty, &rdev->flags)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2831) 			md_super_write(mddev,rdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2832) 				       rdev->sb_start, rdev->sb_size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2833) 				       rdev->sb_page);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2834) 			pr_debug("md: (write) %s's sb offset: %llu\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2835) 				 bdevname(rdev->bdev, b),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2836) 				 (unsigned long long)rdev->sb_start);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2837) 			rdev->sb_events = mddev->events;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2838) 			if (rdev->badblocks.size) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2839) 				md_super_write(mddev, rdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2840) 					       rdev->badblocks.sector,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2841) 					       rdev->badblocks.size << 9,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2842) 					       rdev->bb_page);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2843) 				rdev->badblocks.size = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2844) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2845) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2846) 		} else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2847) 			pr_debug("md: %s (skipping faulty)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2848) 				 bdevname(rdev->bdev, b));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2849) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2850) 		if (mddev->level == LEVEL_MULTIPATH)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2851) 			/* only need to write one superblock... */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2852) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2853) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2854) 	if (md_super_wait(mddev) < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2855) 		goto rewrite;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2856) 	/* if there was a failure, MD_SB_CHANGE_DEVS was set, and we re-write super */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2857) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2858) 	if (mddev_is_clustered(mddev) && ret == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2859) 		md_cluster_ops->metadata_update_finish(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2860) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2861) 	if (mddev->in_sync != sync_req ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2862) 	    !bit_clear_unless(&mddev->sb_flags, BIT(MD_SB_CHANGE_PENDING),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2863) 			       BIT(MD_SB_CHANGE_DEVS) | BIT(MD_SB_CHANGE_CLEAN)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2864) 		/* have to write it out again */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2865) 		goto repeat;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2866) 	wake_up(&mddev->sb_wait);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2867) 	if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2868) 		sysfs_notify_dirent_safe(mddev->sysfs_completed);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2869) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2870) 	rdev_for_each(rdev, mddev) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2871) 		if (test_and_clear_bit(FaultRecorded, &rdev->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2872) 			clear_bit(Blocked, &rdev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2873) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2874) 		if (any_badblocks_changed)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2875) 			ack_all_badblocks(&rdev->badblocks);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2876) 		clear_bit(BlockedBadBlocks, &rdev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2877) 		wake_up(&rdev->blocked_wait);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2878) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2879) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2880) EXPORT_SYMBOL(md_update_sb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2881) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2882) static int add_bound_rdev(struct md_rdev *rdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2883) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2884) 	struct mddev *mddev = rdev->mddev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2885) 	int err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2886) 	bool add_journal = test_bit(Journal, &rdev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2887) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2888) 	if (!mddev->pers->hot_remove_disk || add_journal) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2889) 		/* If there is hot_add_disk but no hot_remove_disk
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2890) 		 * then added disks for geometry changes,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2891) 		 * and should be added immediately.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2892) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2893) 		super_types[mddev->major_version].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2894) 			validate_super(mddev, rdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2895) 		if (add_journal)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2896) 			mddev_suspend(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2897) 		err = mddev->pers->hot_add_disk(mddev, rdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2898) 		if (add_journal)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2899) 			mddev_resume(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2900) 		if (err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2901) 			md_kick_rdev_from_array(rdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2902) 			return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2903) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2904) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2905) 	sysfs_notify_dirent_safe(rdev->sysfs_state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2906) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2907) 	set_bit(MD_SB_CHANGE_DEVS, &mddev->sb_flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2908) 	if (mddev->degraded)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2909) 		set_bit(MD_RECOVERY_RECOVER, &mddev->recovery);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2910) 	set_bit(MD_RECOVERY_NEEDED, &mddev->recovery);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2911) 	md_new_event(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2912) 	md_wakeup_thread(mddev->thread);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2913) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2914) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2915) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2916) /* words written to sysfs files may, or may not, be \n terminated.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2917)  * We want to accept with case. For this we use cmd_match.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2918)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2919) static int cmd_match(const char *cmd, const char *str)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2920) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2921) 	/* See if cmd, written into a sysfs file, matches
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2922) 	 * str.  They must either be the same, or cmd can
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2923) 	 * have a trailing newline
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2924) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2925) 	while (*cmd && *str && *cmd == *str) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2926) 		cmd++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2927) 		str++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2928) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2929) 	if (*cmd == '\n')
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2930) 		cmd++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2931) 	if (*str || *cmd)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2932) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2933) 	return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2934) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2935) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2936) struct rdev_sysfs_entry {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2937) 	struct attribute attr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2938) 	ssize_t (*show)(struct md_rdev *, char *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2939) 	ssize_t (*store)(struct md_rdev *, const char *, size_t);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2940) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2941) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2942) static ssize_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2943) state_show(struct md_rdev *rdev, char *page)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2944) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2945) 	char *sep = ",";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2946) 	size_t len = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2947) 	unsigned long flags = READ_ONCE(rdev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2948) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2949) 	if (test_bit(Faulty, &flags) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2950) 	    (!test_bit(ExternalBbl, &flags) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2951) 	    rdev->badblocks.unacked_exist))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2952) 		len += sprintf(page+len, "faulty%s", sep);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2953) 	if (test_bit(In_sync, &flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2954) 		len += sprintf(page+len, "in_sync%s", sep);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2955) 	if (test_bit(Journal, &flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2956) 		len += sprintf(page+len, "journal%s", sep);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2957) 	if (test_bit(WriteMostly, &flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2958) 		len += sprintf(page+len, "write_mostly%s", sep);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2959) 	if (test_bit(Blocked, &flags) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2960) 	    (rdev->badblocks.unacked_exist
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2961) 	     && !test_bit(Faulty, &flags)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2962) 		len += sprintf(page+len, "blocked%s", sep);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2963) 	if (!test_bit(Faulty, &flags) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2964) 	    !test_bit(Journal, &flags) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2965) 	    !test_bit(In_sync, &flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2966) 		len += sprintf(page+len, "spare%s", sep);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2967) 	if (test_bit(WriteErrorSeen, &flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2968) 		len += sprintf(page+len, "write_error%s", sep);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2969) 	if (test_bit(WantReplacement, &flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2970) 		len += sprintf(page+len, "want_replacement%s", sep);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2971) 	if (test_bit(Replacement, &flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2972) 		len += sprintf(page+len, "replacement%s", sep);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2973) 	if (test_bit(ExternalBbl, &flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2974) 		len += sprintf(page+len, "external_bbl%s", sep);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2975) 	if (test_bit(FailFast, &flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2976) 		len += sprintf(page+len, "failfast%s", sep);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2977) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2978) 	if (len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2979) 		len -= strlen(sep);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2980) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2981) 	return len+sprintf(page+len, "\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2982) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2983) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2984) static ssize_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2985) state_store(struct md_rdev *rdev, const char *buf, size_t len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2986) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2987) 	/* can write
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2988) 	 *  faulty  - simulates an error
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2989) 	 *  remove  - disconnects the device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2990) 	 *  writemostly - sets write_mostly
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2991) 	 *  -writemostly - clears write_mostly
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2992) 	 *  blocked - sets the Blocked flags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2993) 	 *  -blocked - clears the Blocked and possibly simulates an error
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2994) 	 *  insync - sets Insync providing device isn't active
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2995) 	 *  -insync - clear Insync for a device with a slot assigned,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2996) 	 *            so that it gets rebuilt based on bitmap
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2997) 	 *  write_error - sets WriteErrorSeen
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2998) 	 *  -write_error - clears WriteErrorSeen
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2999) 	 *  {,-}failfast - set/clear FailFast
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3000) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3001) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3002) 	struct mddev *mddev = rdev->mddev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3003) 	int err = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3004) 	bool need_update_sb = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3005) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3006) 	if (cmd_match(buf, "faulty") && rdev->mddev->pers) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3007) 		md_error(rdev->mddev, rdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3008) 		if (test_bit(Faulty, &rdev->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3009) 			err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3010) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3011) 			err = -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3012) 	} else if (cmd_match(buf, "remove")) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3013) 		if (rdev->mddev->pers) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3014) 			clear_bit(Blocked, &rdev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3015) 			remove_and_add_spares(rdev->mddev, rdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3016) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3017) 		if (rdev->raid_disk >= 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3018) 			err = -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3019) 		else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3020) 			err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3021) 			if (mddev_is_clustered(mddev))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3022) 				err = md_cluster_ops->remove_disk(mddev, rdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3023) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3024) 			if (err == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3025) 				md_kick_rdev_from_array(rdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3026) 				if (mddev->pers) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3027) 					set_bit(MD_SB_CHANGE_DEVS, &mddev->sb_flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3028) 					md_wakeup_thread(mddev->thread);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3029) 				}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3030) 				md_new_event(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3031) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3032) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3033) 	} else if (cmd_match(buf, "writemostly")) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3034) 		set_bit(WriteMostly, &rdev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3035) 		mddev_create_serial_pool(rdev->mddev, rdev, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3036) 		need_update_sb = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3037) 		err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3038) 	} else if (cmd_match(buf, "-writemostly")) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3039) 		mddev_destroy_serial_pool(rdev->mddev, rdev, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3040) 		clear_bit(WriteMostly, &rdev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3041) 		need_update_sb = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3042) 		err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3043) 	} else if (cmd_match(buf, "blocked")) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3044) 		set_bit(Blocked, &rdev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3045) 		err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3046) 	} else if (cmd_match(buf, "-blocked")) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3047) 		if (!test_bit(Faulty, &rdev->flags) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3048) 		    !test_bit(ExternalBbl, &rdev->flags) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3049) 		    rdev->badblocks.unacked_exist) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3050) 			/* metadata handler doesn't understand badblocks,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3051) 			 * so we need to fail the device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3052) 			 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3053) 			md_error(rdev->mddev, rdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3054) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3055) 		clear_bit(Blocked, &rdev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3056) 		clear_bit(BlockedBadBlocks, &rdev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3057) 		wake_up(&rdev->blocked_wait);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3058) 		set_bit(MD_RECOVERY_NEEDED, &rdev->mddev->recovery);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3059) 		md_wakeup_thread(rdev->mddev->thread);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3060) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3061) 		err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3062) 	} else if (cmd_match(buf, "insync") && rdev->raid_disk == -1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3063) 		set_bit(In_sync, &rdev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3064) 		err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3065) 	} else if (cmd_match(buf, "failfast")) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3066) 		set_bit(FailFast, &rdev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3067) 		need_update_sb = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3068) 		err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3069) 	} else if (cmd_match(buf, "-failfast")) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3070) 		clear_bit(FailFast, &rdev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3071) 		need_update_sb = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3072) 		err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3073) 	} else if (cmd_match(buf, "-insync") && rdev->raid_disk >= 0 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3074) 		   !test_bit(Journal, &rdev->flags)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3075) 		if (rdev->mddev->pers == NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3076) 			clear_bit(In_sync, &rdev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3077) 			rdev->saved_raid_disk = rdev->raid_disk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3078) 			rdev->raid_disk = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3079) 			err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3080) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3081) 	} else if (cmd_match(buf, "write_error")) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3082) 		set_bit(WriteErrorSeen, &rdev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3083) 		err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3084) 	} else if (cmd_match(buf, "-write_error")) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3085) 		clear_bit(WriteErrorSeen, &rdev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3086) 		err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3087) 	} else if (cmd_match(buf, "want_replacement")) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3088) 		/* Any non-spare device that is not a replacement can
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3089) 		 * become want_replacement at any time, but we then need to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3090) 		 * check if recovery is needed.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3091) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3092) 		if (rdev->raid_disk >= 0 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3093) 		    !test_bit(Journal, &rdev->flags) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3094) 		    !test_bit(Replacement, &rdev->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3095) 			set_bit(WantReplacement, &rdev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3096) 		set_bit(MD_RECOVERY_NEEDED, &rdev->mddev->recovery);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3097) 		md_wakeup_thread(rdev->mddev->thread);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3098) 		err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3099) 	} else if (cmd_match(buf, "-want_replacement")) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3100) 		/* Clearing 'want_replacement' is always allowed.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3101) 		 * Once replacements starts it is too late though.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3102) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3103) 		err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3104) 		clear_bit(WantReplacement, &rdev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3105) 	} else if (cmd_match(buf, "replacement")) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3106) 		/* Can only set a device as a replacement when array has not
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3107) 		 * yet been started.  Once running, replacement is automatic
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3108) 		 * from spares, or by assigning 'slot'.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3109) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3110) 		if (rdev->mddev->pers)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3111) 			err = -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3112) 		else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3113) 			set_bit(Replacement, &rdev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3114) 			err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3115) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3116) 	} else if (cmd_match(buf, "-replacement")) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3117) 		/* Similarly, can only clear Replacement before start */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3118) 		if (rdev->mddev->pers)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3119) 			err = -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3120) 		else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3121) 			clear_bit(Replacement, &rdev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3122) 			err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3123) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3124) 	} else if (cmd_match(buf, "re-add")) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3125) 		if (!rdev->mddev->pers)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3126) 			err = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3127) 		else if (test_bit(Faulty, &rdev->flags) && (rdev->raid_disk == -1) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3128) 				rdev->saved_raid_disk >= 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3129) 			/* clear_bit is performed _after_ all the devices
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3130) 			 * have their local Faulty bit cleared. If any writes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3131) 			 * happen in the meantime in the local node, they
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3132) 			 * will land in the local bitmap, which will be synced
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3133) 			 * by this node eventually
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3134) 			 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3135) 			if (!mddev_is_clustered(rdev->mddev) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3136) 			    (err = md_cluster_ops->gather_bitmaps(rdev)) == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3137) 				clear_bit(Faulty, &rdev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3138) 				err = add_bound_rdev(rdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3139) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3140) 		} else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3141) 			err = -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3142) 	} else if (cmd_match(buf, "external_bbl") && (rdev->mddev->external)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3143) 		set_bit(ExternalBbl, &rdev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3144) 		rdev->badblocks.shift = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3145) 		err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3146) 	} else if (cmd_match(buf, "-external_bbl") && (rdev->mddev->external)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3147) 		clear_bit(ExternalBbl, &rdev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3148) 		err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3149) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3150) 	if (need_update_sb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3151) 		md_update_sb(mddev, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3152) 	if (!err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3153) 		sysfs_notify_dirent_safe(rdev->sysfs_state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3154) 	return err ? err : len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3155) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3156) static struct rdev_sysfs_entry rdev_state =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3157) __ATTR_PREALLOC(state, S_IRUGO|S_IWUSR, state_show, state_store);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3158) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3159) static ssize_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3160) errors_show(struct md_rdev *rdev, char *page)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3161) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3162) 	return sprintf(page, "%d\n", atomic_read(&rdev->corrected_errors));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3163) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3164) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3165) static ssize_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3166) errors_store(struct md_rdev *rdev, const char *buf, size_t len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3167) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3168) 	unsigned int n;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3169) 	int rv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3170) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3171) 	rv = kstrtouint(buf, 10, &n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3172) 	if (rv < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3173) 		return rv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3174) 	atomic_set(&rdev->corrected_errors, n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3175) 	return len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3176) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3177) static struct rdev_sysfs_entry rdev_errors =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3178) __ATTR(errors, S_IRUGO|S_IWUSR, errors_show, errors_store);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3179) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3180) static ssize_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3181) slot_show(struct md_rdev *rdev, char *page)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3182) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3183) 	if (test_bit(Journal, &rdev->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3184) 		return sprintf(page, "journal\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3185) 	else if (rdev->raid_disk < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3186) 		return sprintf(page, "none\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3187) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3188) 		return sprintf(page, "%d\n", rdev->raid_disk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3189) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3190) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3191) static ssize_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3192) slot_store(struct md_rdev *rdev, const char *buf, size_t len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3193) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3194) 	int slot;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3195) 	int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3196) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3197) 	if (test_bit(Journal, &rdev->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3198) 		return -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3199) 	if (strncmp(buf, "none", 4)==0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3200) 		slot = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3201) 	else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3202) 		err = kstrtouint(buf, 10, (unsigned int *)&slot);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3203) 		if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3204) 			return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3205) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3206) 	if (rdev->mddev->pers && slot == -1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3207) 		/* Setting 'slot' on an active array requires also
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3208) 		 * updating the 'rd%d' link, and communicating
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3209) 		 * with the personality with ->hot_*_disk.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3210) 		 * For now we only support removing
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3211) 		 * failed/spare devices.  This normally happens automatically,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3212) 		 * but not when the metadata is externally managed.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3213) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3214) 		if (rdev->raid_disk == -1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3215) 			return -EEXIST;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3216) 		/* personality does all needed checks */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3217) 		if (rdev->mddev->pers->hot_remove_disk == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3218) 			return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3219) 		clear_bit(Blocked, &rdev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3220) 		remove_and_add_spares(rdev->mddev, rdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3221) 		if (rdev->raid_disk >= 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3222) 			return -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3223) 		set_bit(MD_RECOVERY_NEEDED, &rdev->mddev->recovery);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3224) 		md_wakeup_thread(rdev->mddev->thread);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3225) 	} else if (rdev->mddev->pers) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3226) 		/* Activating a spare .. or possibly reactivating
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3227) 		 * if we ever get bitmaps working here.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3228) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3229) 		int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3230) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3231) 		if (rdev->raid_disk != -1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3232) 			return -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3233) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3234) 		if (test_bit(MD_RECOVERY_RUNNING, &rdev->mddev->recovery))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3235) 			return -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3236) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3237) 		if (rdev->mddev->pers->hot_add_disk == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3238) 			return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3239) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3240) 		if (slot >= rdev->mddev->raid_disks &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3241) 		    slot >= rdev->mddev->raid_disks + rdev->mddev->delta_disks)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3242) 			return -ENOSPC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3243) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3244) 		rdev->raid_disk = slot;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3245) 		if (test_bit(In_sync, &rdev->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3246) 			rdev->saved_raid_disk = slot;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3247) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3248) 			rdev->saved_raid_disk = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3249) 		clear_bit(In_sync, &rdev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3250) 		clear_bit(Bitmap_sync, &rdev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3251) 		err = rdev->mddev->pers->hot_add_disk(rdev->mddev, rdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3252) 		if (err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3253) 			rdev->raid_disk = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3254) 			return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3255) 		} else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3256) 			sysfs_notify_dirent_safe(rdev->sysfs_state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3257) 		/* failure here is OK */;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3258) 		sysfs_link_rdev(rdev->mddev, rdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3259) 		/* don't wakeup anyone, leave that to userspace. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3260) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3261) 		if (slot >= rdev->mddev->raid_disks &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3262) 		    slot >= rdev->mddev->raid_disks + rdev->mddev->delta_disks)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3263) 			return -ENOSPC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3264) 		rdev->raid_disk = slot;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3265) 		/* assume it is working */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3266) 		clear_bit(Faulty, &rdev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3267) 		clear_bit(WriteMostly, &rdev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3268) 		set_bit(In_sync, &rdev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3269) 		sysfs_notify_dirent_safe(rdev->sysfs_state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3270) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3271) 	return len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3272) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3273) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3274) static struct rdev_sysfs_entry rdev_slot =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3275) __ATTR(slot, S_IRUGO|S_IWUSR, slot_show, slot_store);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3276) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3277) static ssize_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3278) offset_show(struct md_rdev *rdev, char *page)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3279) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3280) 	return sprintf(page, "%llu\n", (unsigned long long)rdev->data_offset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3281) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3282) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3283) static ssize_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3284) offset_store(struct md_rdev *rdev, const char *buf, size_t len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3285) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3286) 	unsigned long long offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3287) 	if (kstrtoull(buf, 10, &offset) < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3288) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3289) 	if (rdev->mddev->pers && rdev->raid_disk >= 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3290) 		return -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3291) 	if (rdev->sectors && rdev->mddev->external)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3292) 		/* Must set offset before size, so overlap checks
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3293) 		 * can be sane */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3294) 		return -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3295) 	rdev->data_offset = offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3296) 	rdev->new_data_offset = offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3297) 	return len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3298) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3299) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3300) static struct rdev_sysfs_entry rdev_offset =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3301) __ATTR(offset, S_IRUGO|S_IWUSR, offset_show, offset_store);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3302) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3303) static ssize_t new_offset_show(struct md_rdev *rdev, char *page)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3304) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3305) 	return sprintf(page, "%llu\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3306) 		       (unsigned long long)rdev->new_data_offset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3307) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3308) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3309) static ssize_t new_offset_store(struct md_rdev *rdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3310) 				const char *buf, size_t len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3311) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3312) 	unsigned long long new_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3313) 	struct mddev *mddev = rdev->mddev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3314) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3315) 	if (kstrtoull(buf, 10, &new_offset) < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3316) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3317) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3318) 	if (mddev->sync_thread ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3319) 	    test_bit(MD_RECOVERY_RUNNING,&mddev->recovery))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3320) 		return -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3321) 	if (new_offset == rdev->data_offset)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3322) 		/* reset is always permitted */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3323) 		;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3324) 	else if (new_offset > rdev->data_offset) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3325) 		/* must not push array size beyond rdev_sectors */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3326) 		if (new_offset - rdev->data_offset
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3327) 		    + mddev->dev_sectors > rdev->sectors)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3328) 				return -E2BIG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3329) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3330) 	/* Metadata worries about other space details. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3331) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3332) 	/* decreasing the offset is inconsistent with a backwards
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3333) 	 * reshape.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3334) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3335) 	if (new_offset < rdev->data_offset &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3336) 	    mddev->reshape_backwards)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3337) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3338) 	/* Increasing offset is inconsistent with forwards
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3339) 	 * reshape.  reshape_direction should be set to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3340) 	 * 'backwards' first.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3341) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3342) 	if (new_offset > rdev->data_offset &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3343) 	    !mddev->reshape_backwards)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3344) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3345) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3346) 	if (mddev->pers && mddev->persistent &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3347) 	    !super_types[mddev->major_version]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3348) 	    .allow_new_offset(rdev, new_offset))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3349) 		return -E2BIG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3350) 	rdev->new_data_offset = new_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3351) 	if (new_offset > rdev->data_offset)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3352) 		mddev->reshape_backwards = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3353) 	else if (new_offset < rdev->data_offset)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3354) 		mddev->reshape_backwards = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3355) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3356) 	return len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3357) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3358) static struct rdev_sysfs_entry rdev_new_offset =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3359) __ATTR(new_offset, S_IRUGO|S_IWUSR, new_offset_show, new_offset_store);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3360) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3361) static ssize_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3362) rdev_size_show(struct md_rdev *rdev, char *page)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3363) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3364) 	return sprintf(page, "%llu\n", (unsigned long long)rdev->sectors / 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3365) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3366) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3367) static int overlaps(sector_t s1, sector_t l1, sector_t s2, sector_t l2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3368) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3369) 	/* check if two start/length pairs overlap */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3370) 	if (s1+l1 <= s2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3371) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3372) 	if (s2+l2 <= s1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3373) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3374) 	return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3375) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3376) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3377) static int strict_blocks_to_sectors(const char *buf, sector_t *sectors)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3378) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3379) 	unsigned long long blocks;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3380) 	sector_t new;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3381) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3382) 	if (kstrtoull(buf, 10, &blocks) < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3383) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3384) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3385) 	if (blocks & 1ULL << (8 * sizeof(blocks) - 1))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3386) 		return -EINVAL; /* sector conversion overflow */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3387) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3388) 	new = blocks * 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3389) 	if (new != blocks * 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3390) 		return -EINVAL; /* unsigned long long to sector_t overflow */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3391) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3392) 	*sectors = new;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3393) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3394) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3395) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3396) static ssize_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3397) rdev_size_store(struct md_rdev *rdev, const char *buf, size_t len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3398) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3399) 	struct mddev *my_mddev = rdev->mddev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3400) 	sector_t oldsectors = rdev->sectors;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3401) 	sector_t sectors;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3402) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3403) 	if (test_bit(Journal, &rdev->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3404) 		return -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3405) 	if (strict_blocks_to_sectors(buf, &sectors) < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3406) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3407) 	if (rdev->data_offset != rdev->new_data_offset)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3408) 		return -EINVAL; /* too confusing */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3409) 	if (my_mddev->pers && rdev->raid_disk >= 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3410) 		if (my_mddev->persistent) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3411) 			sectors = super_types[my_mddev->major_version].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3412) 				rdev_size_change(rdev, sectors);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3413) 			if (!sectors)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3414) 				return -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3415) 		} else if (!sectors)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3416) 			sectors = (i_size_read(rdev->bdev->bd_inode) >> 9) -
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3417) 				rdev->data_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3418) 		if (!my_mddev->pers->resize)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3419) 			/* Cannot change size for RAID0 or Linear etc */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3420) 			return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3421) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3422) 	if (sectors < my_mddev->dev_sectors)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3423) 		return -EINVAL; /* component must fit device */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3424) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3425) 	rdev->sectors = sectors;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3426) 	if (sectors > oldsectors && my_mddev->external) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3427) 		/* Need to check that all other rdevs with the same
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3428) 		 * ->bdev do not overlap.  'rcu' is sufficient to walk
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3429) 		 * the rdev lists safely.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3430) 		 * This check does not provide a hard guarantee, it
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3431) 		 * just helps avoid dangerous mistakes.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3432) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3433) 		struct mddev *mddev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3434) 		int overlap = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3435) 		struct list_head *tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3436) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3437) 		rcu_read_lock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3438) 		for_each_mddev(mddev, tmp) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3439) 			struct md_rdev *rdev2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3440) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3441) 			rdev_for_each(rdev2, mddev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3442) 				if (rdev->bdev == rdev2->bdev &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3443) 				    rdev != rdev2 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3444) 				    overlaps(rdev->data_offset, rdev->sectors,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3445) 					     rdev2->data_offset,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3446) 					     rdev2->sectors)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3447) 					overlap = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3448) 					break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3449) 				}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3450) 			if (overlap) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3451) 				mddev_put(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3452) 				break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3453) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3454) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3455) 		rcu_read_unlock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3456) 		if (overlap) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3457) 			/* Someone else could have slipped in a size
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3458) 			 * change here, but doing so is just silly.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3459) 			 * We put oldsectors back because we *know* it is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3460) 			 * safe, and trust userspace not to race with
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3461) 			 * itself
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3462) 			 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3463) 			rdev->sectors = oldsectors;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3464) 			return -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3465) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3466) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3467) 	return len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3468) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3469) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3470) static struct rdev_sysfs_entry rdev_size =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3471) __ATTR(size, S_IRUGO|S_IWUSR, rdev_size_show, rdev_size_store);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3472) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3473) static ssize_t recovery_start_show(struct md_rdev *rdev, char *page)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3474) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3475) 	unsigned long long recovery_start = rdev->recovery_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3476) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3477) 	if (test_bit(In_sync, &rdev->flags) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3478) 	    recovery_start == MaxSector)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3479) 		return sprintf(page, "none\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3480) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3481) 	return sprintf(page, "%llu\n", recovery_start);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3482) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3483) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3484) static ssize_t recovery_start_store(struct md_rdev *rdev, const char *buf, size_t len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3485) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3486) 	unsigned long long recovery_start;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3487) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3488) 	if (cmd_match(buf, "none"))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3489) 		recovery_start = MaxSector;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3490) 	else if (kstrtoull(buf, 10, &recovery_start))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3491) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3492) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3493) 	if (rdev->mddev->pers &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3494) 	    rdev->raid_disk >= 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3495) 		return -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3496) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3497) 	rdev->recovery_offset = recovery_start;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3498) 	if (recovery_start == MaxSector)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3499) 		set_bit(In_sync, &rdev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3500) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3501) 		clear_bit(In_sync, &rdev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3502) 	return len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3503) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3504) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3505) static struct rdev_sysfs_entry rdev_recovery_start =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3506) __ATTR(recovery_start, S_IRUGO|S_IWUSR, recovery_start_show, recovery_start_store);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3507) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3508) /* sysfs access to bad-blocks list.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3509)  * We present two files.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3510)  * 'bad-blocks' lists sector numbers and lengths of ranges that
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3511)  *    are recorded as bad.  The list is truncated to fit within
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3512)  *    the one-page limit of sysfs.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3513)  *    Writing "sector length" to this file adds an acknowledged
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3514)  *    bad block list.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3515)  * 'unacknowledged-bad-blocks' lists bad blocks that have not yet
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3516)  *    been acknowledged.  Writing to this file adds bad blocks
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3517)  *    without acknowledging them.  This is largely for testing.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3518)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3519) static ssize_t bb_show(struct md_rdev *rdev, char *page)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3520) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3521) 	return badblocks_show(&rdev->badblocks, page, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3522) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3523) static ssize_t bb_store(struct md_rdev *rdev, const char *page, size_t len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3524) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3525) 	int rv = badblocks_store(&rdev->badblocks, page, len, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3526) 	/* Maybe that ack was all we needed */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3527) 	if (test_and_clear_bit(BlockedBadBlocks, &rdev->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3528) 		wake_up(&rdev->blocked_wait);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3529) 	return rv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3530) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3531) static struct rdev_sysfs_entry rdev_bad_blocks =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3532) __ATTR(bad_blocks, S_IRUGO|S_IWUSR, bb_show, bb_store);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3533) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3534) static ssize_t ubb_show(struct md_rdev *rdev, char *page)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3535) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3536) 	return badblocks_show(&rdev->badblocks, page, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3537) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3538) static ssize_t ubb_store(struct md_rdev *rdev, const char *page, size_t len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3539) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3540) 	return badblocks_store(&rdev->badblocks, page, len, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3541) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3542) static struct rdev_sysfs_entry rdev_unack_bad_blocks =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3543) __ATTR(unacknowledged_bad_blocks, S_IRUGO|S_IWUSR, ubb_show, ubb_store);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3544) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3545) static ssize_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3546) ppl_sector_show(struct md_rdev *rdev, char *page)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3547) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3548) 	return sprintf(page, "%llu\n", (unsigned long long)rdev->ppl.sector);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3549) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3550) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3551) static ssize_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3552) ppl_sector_store(struct md_rdev *rdev, const char *buf, size_t len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3553) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3554) 	unsigned long long sector;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3555) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3556) 	if (kstrtoull(buf, 10, &sector) < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3557) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3558) 	if (sector != (sector_t)sector)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3559) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3560) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3561) 	if (rdev->mddev->pers && test_bit(MD_HAS_PPL, &rdev->mddev->flags) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3562) 	    rdev->raid_disk >= 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3563) 		return -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3564) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3565) 	if (rdev->mddev->persistent) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3566) 		if (rdev->mddev->major_version == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3567) 			return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3568) 		if ((sector > rdev->sb_start &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3569) 		     sector - rdev->sb_start > S16_MAX) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3570) 		    (sector < rdev->sb_start &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3571) 		     rdev->sb_start - sector > -S16_MIN))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3572) 			return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3573) 		rdev->ppl.offset = sector - rdev->sb_start;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3574) 	} else if (!rdev->mddev->external) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3575) 		return -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3576) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3577) 	rdev->ppl.sector = sector;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3578) 	return len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3579) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3580) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3581) static struct rdev_sysfs_entry rdev_ppl_sector =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3582) __ATTR(ppl_sector, S_IRUGO|S_IWUSR, ppl_sector_show, ppl_sector_store);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3583) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3584) static ssize_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3585) ppl_size_show(struct md_rdev *rdev, char *page)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3586) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3587) 	return sprintf(page, "%u\n", rdev->ppl.size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3588) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3589) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3590) static ssize_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3591) ppl_size_store(struct md_rdev *rdev, const char *buf, size_t len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3592) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3593) 	unsigned int size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3594) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3595) 	if (kstrtouint(buf, 10, &size) < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3596) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3597) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3598) 	if (rdev->mddev->pers && test_bit(MD_HAS_PPL, &rdev->mddev->flags) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3599) 	    rdev->raid_disk >= 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3600) 		return -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3601) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3602) 	if (rdev->mddev->persistent) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3603) 		if (rdev->mddev->major_version == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3604) 			return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3605) 		if (size > U16_MAX)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3606) 			return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3607) 	} else if (!rdev->mddev->external) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3608) 		return -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3609) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3610) 	rdev->ppl.size = size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3611) 	return len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3612) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3613) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3614) static struct rdev_sysfs_entry rdev_ppl_size =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3615) __ATTR(ppl_size, S_IRUGO|S_IWUSR, ppl_size_show, ppl_size_store);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3616) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3617) static struct attribute *rdev_default_attrs[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3618) 	&rdev_state.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3619) 	&rdev_errors.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3620) 	&rdev_slot.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3621) 	&rdev_offset.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3622) 	&rdev_new_offset.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3623) 	&rdev_size.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3624) 	&rdev_recovery_start.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3625) 	&rdev_bad_blocks.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3626) 	&rdev_unack_bad_blocks.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3627) 	&rdev_ppl_sector.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3628) 	&rdev_ppl_size.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3629) 	NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3630) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3631) static ssize_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3632) rdev_attr_show(struct kobject *kobj, struct attribute *attr, char *page)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3633) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3634) 	struct rdev_sysfs_entry *entry = container_of(attr, struct rdev_sysfs_entry, attr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3635) 	struct md_rdev *rdev = container_of(kobj, struct md_rdev, kobj);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3636) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3637) 	if (!entry->show)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3638) 		return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3639) 	if (!rdev->mddev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3640) 		return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3641) 	return entry->show(rdev, page);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3642) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3643) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3644) static ssize_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3645) rdev_attr_store(struct kobject *kobj, struct attribute *attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3646) 	      const char *page, size_t length)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3647) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3648) 	struct rdev_sysfs_entry *entry = container_of(attr, struct rdev_sysfs_entry, attr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3649) 	struct md_rdev *rdev = container_of(kobj, struct md_rdev, kobj);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3650) 	ssize_t rv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3651) 	struct mddev *mddev = rdev->mddev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3652) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3653) 	if (!entry->store)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3654) 		return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3655) 	if (!capable(CAP_SYS_ADMIN))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3656) 		return -EACCES;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3657) 	rv = mddev ? mddev_lock(mddev) : -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3658) 	if (!rv) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3659) 		if (rdev->mddev == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3660) 			rv = -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3661) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3662) 			rv = entry->store(rdev, page, length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3663) 		mddev_unlock(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3664) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3665) 	return rv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3666) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3667) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3668) static void rdev_free(struct kobject *ko)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3669) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3670) 	struct md_rdev *rdev = container_of(ko, struct md_rdev, kobj);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3671) 	kfree(rdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3672) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3673) static const struct sysfs_ops rdev_sysfs_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3674) 	.show		= rdev_attr_show,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3675) 	.store		= rdev_attr_store,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3676) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3677) static struct kobj_type rdev_ktype = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3678) 	.release	= rdev_free,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3679) 	.sysfs_ops	= &rdev_sysfs_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3680) 	.default_attrs	= rdev_default_attrs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3681) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3682) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3683) int md_rdev_init(struct md_rdev *rdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3684) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3685) 	rdev->desc_nr = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3686) 	rdev->saved_raid_disk = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3687) 	rdev->raid_disk = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3688) 	rdev->flags = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3689) 	rdev->data_offset = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3690) 	rdev->new_data_offset = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3691) 	rdev->sb_events = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3692) 	rdev->last_read_error = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3693) 	rdev->sb_loaded = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3694) 	rdev->bb_page = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3695) 	atomic_set(&rdev->nr_pending, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3696) 	atomic_set(&rdev->read_errors, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3697) 	atomic_set(&rdev->corrected_errors, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3698) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3699) 	INIT_LIST_HEAD(&rdev->same_set);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3700) 	init_waitqueue_head(&rdev->blocked_wait);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3701) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3702) 	/* Add space to store bad block list.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3703) 	 * This reserves the space even on arrays where it cannot
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3704) 	 * be used - I wonder if that matters
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3705) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3706) 	return badblocks_init(&rdev->badblocks, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3707) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3708) EXPORT_SYMBOL_GPL(md_rdev_init);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3709) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3710)  * Import a device. If 'super_format' >= 0, then sanity check the superblock
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3711)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3712)  * mark the device faulty if:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3713)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3714)  *   - the device is nonexistent (zero size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3715)  *   - the device has no valid superblock
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3716)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3717)  * a faulty rdev _never_ has rdev->sb set.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3718)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3719) static struct md_rdev *md_import_device(dev_t newdev, int super_format, int super_minor)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3720) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3721) 	char b[BDEVNAME_SIZE];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3722) 	int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3723) 	struct md_rdev *rdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3724) 	sector_t size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3725) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3726) 	rdev = kzalloc(sizeof(*rdev), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3727) 	if (!rdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3728) 		return ERR_PTR(-ENOMEM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3729) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3730) 	err = md_rdev_init(rdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3731) 	if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3732) 		goto abort_free;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3733) 	err = alloc_disk_sb(rdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3734) 	if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3735) 		goto abort_free;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3736) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3737) 	err = lock_rdev(rdev, newdev, super_format == -2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3738) 	if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3739) 		goto abort_free;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3740) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3741) 	kobject_init(&rdev->kobj, &rdev_ktype);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3742) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3743) 	size = i_size_read(rdev->bdev->bd_inode) >> BLOCK_SIZE_BITS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3744) 	if (!size) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3745) 		pr_warn("md: %s has zero or unknown size, marking faulty!\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3746) 			bdevname(rdev->bdev,b));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3747) 		err = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3748) 		goto abort_free;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3749) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3750) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3751) 	if (super_format >= 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3752) 		err = super_types[super_format].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3753) 			load_super(rdev, NULL, super_minor);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3754) 		if (err == -EINVAL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3755) 			pr_warn("md: %s does not have a valid v%d.%d superblock, not importing!\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3756) 				bdevname(rdev->bdev,b),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3757) 				super_format, super_minor);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3758) 			goto abort_free;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3759) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3760) 		if (err < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3761) 			pr_warn("md: could not read %s's sb, not importing!\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3762) 				bdevname(rdev->bdev,b));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3763) 			goto abort_free;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3764) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3765) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3766) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3767) 	return rdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3768) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3769) abort_free:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3770) 	if (rdev->bdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3771) 		unlock_rdev(rdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3772) 	md_rdev_clear(rdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3773) 	kfree(rdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3774) 	return ERR_PTR(err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3775) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3776) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3777) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3778)  * Check a full RAID array for plausibility
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3779)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3780) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3781) static int analyze_sbs(struct mddev *mddev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3782) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3783) 	int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3784) 	struct md_rdev *rdev, *freshest, *tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3785) 	char b[BDEVNAME_SIZE];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3786) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3787) 	freshest = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3788) 	rdev_for_each_safe(rdev, tmp, mddev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3789) 		switch (super_types[mddev->major_version].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3790) 			load_super(rdev, freshest, mddev->minor_version)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3791) 		case 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3792) 			freshest = rdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3793) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3794) 		case 0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3795) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3796) 		default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3797) 			pr_warn("md: fatal superblock inconsistency in %s -- removing from array\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3798) 				bdevname(rdev->bdev,b));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3799) 			md_kick_rdev_from_array(rdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3800) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3801) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3802) 	/* Cannot find a valid fresh disk */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3803) 	if (!freshest) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3804) 		pr_warn("md: cannot find a valid disk\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3805) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3806) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3807) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3808) 	super_types[mddev->major_version].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3809) 		validate_super(mddev, freshest);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3810) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3811) 	i = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3812) 	rdev_for_each_safe(rdev, tmp, mddev) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3813) 		if (mddev->max_disks &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3814) 		    (rdev->desc_nr >= mddev->max_disks ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3815) 		     i > mddev->max_disks)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3816) 			pr_warn("md: %s: %s: only %d devices permitted\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3817) 				mdname(mddev), bdevname(rdev->bdev, b),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3818) 				mddev->max_disks);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3819) 			md_kick_rdev_from_array(rdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3820) 			continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3821) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3822) 		if (rdev != freshest) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3823) 			if (super_types[mddev->major_version].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3824) 			    validate_super(mddev, rdev)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3825) 				pr_warn("md: kicking non-fresh %s from array!\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3826) 					bdevname(rdev->bdev,b));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3827) 				md_kick_rdev_from_array(rdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3828) 				continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3829) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3830) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3831) 		if (mddev->level == LEVEL_MULTIPATH) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3832) 			rdev->desc_nr = i++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3833) 			rdev->raid_disk = rdev->desc_nr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3834) 			set_bit(In_sync, &rdev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3835) 		} else if (rdev->raid_disk >=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3836) 			    (mddev->raid_disks - min(0, mddev->delta_disks)) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3837) 			   !test_bit(Journal, &rdev->flags)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3838) 			rdev->raid_disk = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3839) 			clear_bit(In_sync, &rdev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3840) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3841) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3842) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3843) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3844) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3845) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3846) /* Read a fixed-point number.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3847)  * Numbers in sysfs attributes should be in "standard" units where
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3848)  * possible, so time should be in seconds.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3849)  * However we internally use a a much smaller unit such as
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3850)  * milliseconds or jiffies.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3851)  * This function takes a decimal number with a possible fractional
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3852)  * component, and produces an integer which is the result of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3853)  * multiplying that number by 10^'scale'.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3854)  * all without any floating-point arithmetic.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3855)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3856) int strict_strtoul_scaled(const char *cp, unsigned long *res, int scale)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3857) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3858) 	unsigned long result = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3859) 	long decimals = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3860) 	while (isdigit(*cp) || (*cp == '.' && decimals < 0)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3861) 		if (*cp == '.')
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3862) 			decimals = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3863) 		else if (decimals < scale) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3864) 			unsigned int value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3865) 			value = *cp - '0';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3866) 			result = result * 10 + value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3867) 			if (decimals >= 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3868) 				decimals++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3869) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3870) 		cp++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3871) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3872) 	if (*cp == '\n')
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3873) 		cp++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3874) 	if (*cp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3875) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3876) 	if (decimals < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3877) 		decimals = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3878) 	*res = result * int_pow(10, scale - decimals);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3879) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3880) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3881) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3882) static ssize_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3883) safe_delay_show(struct mddev *mddev, char *page)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3884) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3885) 	int msec = (mddev->safemode_delay*1000)/HZ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3886) 	return sprintf(page, "%d.%03d\n", msec/1000, msec%1000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3887) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3888) static ssize_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3889) safe_delay_store(struct mddev *mddev, const char *cbuf, size_t len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3890) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3891) 	unsigned long msec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3892) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3893) 	if (mddev_is_clustered(mddev)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3894) 		pr_warn("md: Safemode is disabled for clustered mode\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3895) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3896) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3897) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3898) 	if (strict_strtoul_scaled(cbuf, &msec, 3) < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3899) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3900) 	if (msec == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3901) 		mddev->safemode_delay = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3902) 	else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3903) 		unsigned long old_delay = mddev->safemode_delay;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3904) 		unsigned long new_delay = (msec*HZ)/1000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3905) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3906) 		if (new_delay == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3907) 			new_delay = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3908) 		mddev->safemode_delay = new_delay;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3909) 		if (new_delay < old_delay || old_delay == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3910) 			mod_timer(&mddev->safemode_timer, jiffies+1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3911) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3912) 	return len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3913) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3914) static struct md_sysfs_entry md_safe_delay =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3915) __ATTR(safe_mode_delay, S_IRUGO|S_IWUSR,safe_delay_show, safe_delay_store);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3916) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3917) static ssize_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3918) level_show(struct mddev *mddev, char *page)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3919) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3920) 	struct md_personality *p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3921) 	int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3922) 	spin_lock(&mddev->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3923) 	p = mddev->pers;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3924) 	if (p)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3925) 		ret = sprintf(page, "%s\n", p->name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3926) 	else if (mddev->clevel[0])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3927) 		ret = sprintf(page, "%s\n", mddev->clevel);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3928) 	else if (mddev->level != LEVEL_NONE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3929) 		ret = sprintf(page, "%d\n", mddev->level);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3930) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3931) 		ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3932) 	spin_unlock(&mddev->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3933) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3934) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3935) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3936) static ssize_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3937) level_store(struct mddev *mddev, const char *buf, size_t len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3938) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3939) 	char clevel[16];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3940) 	ssize_t rv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3941) 	size_t slen = len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3942) 	struct md_personality *pers, *oldpers;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3943) 	long level;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3944) 	void *priv, *oldpriv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3945) 	struct md_rdev *rdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3946) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3947) 	if (slen == 0 || slen >= sizeof(clevel))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3948) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3949) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3950) 	rv = mddev_lock(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3951) 	if (rv)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3952) 		return rv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3953) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3954) 	if (mddev->pers == NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3955) 		strncpy(mddev->clevel, buf, slen);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3956) 		if (mddev->clevel[slen-1] == '\n')
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3957) 			slen--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3958) 		mddev->clevel[slen] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3959) 		mddev->level = LEVEL_NONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3960) 		rv = len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3961) 		goto out_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3962) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3963) 	rv = -EROFS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3964) 	if (mddev->ro)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3965) 		goto out_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3966) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3967) 	/* request to change the personality.  Need to ensure:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3968) 	 *  - array is not engaged in resync/recovery/reshape
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3969) 	 *  - old personality can be suspended
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3970) 	 *  - new personality will access other array.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3971) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3972) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3973) 	rv = -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3974) 	if (mddev->sync_thread ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3975) 	    test_bit(MD_RECOVERY_RUNNING, &mddev->recovery) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3976) 	    mddev->reshape_position != MaxSector ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3977) 	    mddev->sysfs_active)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3978) 		goto out_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3979) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3980) 	rv = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3981) 	if (!mddev->pers->quiesce) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3982) 		pr_warn("md: %s: %s does not support online personality change\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3983) 			mdname(mddev), mddev->pers->name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3984) 		goto out_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3985) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3986) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3987) 	/* Now find the new personality */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3988) 	strncpy(clevel, buf, slen);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3989) 	if (clevel[slen-1] == '\n')
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3990) 		slen--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3991) 	clevel[slen] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3992) 	if (kstrtol(clevel, 10, &level))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3993) 		level = LEVEL_NONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3994) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3995) 	if (request_module("md-%s", clevel) != 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3996) 		request_module("md-level-%s", clevel);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3997) 	spin_lock(&pers_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3998) 	pers = find_pers(level, clevel);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3999) 	if (!pers || !try_module_get(pers->owner)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4000) 		spin_unlock(&pers_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4001) 		pr_warn("md: personality %s not loaded\n", clevel);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4002) 		rv = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4003) 		goto out_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4004) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4005) 	spin_unlock(&pers_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4006) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4007) 	if (pers == mddev->pers) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4008) 		/* Nothing to do! */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4009) 		module_put(pers->owner);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4010) 		rv = len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4011) 		goto out_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4012) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4013) 	if (!pers->takeover) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4014) 		module_put(pers->owner);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4015) 		pr_warn("md: %s: %s does not support personality takeover\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4016) 			mdname(mddev), clevel);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4017) 		rv = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4018) 		goto out_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4019) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4020) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4021) 	rdev_for_each(rdev, mddev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4022) 		rdev->new_raid_disk = rdev->raid_disk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4023) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4024) 	/* ->takeover must set new_* and/or delta_disks
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4025) 	 * if it succeeds, and may set them when it fails.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4026) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4027) 	priv = pers->takeover(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4028) 	if (IS_ERR(priv)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4029) 		mddev->new_level = mddev->level;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4030) 		mddev->new_layout = mddev->layout;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4031) 		mddev->new_chunk_sectors = mddev->chunk_sectors;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4032) 		mddev->raid_disks -= mddev->delta_disks;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4033) 		mddev->delta_disks = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4034) 		mddev->reshape_backwards = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4035) 		module_put(pers->owner);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4036) 		pr_warn("md: %s: %s would not accept array\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4037) 			mdname(mddev), clevel);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4038) 		rv = PTR_ERR(priv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4039) 		goto out_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4040) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4041) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4042) 	/* Looks like we have a winner */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4043) 	mddev_suspend(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4044) 	mddev_detach(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4045) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4046) 	spin_lock(&mddev->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4047) 	oldpers = mddev->pers;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4048) 	oldpriv = mddev->private;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4049) 	mddev->pers = pers;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4050) 	mddev->private = priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4051) 	strlcpy(mddev->clevel, pers->name, sizeof(mddev->clevel));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4052) 	mddev->level = mddev->new_level;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4053) 	mddev->layout = mddev->new_layout;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4054) 	mddev->chunk_sectors = mddev->new_chunk_sectors;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4055) 	mddev->delta_disks = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4056) 	mddev->reshape_backwards = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4057) 	mddev->degraded = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4058) 	spin_unlock(&mddev->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4059) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4060) 	if (oldpers->sync_request == NULL &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4061) 	    mddev->external) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4062) 		/* We are converting from a no-redundancy array
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4063) 		 * to a redundancy array and metadata is managed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4064) 		 * externally so we need to be sure that writes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4065) 		 * won't block due to a need to transition
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4066) 		 *      clean->dirty
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4067) 		 * until external management is started.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4068) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4069) 		mddev->in_sync = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4070) 		mddev->safemode_delay = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4071) 		mddev->safemode = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4072) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4073) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4074) 	oldpers->free(mddev, oldpriv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4075) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4076) 	if (oldpers->sync_request == NULL &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4077) 	    pers->sync_request != NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4078) 		/* need to add the md_redundancy_group */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4079) 		if (sysfs_create_group(&mddev->kobj, &md_redundancy_group))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4080) 			pr_warn("md: cannot register extra attributes for %s\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4081) 				mdname(mddev));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4082) 		mddev->sysfs_action = sysfs_get_dirent(mddev->kobj.sd, "sync_action");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4083) 		mddev->sysfs_completed = sysfs_get_dirent_safe(mddev->kobj.sd, "sync_completed");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4084) 		mddev->sysfs_degraded = sysfs_get_dirent_safe(mddev->kobj.sd, "degraded");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4085) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4086) 	if (oldpers->sync_request != NULL &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4087) 	    pers->sync_request == NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4088) 		/* need to remove the md_redundancy_group */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4089) 		if (mddev->to_remove == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4090) 			mddev->to_remove = &md_redundancy_group;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4091) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4092) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4093) 	module_put(oldpers->owner);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4094) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4095) 	rdev_for_each(rdev, mddev) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4096) 		if (rdev->raid_disk < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4097) 			continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4098) 		if (rdev->new_raid_disk >= mddev->raid_disks)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4099) 			rdev->new_raid_disk = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4100) 		if (rdev->new_raid_disk == rdev->raid_disk)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4101) 			continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4102) 		sysfs_unlink_rdev(mddev, rdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4103) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4104) 	rdev_for_each(rdev, mddev) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4105) 		if (rdev->raid_disk < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4106) 			continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4107) 		if (rdev->new_raid_disk == rdev->raid_disk)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4108) 			continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4109) 		rdev->raid_disk = rdev->new_raid_disk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4110) 		if (rdev->raid_disk < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4111) 			clear_bit(In_sync, &rdev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4112) 		else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4113) 			if (sysfs_link_rdev(mddev, rdev))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4114) 				pr_warn("md: cannot register rd%d for %s after level change\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4115) 					rdev->raid_disk, mdname(mddev));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4116) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4117) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4118) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4119) 	if (pers->sync_request == NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4120) 		/* this is now an array without redundancy, so
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4121) 		 * it must always be in_sync
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4122) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4123) 		mddev->in_sync = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4124) 		del_timer_sync(&mddev->safemode_timer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4125) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4126) 	blk_set_stacking_limits(&mddev->queue->limits);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4127) 	pers->run(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4128) 	set_bit(MD_SB_CHANGE_DEVS, &mddev->sb_flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4129) 	mddev_resume(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4130) 	if (!mddev->thread)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4131) 		md_update_sb(mddev, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4132) 	sysfs_notify_dirent_safe(mddev->sysfs_level);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4133) 	md_new_event(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4134) 	rv = len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4135) out_unlock:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4136) 	mddev_unlock(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4137) 	return rv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4138) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4139) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4140) static struct md_sysfs_entry md_level =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4141) __ATTR(level, S_IRUGO|S_IWUSR, level_show, level_store);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4142) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4143) static ssize_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4144) layout_show(struct mddev *mddev, char *page)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4145) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4146) 	/* just a number, not meaningful for all levels */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4147) 	if (mddev->reshape_position != MaxSector &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4148) 	    mddev->layout != mddev->new_layout)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4149) 		return sprintf(page, "%d (%d)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4150) 			       mddev->new_layout, mddev->layout);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4151) 	return sprintf(page, "%d\n", mddev->layout);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4152) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4153) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4154) static ssize_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4155) layout_store(struct mddev *mddev, const char *buf, size_t len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4156) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4157) 	unsigned int n;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4158) 	int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4159) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4160) 	err = kstrtouint(buf, 10, &n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4161) 	if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4162) 		return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4163) 	err = mddev_lock(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4164) 	if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4165) 		return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4166) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4167) 	if (mddev->pers) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4168) 		if (mddev->pers->check_reshape == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4169) 			err = -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4170) 		else if (mddev->ro)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4171) 			err = -EROFS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4172) 		else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4173) 			mddev->new_layout = n;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4174) 			err = mddev->pers->check_reshape(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4175) 			if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4176) 				mddev->new_layout = mddev->layout;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4177) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4178) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4179) 		mddev->new_layout = n;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4180) 		if (mddev->reshape_position == MaxSector)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4181) 			mddev->layout = n;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4182) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4183) 	mddev_unlock(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4184) 	return err ?: len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4185) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4186) static struct md_sysfs_entry md_layout =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4187) __ATTR(layout, S_IRUGO|S_IWUSR, layout_show, layout_store);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4188) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4189) static ssize_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4190) raid_disks_show(struct mddev *mddev, char *page)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4191) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4192) 	if (mddev->raid_disks == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4193) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4194) 	if (mddev->reshape_position != MaxSector &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4195) 	    mddev->delta_disks != 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4196) 		return sprintf(page, "%d (%d)\n", mddev->raid_disks,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4197) 			       mddev->raid_disks - mddev->delta_disks);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4198) 	return sprintf(page, "%d\n", mddev->raid_disks);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4199) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4200) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4201) static int update_raid_disks(struct mddev *mddev, int raid_disks);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4202) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4203) static ssize_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4204) raid_disks_store(struct mddev *mddev, const char *buf, size_t len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4205) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4206) 	unsigned int n;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4207) 	int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4208) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4209) 	err = kstrtouint(buf, 10, &n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4210) 	if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4211) 		return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4212) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4213) 	err = mddev_lock(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4214) 	if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4215) 		return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4216) 	if (mddev->pers)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4217) 		err = update_raid_disks(mddev, n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4218) 	else if (mddev->reshape_position != MaxSector) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4219) 		struct md_rdev *rdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4220) 		int olddisks = mddev->raid_disks - mddev->delta_disks;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4221) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4222) 		err = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4223) 		rdev_for_each(rdev, mddev) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4224) 			if (olddisks < n &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4225) 			    rdev->data_offset < rdev->new_data_offset)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4226) 				goto out_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4227) 			if (olddisks > n &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4228) 			    rdev->data_offset > rdev->new_data_offset)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4229) 				goto out_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4230) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4231) 		err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4232) 		mddev->delta_disks = n - olddisks;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4233) 		mddev->raid_disks = n;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4234) 		mddev->reshape_backwards = (mddev->delta_disks < 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4235) 	} else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4236) 		mddev->raid_disks = n;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4237) out_unlock:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4238) 	mddev_unlock(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4239) 	return err ? err : len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4240) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4241) static struct md_sysfs_entry md_raid_disks =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4242) __ATTR(raid_disks, S_IRUGO|S_IWUSR, raid_disks_show, raid_disks_store);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4243) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4244) static ssize_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4245) uuid_show(struct mddev *mddev, char *page)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4246) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4247) 	return sprintf(page, "%pU\n", mddev->uuid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4248) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4249) static struct md_sysfs_entry md_uuid =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4250) __ATTR(uuid, S_IRUGO, uuid_show, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4251) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4252) static ssize_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4253) chunk_size_show(struct mddev *mddev, char *page)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4254) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4255) 	if (mddev->reshape_position != MaxSector &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4256) 	    mddev->chunk_sectors != mddev->new_chunk_sectors)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4257) 		return sprintf(page, "%d (%d)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4258) 			       mddev->new_chunk_sectors << 9,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4259) 			       mddev->chunk_sectors << 9);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4260) 	return sprintf(page, "%d\n", mddev->chunk_sectors << 9);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4261) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4262) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4263) static ssize_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4264) chunk_size_store(struct mddev *mddev, const char *buf, size_t len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4265) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4266) 	unsigned long n;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4267) 	int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4268) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4269) 	err = kstrtoul(buf, 10, &n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4270) 	if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4271) 		return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4272) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4273) 	err = mddev_lock(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4274) 	if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4275) 		return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4276) 	if (mddev->pers) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4277) 		if (mddev->pers->check_reshape == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4278) 			err = -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4279) 		else if (mddev->ro)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4280) 			err = -EROFS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4281) 		else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4282) 			mddev->new_chunk_sectors = n >> 9;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4283) 			err = mddev->pers->check_reshape(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4284) 			if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4285) 				mddev->new_chunk_sectors = mddev->chunk_sectors;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4286) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4287) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4288) 		mddev->new_chunk_sectors = n >> 9;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4289) 		if (mddev->reshape_position == MaxSector)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4290) 			mddev->chunk_sectors = n >> 9;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4291) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4292) 	mddev_unlock(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4293) 	return err ?: len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4294) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4295) static struct md_sysfs_entry md_chunk_size =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4296) __ATTR(chunk_size, S_IRUGO|S_IWUSR, chunk_size_show, chunk_size_store);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4297) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4298) static ssize_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4299) resync_start_show(struct mddev *mddev, char *page)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4300) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4301) 	if (mddev->recovery_cp == MaxSector)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4302) 		return sprintf(page, "none\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4303) 	return sprintf(page, "%llu\n", (unsigned long long)mddev->recovery_cp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4304) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4305) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4306) static ssize_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4307) resync_start_store(struct mddev *mddev, const char *buf, size_t len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4308) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4309) 	unsigned long long n;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4310) 	int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4311) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4312) 	if (cmd_match(buf, "none"))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4313) 		n = MaxSector;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4314) 	else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4315) 		err = kstrtoull(buf, 10, &n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4316) 		if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4317) 			return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4318) 		if (n != (sector_t)n)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4319) 			return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4320) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4321) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4322) 	err = mddev_lock(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4323) 	if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4324) 		return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4325) 	if (mddev->pers && !test_bit(MD_RECOVERY_FROZEN, &mddev->recovery))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4326) 		err = -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4327) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4328) 	if (!err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4329) 		mddev->recovery_cp = n;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4330) 		if (mddev->pers)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4331) 			set_bit(MD_SB_CHANGE_CLEAN, &mddev->sb_flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4332) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4333) 	mddev_unlock(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4334) 	return err ?: len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4335) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4336) static struct md_sysfs_entry md_resync_start =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4337) __ATTR_PREALLOC(resync_start, S_IRUGO|S_IWUSR,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4338) 		resync_start_show, resync_start_store);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4339) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4340) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4341)  * The array state can be:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4342)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4343)  * clear
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4344)  *     No devices, no size, no level
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4345)  *     Equivalent to STOP_ARRAY ioctl
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4346)  * inactive
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4347)  *     May have some settings, but array is not active
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4348)  *        all IO results in error
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4349)  *     When written, doesn't tear down array, but just stops it
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4350)  * suspended (not supported yet)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4351)  *     All IO requests will block. The array can be reconfigured.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4352)  *     Writing this, if accepted, will block until array is quiescent
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4353)  * readonly
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4354)  *     no resync can happen.  no superblocks get written.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4355)  *     write requests fail
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4356)  * read-auto
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4357)  *     like readonly, but behaves like 'clean' on a write request.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4358)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4359)  * clean - no pending writes, but otherwise active.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4360)  *     When written to inactive array, starts without resync
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4361)  *     If a write request arrives then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4362)  *       if metadata is known, mark 'dirty' and switch to 'active'.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4363)  *       if not known, block and switch to write-pending
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4364)  *     If written to an active array that has pending writes, then fails.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4365)  * active
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4366)  *     fully active: IO and resync can be happening.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4367)  *     When written to inactive array, starts with resync
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4368)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4369)  * write-pending
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4370)  *     clean, but writes are blocked waiting for 'active' to be written.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4371)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4372)  * active-idle
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4373)  *     like active, but no writes have been seen for a while (100msec).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4374)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4375)  * broken
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4376)  *     RAID0/LINEAR-only: same as clean, but array is missing a member.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4377)  *     It's useful because RAID0/LINEAR mounted-arrays aren't stopped
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4378)  *     when a member is gone, so this state will at least alert the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4379)  *     user that something is wrong.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4380)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4381) enum array_state { clear, inactive, suspended, readonly, read_auto, clean, active,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4382) 		   write_pending, active_idle, broken, bad_word};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4383) static char *array_states[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4384) 	"clear", "inactive", "suspended", "readonly", "read-auto", "clean", "active",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4385) 	"write-pending", "active-idle", "broken", NULL };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4386) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4387) static int match_word(const char *word, char **list)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4388) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4389) 	int n;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4390) 	for (n=0; list[n]; n++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4391) 		if (cmd_match(word, list[n]))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4392) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4393) 	return n;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4394) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4395) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4396) static ssize_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4397) array_state_show(struct mddev *mddev, char *page)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4398) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4399) 	enum array_state st = inactive;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4400) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4401) 	if (mddev->pers && !test_bit(MD_NOT_READY, &mddev->flags)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4402) 		switch(mddev->ro) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4403) 		case 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4404) 			st = readonly;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4405) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4406) 		case 2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4407) 			st = read_auto;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4408) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4409) 		case 0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4410) 			spin_lock(&mddev->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4411) 			if (test_bit(MD_SB_CHANGE_PENDING, &mddev->sb_flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4412) 				st = write_pending;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4413) 			else if (mddev->in_sync)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4414) 				st = clean;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4415) 			else if (mddev->safemode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4416) 				st = active_idle;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4417) 			else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4418) 				st = active;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4419) 			spin_unlock(&mddev->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4420) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4421) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4422) 		if (test_bit(MD_BROKEN, &mddev->flags) && st == clean)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4423) 			st = broken;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4424) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4425) 		if (list_empty(&mddev->disks) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4426) 		    mddev->raid_disks == 0 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4427) 		    mddev->dev_sectors == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4428) 			st = clear;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4429) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4430) 			st = inactive;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4431) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4432) 	return sprintf(page, "%s\n", array_states[st]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4433) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4434) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4435) static int do_md_stop(struct mddev *mddev, int ro, struct block_device *bdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4436) static int md_set_readonly(struct mddev *mddev, struct block_device *bdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4437) static int restart_array(struct mddev *mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4438) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4439) static ssize_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4440) array_state_store(struct mddev *mddev, const char *buf, size_t len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4441) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4442) 	int err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4443) 	enum array_state st = match_word(buf, array_states);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4444) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4445) 	if (mddev->pers && (st == active || st == clean) && mddev->ro != 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4446) 		/* don't take reconfig_mutex when toggling between
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4447) 		 * clean and active
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4448) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4449) 		spin_lock(&mddev->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4450) 		if (st == active) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4451) 			restart_array(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4452) 			clear_bit(MD_SB_CHANGE_PENDING, &mddev->sb_flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4453) 			md_wakeup_thread(mddev->thread);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4454) 			wake_up(&mddev->sb_wait);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4455) 		} else /* st == clean */ {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4456) 			restart_array(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4457) 			if (!set_in_sync(mddev))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4458) 				err = -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4459) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4460) 		if (!err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4461) 			sysfs_notify_dirent_safe(mddev->sysfs_state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4462) 		spin_unlock(&mddev->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4463) 		return err ?: len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4464) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4465) 	err = mddev_lock(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4466) 	if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4467) 		return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4468) 	err = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4469) 	switch(st) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4470) 	case bad_word:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4471) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4472) 	case clear:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4473) 		/* stopping an active array */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4474) 		err = do_md_stop(mddev, 0, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4475) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4476) 	case inactive:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4477) 		/* stopping an active array */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4478) 		if (mddev->pers)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4479) 			err = do_md_stop(mddev, 2, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4480) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4481) 			err = 0; /* already inactive */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4482) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4483) 	case suspended:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4484) 		break; /* not supported yet */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4485) 	case readonly:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4486) 		if (mddev->pers)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4487) 			err = md_set_readonly(mddev, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4488) 		else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4489) 			mddev->ro = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4490) 			set_disk_ro(mddev->gendisk, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4491) 			err = do_md_run(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4492) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4493) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4494) 	case read_auto:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4495) 		if (mddev->pers) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4496) 			if (mddev->ro == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4497) 				err = md_set_readonly(mddev, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4498) 			else if (mddev->ro == 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4499) 				err = restart_array(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4500) 			if (err == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4501) 				mddev->ro = 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4502) 				set_disk_ro(mddev->gendisk, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4503) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4504) 		} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4505) 			mddev->ro = 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4506) 			err = do_md_run(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4507) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4508) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4509) 	case clean:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4510) 		if (mddev->pers) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4511) 			err = restart_array(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4512) 			if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4513) 				break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4514) 			spin_lock(&mddev->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4515) 			if (!set_in_sync(mddev))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4516) 				err = -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4517) 			spin_unlock(&mddev->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4518) 		} else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4519) 			err = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4520) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4521) 	case active:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4522) 		if (mddev->pers) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4523) 			err = restart_array(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4524) 			if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4525) 				break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4526) 			clear_bit(MD_SB_CHANGE_PENDING, &mddev->sb_flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4527) 			wake_up(&mddev->sb_wait);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4528) 			err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4529) 		} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4530) 			mddev->ro = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4531) 			set_disk_ro(mddev->gendisk, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4532) 			err = do_md_run(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4533) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4534) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4535) 	case write_pending:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4536) 	case active_idle:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4537) 	case broken:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4538) 		/* these cannot be set */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4539) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4540) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4541) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4542) 	if (!err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4543) 		if (mddev->hold_active == UNTIL_IOCTL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4544) 			mddev->hold_active = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4545) 		sysfs_notify_dirent_safe(mddev->sysfs_state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4546) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4547) 	mddev_unlock(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4548) 	return err ?: len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4549) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4550) static struct md_sysfs_entry md_array_state =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4551) __ATTR_PREALLOC(array_state, S_IRUGO|S_IWUSR, array_state_show, array_state_store);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4552) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4553) static ssize_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4554) max_corrected_read_errors_show(struct mddev *mddev, char *page) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4555) 	return sprintf(page, "%d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4556) 		       atomic_read(&mddev->max_corr_read_errors));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4557) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4558) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4559) static ssize_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4560) max_corrected_read_errors_store(struct mddev *mddev, const char *buf, size_t len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4561) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4562) 	unsigned int n;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4563) 	int rv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4564) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4565) 	rv = kstrtouint(buf, 10, &n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4566) 	if (rv < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4567) 		return rv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4568) 	atomic_set(&mddev->max_corr_read_errors, n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4569) 	return len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4570) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4571) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4572) static struct md_sysfs_entry max_corr_read_errors =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4573) __ATTR(max_read_errors, S_IRUGO|S_IWUSR, max_corrected_read_errors_show,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4574) 	max_corrected_read_errors_store);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4575) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4576) static ssize_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4577) null_show(struct mddev *mddev, char *page)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4578) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4579) 	return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4580) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4581) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4582) /* need to ensure rdev_delayed_delete() has completed */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4583) static void flush_rdev_wq(struct mddev *mddev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4584) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4585) 	struct md_rdev *rdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4586) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4587) 	rcu_read_lock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4588) 	rdev_for_each_rcu(rdev, mddev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4589) 		if (work_pending(&rdev->del_work)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4590) 			flush_workqueue(md_rdev_misc_wq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4591) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4592) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4593) 	rcu_read_unlock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4594) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4595) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4596) static ssize_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4597) new_dev_store(struct mddev *mddev, const char *buf, size_t len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4598) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4599) 	/* buf must be %d:%d\n? giving major and minor numbers */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4600) 	/* The new device is added to the array.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4601) 	 * If the array has a persistent superblock, we read the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4602) 	 * superblock to initialise info and check validity.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4603) 	 * Otherwise, only checking done is that in bind_rdev_to_array,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4604) 	 * which mainly checks size.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4605) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4606) 	char *e;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4607) 	int major = simple_strtoul(buf, &e, 10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4608) 	int minor;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4609) 	dev_t dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4610) 	struct md_rdev *rdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4611) 	int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4612) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4613) 	if (!*buf || *e != ':' || !e[1] || e[1] == '\n')
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4614) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4615) 	minor = simple_strtoul(e+1, &e, 10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4616) 	if (*e && *e != '\n')
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4617) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4618) 	dev = MKDEV(major, minor);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4619) 	if (major != MAJOR(dev) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4620) 	    minor != MINOR(dev))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4621) 		return -EOVERFLOW;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4622) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4623) 	flush_rdev_wq(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4624) 	err = mddev_lock(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4625) 	if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4626) 		return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4627) 	if (mddev->persistent) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4628) 		rdev = md_import_device(dev, mddev->major_version,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4629) 					mddev->minor_version);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4630) 		if (!IS_ERR(rdev) && !list_empty(&mddev->disks)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4631) 			struct md_rdev *rdev0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4632) 				= list_entry(mddev->disks.next,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4633) 					     struct md_rdev, same_set);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4634) 			err = super_types[mddev->major_version]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4635) 				.load_super(rdev, rdev0, mddev->minor_version);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4636) 			if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4637) 				goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4638) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4639) 	} else if (mddev->external)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4640) 		rdev = md_import_device(dev, -2, -1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4641) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4642) 		rdev = md_import_device(dev, -1, -1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4643) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4644) 	if (IS_ERR(rdev)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4645) 		mddev_unlock(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4646) 		return PTR_ERR(rdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4647) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4648) 	err = bind_rdev_to_array(rdev, mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4649)  out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4650) 	if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4651) 		export_rdev(rdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4652) 	mddev_unlock(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4653) 	if (!err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4654) 		md_new_event(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4655) 	return err ? err : len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4656) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4657) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4658) static struct md_sysfs_entry md_new_device =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4659) __ATTR(new_dev, S_IWUSR, null_show, new_dev_store);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4660) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4661) static ssize_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4662) bitmap_store(struct mddev *mddev, const char *buf, size_t len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4663) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4664) 	char *end;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4665) 	unsigned long chunk, end_chunk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4666) 	int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4667) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4668) 	err = mddev_lock(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4669) 	if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4670) 		return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4671) 	if (!mddev->bitmap)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4672) 		goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4673) 	/* buf should be <chunk> <chunk> ... or <chunk>-<chunk> ... (range) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4674) 	while (*buf) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4675) 		chunk = end_chunk = simple_strtoul(buf, &end, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4676) 		if (buf == end) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4677) 		if (*end == '-') { /* range */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4678) 			buf = end + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4679) 			end_chunk = simple_strtoul(buf, &end, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4680) 			if (buf == end) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4681) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4682) 		if (*end && !isspace(*end)) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4683) 		md_bitmap_dirty_bits(mddev->bitmap, chunk, end_chunk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4684) 		buf = skip_spaces(end);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4685) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4686) 	md_bitmap_unplug(mddev->bitmap); /* flush the bits to disk */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4687) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4688) 	mddev_unlock(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4689) 	return len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4690) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4691) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4692) static struct md_sysfs_entry md_bitmap =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4693) __ATTR(bitmap_set_bits, S_IWUSR, null_show, bitmap_store);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4694) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4695) static ssize_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4696) size_show(struct mddev *mddev, char *page)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4697) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4698) 	return sprintf(page, "%llu\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4699) 		(unsigned long long)mddev->dev_sectors / 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4700) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4701) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4702) static int update_size(struct mddev *mddev, sector_t num_sectors);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4703) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4704) static ssize_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4705) size_store(struct mddev *mddev, const char *buf, size_t len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4706) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4707) 	/* If array is inactive, we can reduce the component size, but
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4708) 	 * not increase it (except from 0).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4709) 	 * If array is active, we can try an on-line resize
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4710) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4711) 	sector_t sectors;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4712) 	int err = strict_blocks_to_sectors(buf, &sectors);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4713) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4714) 	if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4715) 		return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4716) 	err = mddev_lock(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4717) 	if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4718) 		return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4719) 	if (mddev->pers) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4720) 		err = update_size(mddev, sectors);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4721) 		if (err == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4722) 			md_update_sb(mddev, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4723) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4724) 		if (mddev->dev_sectors == 0 ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4725) 		    mddev->dev_sectors > sectors)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4726) 			mddev->dev_sectors = sectors;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4727) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4728) 			err = -ENOSPC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4729) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4730) 	mddev_unlock(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4731) 	return err ? err : len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4732) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4733) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4734) static struct md_sysfs_entry md_size =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4735) __ATTR(component_size, S_IRUGO|S_IWUSR, size_show, size_store);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4736) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4737) /* Metadata version.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4738)  * This is one of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4739)  *   'none' for arrays with no metadata (good luck...)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4740)  *   'external' for arrays with externally managed metadata,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4741)  * or N.M for internally known formats
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4742)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4743) static ssize_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4744) metadata_show(struct mddev *mddev, char *page)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4745) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4746) 	if (mddev->persistent)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4747) 		return sprintf(page, "%d.%d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4748) 			       mddev->major_version, mddev->minor_version);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4749) 	else if (mddev->external)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4750) 		return sprintf(page, "external:%s\n", mddev->metadata_type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4751) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4752) 		return sprintf(page, "none\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4753) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4754) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4755) static ssize_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4756) metadata_store(struct mddev *mddev, const char *buf, size_t len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4757) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4758) 	int major, minor;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4759) 	char *e;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4760) 	int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4761) 	/* Changing the details of 'external' metadata is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4762) 	 * always permitted.  Otherwise there must be
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4763) 	 * no devices attached to the array.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4764) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4765) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4766) 	err = mddev_lock(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4767) 	if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4768) 		return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4769) 	err = -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4770) 	if (mddev->external && strncmp(buf, "external:", 9) == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4771) 		;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4772) 	else if (!list_empty(&mddev->disks))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4773) 		goto out_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4774) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4775) 	err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4776) 	if (cmd_match(buf, "none")) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4777) 		mddev->persistent = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4778) 		mddev->external = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4779) 		mddev->major_version = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4780) 		mddev->minor_version = 90;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4781) 		goto out_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4782) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4783) 	if (strncmp(buf, "external:", 9) == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4784) 		size_t namelen = len-9;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4785) 		if (namelen >= sizeof(mddev->metadata_type))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4786) 			namelen = sizeof(mddev->metadata_type)-1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4787) 		strncpy(mddev->metadata_type, buf+9, namelen);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4788) 		mddev->metadata_type[namelen] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4789) 		if (namelen && mddev->metadata_type[namelen-1] == '\n')
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4790) 			mddev->metadata_type[--namelen] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4791) 		mddev->persistent = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4792) 		mddev->external = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4793) 		mddev->major_version = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4794) 		mddev->minor_version = 90;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4795) 		goto out_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4796) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4797) 	major = simple_strtoul(buf, &e, 10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4798) 	err = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4799) 	if (e==buf || *e != '.')
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4800) 		goto out_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4801) 	buf = e+1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4802) 	minor = simple_strtoul(buf, &e, 10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4803) 	if (e==buf || (*e && *e != '\n') )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4804) 		goto out_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4805) 	err = -ENOENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4806) 	if (major >= ARRAY_SIZE(super_types) || super_types[major].name == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4807) 		goto out_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4808) 	mddev->major_version = major;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4809) 	mddev->minor_version = minor;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4810) 	mddev->persistent = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4811) 	mddev->external = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4812) 	err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4813) out_unlock:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4814) 	mddev_unlock(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4815) 	return err ?: len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4816) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4817) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4818) static struct md_sysfs_entry md_metadata =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4819) __ATTR_PREALLOC(metadata_version, S_IRUGO|S_IWUSR, metadata_show, metadata_store);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4820) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4821) static ssize_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4822) action_show(struct mddev *mddev, char *page)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4823) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4824) 	char *type = "idle";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4825) 	unsigned long recovery = mddev->recovery;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4826) 	if (test_bit(MD_RECOVERY_FROZEN, &recovery))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4827) 		type = "frozen";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4828) 	else if (test_bit(MD_RECOVERY_RUNNING, &recovery) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4829) 	    (!mddev->ro && test_bit(MD_RECOVERY_NEEDED, &recovery))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4830) 		if (test_bit(MD_RECOVERY_RESHAPE, &recovery))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4831) 			type = "reshape";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4832) 		else if (test_bit(MD_RECOVERY_SYNC, &recovery)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4833) 			if (!test_bit(MD_RECOVERY_REQUESTED, &recovery))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4834) 				type = "resync";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4835) 			else if (test_bit(MD_RECOVERY_CHECK, &recovery))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4836) 				type = "check";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4837) 			else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4838) 				type = "repair";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4839) 		} else if (test_bit(MD_RECOVERY_RECOVER, &recovery))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4840) 			type = "recover";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4841) 		else if (mddev->reshape_position != MaxSector)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4842) 			type = "reshape";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4843) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4844) 	return sprintf(page, "%s\n", type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4845) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4846) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4847) static ssize_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4848) action_store(struct mddev *mddev, const char *page, size_t len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4849) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4850) 	if (!mddev->pers || !mddev->pers->sync_request)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4851) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4852) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4853) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4854) 	if (cmd_match(page, "idle") || cmd_match(page, "frozen")) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4855) 		if (cmd_match(page, "frozen"))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4856) 			set_bit(MD_RECOVERY_FROZEN, &mddev->recovery);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4857) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4858) 			clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4859) 		if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4860) 		    mddev_lock(mddev) == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4861) 			if (work_pending(&mddev->del_work))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4862) 				flush_workqueue(md_misc_wq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4863) 			if (mddev->sync_thread) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4864) 				set_bit(MD_RECOVERY_INTR, &mddev->recovery);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4865) 				md_reap_sync_thread(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4866) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4867) 			mddev_unlock(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4868) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4869) 	} else if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4870) 		return -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4871) 	else if (cmd_match(page, "resync"))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4872) 		clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4873) 	else if (cmd_match(page, "recover")) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4874) 		clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4875) 		set_bit(MD_RECOVERY_RECOVER, &mddev->recovery);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4876) 	} else if (cmd_match(page, "reshape")) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4877) 		int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4878) 		if (mddev->pers->start_reshape == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4879) 			return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4880) 		err = mddev_lock(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4881) 		if (!err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4882) 			if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4883) 				err =  -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4884) 			else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4885) 				clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4886) 				err = mddev->pers->start_reshape(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4887) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4888) 			mddev_unlock(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4889) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4890) 		if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4891) 			return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4892) 		sysfs_notify_dirent_safe(mddev->sysfs_degraded);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4893) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4894) 		if (cmd_match(page, "check"))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4895) 			set_bit(MD_RECOVERY_CHECK, &mddev->recovery);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4896) 		else if (!cmd_match(page, "repair"))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4897) 			return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4898) 		clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4899) 		set_bit(MD_RECOVERY_REQUESTED, &mddev->recovery);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4900) 		set_bit(MD_RECOVERY_SYNC, &mddev->recovery);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4901) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4902) 	if (mddev->ro == 2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4903) 		/* A write to sync_action is enough to justify
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4904) 		 * canceling read-auto mode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4905) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4906) 		mddev->ro = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4907) 		md_wakeup_thread(mddev->sync_thread);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4908) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4909) 	set_bit(MD_RECOVERY_NEEDED, &mddev->recovery);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4910) 	md_wakeup_thread(mddev->thread);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4911) 	sysfs_notify_dirent_safe(mddev->sysfs_action);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4912) 	return len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4913) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4914) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4915) static struct md_sysfs_entry md_scan_mode =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4916) __ATTR_PREALLOC(sync_action, S_IRUGO|S_IWUSR, action_show, action_store);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4917) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4918) static ssize_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4919) last_sync_action_show(struct mddev *mddev, char *page)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4920) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4921) 	return sprintf(page, "%s\n", mddev->last_sync_action);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4922) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4923) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4924) static struct md_sysfs_entry md_last_scan_mode = __ATTR_RO(last_sync_action);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4925) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4926) static ssize_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4927) mismatch_cnt_show(struct mddev *mddev, char *page)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4928) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4929) 	return sprintf(page, "%llu\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4930) 		       (unsigned long long)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4931) 		       atomic64_read(&mddev->resync_mismatches));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4932) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4933) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4934) static struct md_sysfs_entry md_mismatches = __ATTR_RO(mismatch_cnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4935) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4936) static ssize_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4937) sync_min_show(struct mddev *mddev, char *page)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4938) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4939) 	return sprintf(page, "%d (%s)\n", speed_min(mddev),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4940) 		       mddev->sync_speed_min ? "local": "system");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4941) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4942) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4943) static ssize_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4944) sync_min_store(struct mddev *mddev, const char *buf, size_t len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4945) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4946) 	unsigned int min;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4947) 	int rv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4948) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4949) 	if (strncmp(buf, "system", 6)==0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4950) 		min = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4951) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4952) 		rv = kstrtouint(buf, 10, &min);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4953) 		if (rv < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4954) 			return rv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4955) 		if (min == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4956) 			return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4957) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4958) 	mddev->sync_speed_min = min;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4959) 	return len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4960) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4961) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4962) static struct md_sysfs_entry md_sync_min =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4963) __ATTR(sync_speed_min, S_IRUGO|S_IWUSR, sync_min_show, sync_min_store);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4964) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4965) static ssize_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4966) sync_max_show(struct mddev *mddev, char *page)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4967) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4968) 	return sprintf(page, "%d (%s)\n", speed_max(mddev),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4969) 		       mddev->sync_speed_max ? "local": "system");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4970) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4971) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4972) static ssize_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4973) sync_max_store(struct mddev *mddev, const char *buf, size_t len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4974) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4975) 	unsigned int max;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4976) 	int rv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4977) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4978) 	if (strncmp(buf, "system", 6)==0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4979) 		max = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4980) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4981) 		rv = kstrtouint(buf, 10, &max);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4982) 		if (rv < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4983) 			return rv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4984) 		if (max == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4985) 			return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4986) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4987) 	mddev->sync_speed_max = max;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4988) 	return len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4989) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4990) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4991) static struct md_sysfs_entry md_sync_max =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4992) __ATTR(sync_speed_max, S_IRUGO|S_IWUSR, sync_max_show, sync_max_store);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4993) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4994) static ssize_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4995) degraded_show(struct mddev *mddev, char *page)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4996) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4997) 	return sprintf(page, "%d\n", mddev->degraded);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4998) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4999) static struct md_sysfs_entry md_degraded = __ATTR_RO(degraded);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5000) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5001) static ssize_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5002) sync_force_parallel_show(struct mddev *mddev, char *page)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5003) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5004) 	return sprintf(page, "%d\n", mddev->parallel_resync);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5005) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5006) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5007) static ssize_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5008) sync_force_parallel_store(struct mddev *mddev, const char *buf, size_t len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5009) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5010) 	long n;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5011) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5012) 	if (kstrtol(buf, 10, &n))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5013) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5014) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5015) 	if (n != 0 && n != 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5016) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5017) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5018) 	mddev->parallel_resync = n;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5019) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5020) 	if (mddev->sync_thread)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5021) 		wake_up(&resync_wait);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5022) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5023) 	return len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5024) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5025) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5026) /* force parallel resync, even with shared block devices */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5027) static struct md_sysfs_entry md_sync_force_parallel =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5028) __ATTR(sync_force_parallel, S_IRUGO|S_IWUSR,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5029)        sync_force_parallel_show, sync_force_parallel_store);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5030) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5031) static ssize_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5032) sync_speed_show(struct mddev *mddev, char *page)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5033) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5034) 	unsigned long resync, dt, db;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5035) 	if (mddev->curr_resync == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5036) 		return sprintf(page, "none\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5037) 	resync = mddev->curr_mark_cnt - atomic_read(&mddev->recovery_active);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5038) 	dt = (jiffies - mddev->resync_mark) / HZ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5039) 	if (!dt) dt++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5040) 	db = resync - mddev->resync_mark_cnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5041) 	return sprintf(page, "%lu\n", db/dt/2); /* K/sec */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5042) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5043) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5044) static struct md_sysfs_entry md_sync_speed = __ATTR_RO(sync_speed);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5045) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5046) static ssize_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5047) sync_completed_show(struct mddev *mddev, char *page)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5048) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5049) 	unsigned long long max_sectors, resync;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5050) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5051) 	if (!test_bit(MD_RECOVERY_RUNNING, &mddev->recovery))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5052) 		return sprintf(page, "none\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5053) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5054) 	if (mddev->curr_resync == 1 ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5055) 	    mddev->curr_resync == 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5056) 		return sprintf(page, "delayed\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5057) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5058) 	if (test_bit(MD_RECOVERY_SYNC, &mddev->recovery) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5059) 	    test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5060) 		max_sectors = mddev->resync_max_sectors;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5061) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5062) 		max_sectors = mddev->dev_sectors;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5063) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5064) 	resync = mddev->curr_resync_completed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5065) 	return sprintf(page, "%llu / %llu\n", resync, max_sectors);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5066) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5067) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5068) static struct md_sysfs_entry md_sync_completed =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5069) 	__ATTR_PREALLOC(sync_completed, S_IRUGO, sync_completed_show, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5070) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5071) static ssize_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5072) min_sync_show(struct mddev *mddev, char *page)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5073) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5074) 	return sprintf(page, "%llu\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5075) 		       (unsigned long long)mddev->resync_min);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5076) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5077) static ssize_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5078) min_sync_store(struct mddev *mddev, const char *buf, size_t len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5079) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5080) 	unsigned long long min;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5081) 	int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5082) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5083) 	if (kstrtoull(buf, 10, &min))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5084) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5085) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5086) 	spin_lock(&mddev->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5087) 	err = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5088) 	if (min > mddev->resync_max)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5089) 		goto out_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5090) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5091) 	err = -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5092) 	if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5093) 		goto out_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5094) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5095) 	/* Round down to multiple of 4K for safety */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5096) 	mddev->resync_min = round_down(min, 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5097) 	err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5098) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5099) out_unlock:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5100) 	spin_unlock(&mddev->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5101) 	return err ?: len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5102) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5103) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5104) static struct md_sysfs_entry md_min_sync =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5105) __ATTR(sync_min, S_IRUGO|S_IWUSR, min_sync_show, min_sync_store);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5106) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5107) static ssize_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5108) max_sync_show(struct mddev *mddev, char *page)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5109) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5110) 	if (mddev->resync_max == MaxSector)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5111) 		return sprintf(page, "max\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5112) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5113) 		return sprintf(page, "%llu\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5114) 			       (unsigned long long)mddev->resync_max);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5115) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5116) static ssize_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5117) max_sync_store(struct mddev *mddev, const char *buf, size_t len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5118) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5119) 	int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5120) 	spin_lock(&mddev->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5121) 	if (strncmp(buf, "max", 3) == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5122) 		mddev->resync_max = MaxSector;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5123) 	else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5124) 		unsigned long long max;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5125) 		int chunk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5126) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5127) 		err = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5128) 		if (kstrtoull(buf, 10, &max))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5129) 			goto out_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5130) 		if (max < mddev->resync_min)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5131) 			goto out_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5132) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5133) 		err = -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5134) 		if (max < mddev->resync_max &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5135) 		    mddev->ro == 0 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5136) 		    test_bit(MD_RECOVERY_RUNNING, &mddev->recovery))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5137) 			goto out_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5138) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5139) 		/* Must be a multiple of chunk_size */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5140) 		chunk = mddev->chunk_sectors;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5141) 		if (chunk) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5142) 			sector_t temp = max;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5143) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5144) 			err = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5145) 			if (sector_div(temp, chunk))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5146) 				goto out_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5147) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5148) 		mddev->resync_max = max;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5149) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5150) 	wake_up(&mddev->recovery_wait);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5151) 	err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5152) out_unlock:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5153) 	spin_unlock(&mddev->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5154) 	return err ?: len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5155) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5156) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5157) static struct md_sysfs_entry md_max_sync =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5158) __ATTR(sync_max, S_IRUGO|S_IWUSR, max_sync_show, max_sync_store);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5159) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5160) static ssize_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5161) suspend_lo_show(struct mddev *mddev, char *page)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5162) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5163) 	return sprintf(page, "%llu\n", (unsigned long long)mddev->suspend_lo);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5164) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5165) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5166) static ssize_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5167) suspend_lo_store(struct mddev *mddev, const char *buf, size_t len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5168) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5169) 	unsigned long long new;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5170) 	int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5171) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5172) 	err = kstrtoull(buf, 10, &new);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5173) 	if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5174) 		return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5175) 	if (new != (sector_t)new)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5176) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5177) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5178) 	err = mddev_lock(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5179) 	if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5180) 		return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5181) 	err = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5182) 	if (mddev->pers == NULL ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5183) 	    mddev->pers->quiesce == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5184) 		goto unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5185) 	mddev_suspend(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5186) 	mddev->suspend_lo = new;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5187) 	mddev_resume(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5188) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5189) 	err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5190) unlock:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5191) 	mddev_unlock(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5192) 	return err ?: len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5193) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5194) static struct md_sysfs_entry md_suspend_lo =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5195) __ATTR(suspend_lo, S_IRUGO|S_IWUSR, suspend_lo_show, suspend_lo_store);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5196) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5197) static ssize_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5198) suspend_hi_show(struct mddev *mddev, char *page)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5199) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5200) 	return sprintf(page, "%llu\n", (unsigned long long)mddev->suspend_hi);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5201) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5202) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5203) static ssize_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5204) suspend_hi_store(struct mddev *mddev, const char *buf, size_t len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5205) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5206) 	unsigned long long new;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5207) 	int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5208) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5209) 	err = kstrtoull(buf, 10, &new);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5210) 	if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5211) 		return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5212) 	if (new != (sector_t)new)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5213) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5214) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5215) 	err = mddev_lock(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5216) 	if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5217) 		return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5218) 	err = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5219) 	if (mddev->pers == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5220) 		goto unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5221) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5222) 	mddev_suspend(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5223) 	mddev->suspend_hi = new;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5224) 	mddev_resume(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5225) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5226) 	err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5227) unlock:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5228) 	mddev_unlock(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5229) 	return err ?: len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5230) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5231) static struct md_sysfs_entry md_suspend_hi =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5232) __ATTR(suspend_hi, S_IRUGO|S_IWUSR, suspend_hi_show, suspend_hi_store);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5233) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5234) static ssize_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5235) reshape_position_show(struct mddev *mddev, char *page)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5236) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5237) 	if (mddev->reshape_position != MaxSector)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5238) 		return sprintf(page, "%llu\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5239) 			       (unsigned long long)mddev->reshape_position);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5240) 	strcpy(page, "none\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5241) 	return 5;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5242) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5243) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5244) static ssize_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5245) reshape_position_store(struct mddev *mddev, const char *buf, size_t len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5246) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5247) 	struct md_rdev *rdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5248) 	unsigned long long new;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5249) 	int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5250) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5251) 	err = kstrtoull(buf, 10, &new);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5252) 	if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5253) 		return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5254) 	if (new != (sector_t)new)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5255) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5256) 	err = mddev_lock(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5257) 	if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5258) 		return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5259) 	err = -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5260) 	if (mddev->pers)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5261) 		goto unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5262) 	mddev->reshape_position = new;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5263) 	mddev->delta_disks = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5264) 	mddev->reshape_backwards = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5265) 	mddev->new_level = mddev->level;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5266) 	mddev->new_layout = mddev->layout;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5267) 	mddev->new_chunk_sectors = mddev->chunk_sectors;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5268) 	rdev_for_each(rdev, mddev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5269) 		rdev->new_data_offset = rdev->data_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5270) 	err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5271) unlock:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5272) 	mddev_unlock(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5273) 	return err ?: len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5274) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5275) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5276) static struct md_sysfs_entry md_reshape_position =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5277) __ATTR(reshape_position, S_IRUGO|S_IWUSR, reshape_position_show,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5278)        reshape_position_store);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5279) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5280) static ssize_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5281) reshape_direction_show(struct mddev *mddev, char *page)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5282) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5283) 	return sprintf(page, "%s\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5284) 		       mddev->reshape_backwards ? "backwards" : "forwards");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5285) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5286) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5287) static ssize_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5288) reshape_direction_store(struct mddev *mddev, const char *buf, size_t len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5289) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5290) 	int backwards = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5291) 	int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5292) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5293) 	if (cmd_match(buf, "forwards"))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5294) 		backwards = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5295) 	else if (cmd_match(buf, "backwards"))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5296) 		backwards = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5297) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5298) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5299) 	if (mddev->reshape_backwards == backwards)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5300) 		return len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5301) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5302) 	err = mddev_lock(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5303) 	if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5304) 		return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5305) 	/* check if we are allowed to change */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5306) 	if (mddev->delta_disks)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5307) 		err = -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5308) 	else if (mddev->persistent &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5309) 	    mddev->major_version == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5310) 		err =  -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5311) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5312) 		mddev->reshape_backwards = backwards;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5313) 	mddev_unlock(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5314) 	return err ?: len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5315) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5316) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5317) static struct md_sysfs_entry md_reshape_direction =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5318) __ATTR(reshape_direction, S_IRUGO|S_IWUSR, reshape_direction_show,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5319)        reshape_direction_store);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5320) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5321) static ssize_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5322) array_size_show(struct mddev *mddev, char *page)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5323) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5324) 	if (mddev->external_size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5325) 		return sprintf(page, "%llu\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5326) 			       (unsigned long long)mddev->array_sectors/2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5327) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5328) 		return sprintf(page, "default\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5329) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5330) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5331) static ssize_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5332) array_size_store(struct mddev *mddev, const char *buf, size_t len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5333) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5334) 	sector_t sectors;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5335) 	int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5336) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5337) 	err = mddev_lock(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5338) 	if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5339) 		return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5340) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5341) 	/* cluster raid doesn't support change array_sectors */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5342) 	if (mddev_is_clustered(mddev)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5343) 		mddev_unlock(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5344) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5345) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5346) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5347) 	if (strncmp(buf, "default", 7) == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5348) 		if (mddev->pers)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5349) 			sectors = mddev->pers->size(mddev, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5350) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5351) 			sectors = mddev->array_sectors;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5352) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5353) 		mddev->external_size = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5354) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5355) 		if (strict_blocks_to_sectors(buf, &sectors) < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5356) 			err = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5357) 		else if (mddev->pers && mddev->pers->size(mddev, 0, 0) < sectors)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5358) 			err = -E2BIG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5359) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5360) 			mddev->external_size = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5361) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5362) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5363) 	if (!err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5364) 		mddev->array_sectors = sectors;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5365) 		if (mddev->pers) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5366) 			set_capacity(mddev->gendisk, mddev->array_sectors);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5367) 			revalidate_disk_size(mddev->gendisk, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5368) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5369) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5370) 	mddev_unlock(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5371) 	return err ?: len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5372) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5373) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5374) static struct md_sysfs_entry md_array_size =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5375) __ATTR(array_size, S_IRUGO|S_IWUSR, array_size_show,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5376)        array_size_store);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5377) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5378) static ssize_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5379) consistency_policy_show(struct mddev *mddev, char *page)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5380) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5381) 	int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5382) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5383) 	if (test_bit(MD_HAS_JOURNAL, &mddev->flags)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5384) 		ret = sprintf(page, "journal\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5385) 	} else if (test_bit(MD_HAS_PPL, &mddev->flags)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5386) 		ret = sprintf(page, "ppl\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5387) 	} else if (mddev->bitmap) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5388) 		ret = sprintf(page, "bitmap\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5389) 	} else if (mddev->pers) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5390) 		if (mddev->pers->sync_request)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5391) 			ret = sprintf(page, "resync\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5392) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5393) 			ret = sprintf(page, "none\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5394) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5395) 		ret = sprintf(page, "unknown\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5396) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5397) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5398) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5399) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5400) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5401) static ssize_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5402) consistency_policy_store(struct mddev *mddev, const char *buf, size_t len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5403) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5404) 	int err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5405) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5406) 	if (mddev->pers) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5407) 		if (mddev->pers->change_consistency_policy)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5408) 			err = mddev->pers->change_consistency_policy(mddev, buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5409) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5410) 			err = -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5411) 	} else if (mddev->external && strncmp(buf, "ppl", 3) == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5412) 		set_bit(MD_HAS_PPL, &mddev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5413) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5414) 		err = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5415) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5416) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5417) 	return err ? err : len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5418) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5419) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5420) static struct md_sysfs_entry md_consistency_policy =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5421) __ATTR(consistency_policy, S_IRUGO | S_IWUSR, consistency_policy_show,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5422)        consistency_policy_store);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5423) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5424) static ssize_t fail_last_dev_show(struct mddev *mddev, char *page)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5425) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5426) 	return sprintf(page, "%d\n", mddev->fail_last_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5427) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5428) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5429) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5430)  * Setting fail_last_dev to true to allow last device to be forcibly removed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5431)  * from RAID1/RAID10.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5432)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5433) static ssize_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5434) fail_last_dev_store(struct mddev *mddev, const char *buf, size_t len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5435) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5436) 	int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5437) 	bool value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5438) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5439) 	ret = kstrtobool(buf, &value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5440) 	if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5441) 		return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5442) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5443) 	if (value != mddev->fail_last_dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5444) 		mddev->fail_last_dev = value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5445) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5446) 	return len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5447) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5448) static struct md_sysfs_entry md_fail_last_dev =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5449) __ATTR(fail_last_dev, S_IRUGO | S_IWUSR, fail_last_dev_show,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5450)        fail_last_dev_store);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5451) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5452) static ssize_t serialize_policy_show(struct mddev *mddev, char *page)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5453) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5454) 	if (mddev->pers == NULL || (mddev->pers->level != 1))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5455) 		return sprintf(page, "n/a\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5456) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5457) 		return sprintf(page, "%d\n", mddev->serialize_policy);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5458) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5459) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5460) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5461)  * Setting serialize_policy to true to enforce write IO is not reordered
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5462)  * for raid1.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5463)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5464) static ssize_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5465) serialize_policy_store(struct mddev *mddev, const char *buf, size_t len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5466) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5467) 	int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5468) 	bool value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5469) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5470) 	err = kstrtobool(buf, &value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5471) 	if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5472) 		return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5473) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5474) 	if (value == mddev->serialize_policy)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5475) 		return len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5476) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5477) 	err = mddev_lock(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5478) 	if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5479) 		return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5480) 	if (mddev->pers == NULL || (mddev->pers->level != 1)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5481) 		pr_err("md: serialize_policy is only effective for raid1\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5482) 		err = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5483) 		goto unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5484) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5485) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5486) 	mddev_suspend(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5487) 	if (value)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5488) 		mddev_create_serial_pool(mddev, NULL, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5489) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5490) 		mddev_destroy_serial_pool(mddev, NULL, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5491) 	mddev->serialize_policy = value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5492) 	mddev_resume(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5493) unlock:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5494) 	mddev_unlock(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5495) 	return err ?: len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5496) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5497) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5498) static struct md_sysfs_entry md_serialize_policy =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5499) __ATTR(serialize_policy, S_IRUGO | S_IWUSR, serialize_policy_show,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5500)        serialize_policy_store);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5501) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5502) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5503) static struct attribute *md_default_attrs[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5504) 	&md_level.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5505) 	&md_layout.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5506) 	&md_raid_disks.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5507) 	&md_uuid.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5508) 	&md_chunk_size.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5509) 	&md_size.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5510) 	&md_resync_start.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5511) 	&md_metadata.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5512) 	&md_new_device.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5513) 	&md_safe_delay.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5514) 	&md_array_state.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5515) 	&md_reshape_position.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5516) 	&md_reshape_direction.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5517) 	&md_array_size.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5518) 	&max_corr_read_errors.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5519) 	&md_consistency_policy.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5520) 	&md_fail_last_dev.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5521) 	&md_serialize_policy.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5522) 	NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5523) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5524) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5525) static struct attribute *md_redundancy_attrs[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5526) 	&md_scan_mode.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5527) 	&md_last_scan_mode.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5528) 	&md_mismatches.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5529) 	&md_sync_min.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5530) 	&md_sync_max.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5531) 	&md_sync_speed.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5532) 	&md_sync_force_parallel.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5533) 	&md_sync_completed.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5534) 	&md_min_sync.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5535) 	&md_max_sync.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5536) 	&md_suspend_lo.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5537) 	&md_suspend_hi.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5538) 	&md_bitmap.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5539) 	&md_degraded.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5540) 	NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5541) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5542) static struct attribute_group md_redundancy_group = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5543) 	.name = NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5544) 	.attrs = md_redundancy_attrs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5545) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5546) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5547) static ssize_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5548) md_attr_show(struct kobject *kobj, struct attribute *attr, char *page)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5549) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5550) 	struct md_sysfs_entry *entry = container_of(attr, struct md_sysfs_entry, attr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5551) 	struct mddev *mddev = container_of(kobj, struct mddev, kobj);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5552) 	ssize_t rv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5553) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5554) 	if (!entry->show)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5555) 		return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5556) 	spin_lock(&all_mddevs_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5557) 	if (list_empty(&mddev->all_mddevs)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5558) 		spin_unlock(&all_mddevs_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5559) 		return -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5560) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5561) 	mddev_get(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5562) 	spin_unlock(&all_mddevs_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5563) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5564) 	rv = entry->show(mddev, page);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5565) 	mddev_put(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5566) 	return rv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5567) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5568) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5569) static ssize_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5570) md_attr_store(struct kobject *kobj, struct attribute *attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5571) 	      const char *page, size_t length)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5572) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5573) 	struct md_sysfs_entry *entry = container_of(attr, struct md_sysfs_entry, attr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5574) 	struct mddev *mddev = container_of(kobj, struct mddev, kobj);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5575) 	ssize_t rv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5576) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5577) 	if (!entry->store)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5578) 		return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5579) 	if (!capable(CAP_SYS_ADMIN))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5580) 		return -EACCES;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5581) 	spin_lock(&all_mddevs_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5582) 	if (list_empty(&mddev->all_mddevs)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5583) 		spin_unlock(&all_mddevs_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5584) 		return -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5585) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5586) 	mddev_get(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5587) 	spin_unlock(&all_mddevs_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5588) 	rv = entry->store(mddev, page, length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5589) 	mddev_put(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5590) 	return rv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5591) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5592) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5593) static void md_free(struct kobject *ko)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5594) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5595) 	struct mddev *mddev = container_of(ko, struct mddev, kobj);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5596) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5597) 	if (mddev->sysfs_state)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5598) 		sysfs_put(mddev->sysfs_state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5599) 	if (mddev->sysfs_level)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5600) 		sysfs_put(mddev->sysfs_level);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5601) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5602) 	if (mddev->gendisk)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5603) 		del_gendisk(mddev->gendisk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5604) 	if (mddev->queue)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5605) 		blk_cleanup_queue(mddev->queue);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5606) 	if (mddev->gendisk)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5607) 		put_disk(mddev->gendisk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5608) 	percpu_ref_exit(&mddev->writes_pending);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5609) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5610) 	bioset_exit(&mddev->bio_set);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5611) 	bioset_exit(&mddev->sync_set);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5612) 	kfree(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5613) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5614) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5615) static const struct sysfs_ops md_sysfs_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5616) 	.show	= md_attr_show,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5617) 	.store	= md_attr_store,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5618) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5619) static struct kobj_type md_ktype = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5620) 	.release	= md_free,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5621) 	.sysfs_ops	= &md_sysfs_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5622) 	.default_attrs	= md_default_attrs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5623) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5624) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5625) int mdp_major = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5626) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5627) static void mddev_delayed_delete(struct work_struct *ws)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5628) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5629) 	struct mddev *mddev = container_of(ws, struct mddev, del_work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5630) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5631) 	sysfs_remove_group(&mddev->kobj, &md_bitmap_group);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5632) 	kobject_del(&mddev->kobj);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5633) 	kobject_put(&mddev->kobj);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5634) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5635) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5636) static void no_op(struct percpu_ref *r) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5637) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5638) int mddev_init_writes_pending(struct mddev *mddev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5639) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5640) 	if (mddev->writes_pending.percpu_count_ptr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5641) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5642) 	if (percpu_ref_init(&mddev->writes_pending, no_op,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5643) 			    PERCPU_REF_ALLOW_REINIT, GFP_KERNEL) < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5644) 		return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5645) 	/* We want to start with the refcount at zero */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5646) 	percpu_ref_put(&mddev->writes_pending);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5647) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5648) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5649) EXPORT_SYMBOL_GPL(mddev_init_writes_pending);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5650) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5651) static int md_alloc(dev_t dev, char *name)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5652) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5653) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5654) 	 * If dev is zero, name is the name of a device to allocate with
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5655) 	 * an arbitrary minor number.  It will be "md_???"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5656) 	 * If dev is non-zero it must be a device number with a MAJOR of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5657) 	 * MD_MAJOR or mdp_major.  In this case, if "name" is NULL, then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5658) 	 * the device is being created by opening a node in /dev.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5659) 	 * If "name" is not NULL, the device is being created by
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5660) 	 * writing to /sys/module/md_mod/parameters/new_array.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5661) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5662) 	static DEFINE_MUTEX(disks_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5663) 	struct mddev *mddev = mddev_find_or_alloc(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5664) 	struct gendisk *disk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5665) 	int partitioned;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5666) 	int shift;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5667) 	int unit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5668) 	int error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5669) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5670) 	if (!mddev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5671) 		return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5672) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5673) 	partitioned = (MAJOR(mddev->unit) != MD_MAJOR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5674) 	shift = partitioned ? MdpMinorShift : 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5675) 	unit = MINOR(mddev->unit) >> shift;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5676) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5677) 	/* wait for any previous instance of this device to be
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5678) 	 * completely removed (mddev_delayed_delete).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5679) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5680) 	flush_workqueue(md_misc_wq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5681) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5682) 	mutex_lock(&disks_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5683) 	error = -EEXIST;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5684) 	if (mddev->gendisk)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5685) 		goto abort;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5686) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5687) 	if (name && !dev) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5688) 		/* Need to ensure that 'name' is not a duplicate.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5689) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5690) 		struct mddev *mddev2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5691) 		spin_lock(&all_mddevs_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5692) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5693) 		list_for_each_entry(mddev2, &all_mddevs, all_mddevs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5694) 			if (mddev2->gendisk &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5695) 			    strcmp(mddev2->gendisk->disk_name, name) == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5696) 				spin_unlock(&all_mddevs_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5697) 				goto abort;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5698) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5699) 		spin_unlock(&all_mddevs_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5700) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5701) 	if (name && dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5702) 		/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5703) 		 * Creating /dev/mdNNN via "newarray", so adjust hold_active.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5704) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5705) 		mddev->hold_active = UNTIL_STOP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5706) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5707) 	error = -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5708) 	mddev->queue = blk_alloc_queue(NUMA_NO_NODE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5709) 	if (!mddev->queue)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5710) 		goto abort;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5711) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5712) 	blk_set_stacking_limits(&mddev->queue->limits);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5713) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5714) 	disk = alloc_disk(1 << shift);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5715) 	if (!disk) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5716) 		blk_cleanup_queue(mddev->queue);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5717) 		mddev->queue = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5718) 		goto abort;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5719) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5720) 	disk->major = MAJOR(mddev->unit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5721) 	disk->first_minor = unit << shift;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5722) 	if (name)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5723) 		strcpy(disk->disk_name, name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5724) 	else if (partitioned)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5725) 		sprintf(disk->disk_name, "md_d%d", unit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5726) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5727) 		sprintf(disk->disk_name, "md%d", unit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5728) 	disk->fops = &md_fops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5729) 	disk->private_data = mddev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5730) 	disk->queue = mddev->queue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5731) 	blk_queue_write_cache(mddev->queue, true, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5732) 	/* Allow extended partitions.  This makes the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5733) 	 * 'mdp' device redundant, but we can't really
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5734) 	 * remove it now.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5735) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5736) 	disk->flags |= GENHD_FL_EXT_DEVT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5737) 	disk->events |= DISK_EVENT_MEDIA_CHANGE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5738) 	mddev->gendisk = disk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5739) 	add_disk(disk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5740) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5741) 	error = kobject_add(&mddev->kobj, &disk_to_dev(disk)->kobj, "%s", "md");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5742) 	if (error) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5743) 		/* This isn't possible, but as kobject_init_and_add is marked
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5744) 		 * __must_check, we must do something with the result
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5745) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5746) 		pr_debug("md: cannot register %s/md - name in use\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5747) 			 disk->disk_name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5748) 		error = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5749) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5750) 	if (mddev->kobj.sd &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5751) 	    sysfs_create_group(&mddev->kobj, &md_bitmap_group))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5752) 		pr_debug("pointless warning\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5753)  abort:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5754) 	mutex_unlock(&disks_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5755) 	if (!error && mddev->kobj.sd) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5756) 		kobject_uevent(&mddev->kobj, KOBJ_ADD);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5757) 		mddev->sysfs_state = sysfs_get_dirent_safe(mddev->kobj.sd, "array_state");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5758) 		mddev->sysfs_level = sysfs_get_dirent_safe(mddev->kobj.sd, "level");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5759) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5760) 	mddev_put(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5761) 	return error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5762) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5763) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5764) static struct kobject *md_probe(dev_t dev, int *part, void *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5765) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5766) 	if (create_on_open)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5767) 		md_alloc(dev, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5768) 	return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5769) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5770) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5771) static int add_named_array(const char *val, const struct kernel_param *kp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5772) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5773) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5774) 	 * val must be "md_*" or "mdNNN".
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5775) 	 * For "md_*" we allocate an array with a large free minor number, and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5776) 	 * set the name to val.  val must not already be an active name.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5777) 	 * For "mdNNN" we allocate an array with the minor number NNN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5778) 	 * which must not already be in use.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5779) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5780) 	int len = strlen(val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5781) 	char buf[DISK_NAME_LEN];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5782) 	unsigned long devnum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5783) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5784) 	while (len && val[len-1] == '\n')
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5785) 		len--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5786) 	if (len >= DISK_NAME_LEN)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5787) 		return -E2BIG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5788) 	strlcpy(buf, val, len+1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5789) 	if (strncmp(buf, "md_", 3) == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5790) 		return md_alloc(0, buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5791) 	if (strncmp(buf, "md", 2) == 0 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5792) 	    isdigit(buf[2]) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5793) 	    kstrtoul(buf+2, 10, &devnum) == 0 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5794) 	    devnum <= MINORMASK)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5795) 		return md_alloc(MKDEV(MD_MAJOR, devnum), NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5796) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5797) 	return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5798) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5799) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5800) static void md_safemode_timeout(struct timer_list *t)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5801) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5802) 	struct mddev *mddev = from_timer(mddev, t, safemode_timer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5803) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5804) 	mddev->safemode = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5805) 	if (mddev->external)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5806) 		sysfs_notify_dirent_safe(mddev->sysfs_state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5807) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5808) 	md_wakeup_thread(mddev->thread);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5809) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5810) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5811) static int start_dirty_degraded;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5812) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5813) int md_run(struct mddev *mddev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5814) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5815) 	int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5816) 	struct md_rdev *rdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5817) 	struct md_personality *pers;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5818) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5819) 	if (list_empty(&mddev->disks))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5820) 		/* cannot run an array with no devices.. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5821) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5822) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5823) 	if (mddev->pers)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5824) 		return -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5825) 	/* Cannot run until previous stop completes properly */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5826) 	if (mddev->sysfs_active)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5827) 		return -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5828) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5829) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5830) 	 * Analyze all RAID superblock(s)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5831) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5832) 	if (!mddev->raid_disks) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5833) 		if (!mddev->persistent)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5834) 			return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5835) 		err = analyze_sbs(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5836) 		if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5837) 			return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5838) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5839) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5840) 	if (mddev->level != LEVEL_NONE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5841) 		request_module("md-level-%d", mddev->level);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5842) 	else if (mddev->clevel[0])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5843) 		request_module("md-%s", mddev->clevel);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5844) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5845) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5846) 	 * Drop all container device buffers, from now on
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5847) 	 * the only valid external interface is through the md
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5848) 	 * device.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5849) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5850) 	mddev->has_superblocks = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5851) 	rdev_for_each(rdev, mddev) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5852) 		if (test_bit(Faulty, &rdev->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5853) 			continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5854) 		sync_blockdev(rdev->bdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5855) 		invalidate_bdev(rdev->bdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5856) 		if (mddev->ro != 1 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5857) 		    (bdev_read_only(rdev->bdev) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5858) 		     bdev_read_only(rdev->meta_bdev))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5859) 			mddev->ro = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5860) 			if (mddev->gendisk)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5861) 				set_disk_ro(mddev->gendisk, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5862) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5863) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5864) 		if (rdev->sb_page)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5865) 			mddev->has_superblocks = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5866) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5867) 		/* perform some consistency tests on the device.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5868) 		 * We don't want the data to overlap the metadata,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5869) 		 * Internal Bitmap issues have been handled elsewhere.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5870) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5871) 		if (rdev->meta_bdev) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5872) 			/* Nothing to check */;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5873) 		} else if (rdev->data_offset < rdev->sb_start) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5874) 			if (mddev->dev_sectors &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5875) 			    rdev->data_offset + mddev->dev_sectors
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5876) 			    > rdev->sb_start) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5877) 				pr_warn("md: %s: data overlaps metadata\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5878) 					mdname(mddev));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5879) 				return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5880) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5881) 		} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5882) 			if (rdev->sb_start + rdev->sb_size/512
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5883) 			    > rdev->data_offset) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5884) 				pr_warn("md: %s: metadata overlaps data\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5885) 					mdname(mddev));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5886) 				return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5887) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5888) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5889) 		sysfs_notify_dirent_safe(rdev->sysfs_state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5890) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5891) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5892) 	if (!bioset_initialized(&mddev->bio_set)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5893) 		err = bioset_init(&mddev->bio_set, BIO_POOL_SIZE, 0, BIOSET_NEED_BVECS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5894) 		if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5895) 			return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5896) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5897) 	if (!bioset_initialized(&mddev->sync_set)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5898) 		err = bioset_init(&mddev->sync_set, BIO_POOL_SIZE, 0, BIOSET_NEED_BVECS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5899) 		if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5900) 			return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5901) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5902) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5903) 	spin_lock(&pers_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5904) 	pers = find_pers(mddev->level, mddev->clevel);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5905) 	if (!pers || !try_module_get(pers->owner)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5906) 		spin_unlock(&pers_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5907) 		if (mddev->level != LEVEL_NONE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5908) 			pr_warn("md: personality for level %d is not loaded!\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5909) 				mddev->level);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5910) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5911) 			pr_warn("md: personality for level %s is not loaded!\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5912) 				mddev->clevel);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5913) 		err = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5914) 		goto abort;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5915) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5916) 	spin_unlock(&pers_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5917) 	if (mddev->level != pers->level) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5918) 		mddev->level = pers->level;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5919) 		mddev->new_level = pers->level;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5920) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5921) 	strlcpy(mddev->clevel, pers->name, sizeof(mddev->clevel));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5922) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5923) 	if (mddev->reshape_position != MaxSector &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5924) 	    pers->start_reshape == NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5925) 		/* This personality cannot handle reshaping... */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5926) 		module_put(pers->owner);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5927) 		err = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5928) 		goto abort;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5929) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5930) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5931) 	if (pers->sync_request) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5932) 		/* Warn if this is a potentially silly
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5933) 		 * configuration.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5934) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5935) 		char b[BDEVNAME_SIZE], b2[BDEVNAME_SIZE];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5936) 		struct md_rdev *rdev2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5937) 		int warned = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5938) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5939) 		rdev_for_each(rdev, mddev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5940) 			rdev_for_each(rdev2, mddev) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5941) 				if (rdev < rdev2 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5942) 				    rdev->bdev->bd_disk ==
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5943) 				    rdev2->bdev->bd_disk) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5944) 					pr_warn("%s: WARNING: %s appears to be on the same physical disk as %s.\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5945) 						mdname(mddev),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5946) 						bdevname(rdev->bdev,b),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5947) 						bdevname(rdev2->bdev,b2));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5948) 					warned = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5949) 				}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5950) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5951) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5952) 		if (warned)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5953) 			pr_warn("True protection against single-disk failure might be compromised.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5954) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5955) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5956) 	mddev->recovery = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5957) 	/* may be over-ridden by personality */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5958) 	mddev->resync_max_sectors = mddev->dev_sectors;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5959) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5960) 	mddev->ok_start_degraded = start_dirty_degraded;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5961) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5962) 	if (start_readonly && mddev->ro == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5963) 		mddev->ro = 2; /* read-only, but switch on first write */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5964) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5965) 	err = pers->run(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5966) 	if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5967) 		pr_warn("md: pers->run() failed ...\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5968) 	else if (pers->size(mddev, 0, 0) < mddev->array_sectors) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5969) 		WARN_ONCE(!mddev->external_size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5970) 			  "%s: default size too small, but 'external_size' not in effect?\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5971) 			  __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5972) 		pr_warn("md: invalid array_size %llu > default size %llu\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5973) 			(unsigned long long)mddev->array_sectors / 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5974) 			(unsigned long long)pers->size(mddev, 0, 0) / 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5975) 		err = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5976) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5977) 	if (err == 0 && pers->sync_request &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5978) 	    (mddev->bitmap_info.file || mddev->bitmap_info.offset)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5979) 		struct bitmap *bitmap;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5980) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5981) 		bitmap = md_bitmap_create(mddev, -1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5982) 		if (IS_ERR(bitmap)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5983) 			err = PTR_ERR(bitmap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5984) 			pr_warn("%s: failed to create bitmap (%d)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5985) 				mdname(mddev), err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5986) 		} else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5987) 			mddev->bitmap = bitmap;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5988) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5989) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5990) 	if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5991) 		goto bitmap_abort;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5992) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5993) 	if (mddev->bitmap_info.max_write_behind > 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5994) 		bool create_pool = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5995) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5996) 		rdev_for_each(rdev, mddev) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5997) 			if (test_bit(WriteMostly, &rdev->flags) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5998) 			    rdev_init_serial(rdev))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5999) 				create_pool = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6000) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6001) 		if (create_pool && mddev->serial_info_pool == NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6002) 			mddev->serial_info_pool =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6003) 				mempool_create_kmalloc_pool(NR_SERIAL_INFOS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6004) 						    sizeof(struct serial_info));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6005) 			if (!mddev->serial_info_pool) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6006) 				err = -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6007) 				goto bitmap_abort;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6008) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6009) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6010) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6011) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6012) 	if (mddev->queue) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6013) 		bool nonrot = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6014) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6015) 		rdev_for_each(rdev, mddev) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6016) 			if (rdev->raid_disk >= 0 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6017) 			    !blk_queue_nonrot(bdev_get_queue(rdev->bdev))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6018) 				nonrot = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6019) 				break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6020) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6021) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6022) 		if (mddev->degraded)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6023) 			nonrot = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6024) 		if (nonrot)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6025) 			blk_queue_flag_set(QUEUE_FLAG_NONROT, mddev->queue);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6026) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6027) 			blk_queue_flag_clear(QUEUE_FLAG_NONROT, mddev->queue);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6028) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6029) 	if (pers->sync_request) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6030) 		if (mddev->kobj.sd &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6031) 		    sysfs_create_group(&mddev->kobj, &md_redundancy_group))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6032) 			pr_warn("md: cannot register extra attributes for %s\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6033) 				mdname(mddev));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6034) 		mddev->sysfs_action = sysfs_get_dirent_safe(mddev->kobj.sd, "sync_action");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6035) 		mddev->sysfs_completed = sysfs_get_dirent_safe(mddev->kobj.sd, "sync_completed");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6036) 		mddev->sysfs_degraded = sysfs_get_dirent_safe(mddev->kobj.sd, "degraded");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6037) 	} else if (mddev->ro == 2) /* auto-readonly not meaningful */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6038) 		mddev->ro = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6039) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6040) 	atomic_set(&mddev->max_corr_read_errors,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6041) 		   MD_DEFAULT_MAX_CORRECTED_READ_ERRORS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6042) 	mddev->safemode = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6043) 	if (mddev_is_clustered(mddev))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6044) 		mddev->safemode_delay = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6045) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6046) 		mddev->safemode_delay = DEFAULT_SAFEMODE_DELAY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6047) 	mddev->in_sync = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6048) 	smp_wmb();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6049) 	spin_lock(&mddev->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6050) 	mddev->pers = pers;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6051) 	spin_unlock(&mddev->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6052) 	rdev_for_each(rdev, mddev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6053) 		if (rdev->raid_disk >= 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6054) 			sysfs_link_rdev(mddev, rdev); /* failure here is OK */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6055) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6056) 	if (mddev->degraded && !mddev->ro)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6057) 		/* This ensures that recovering status is reported immediately
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6058) 		 * via sysfs - until a lack of spares is confirmed.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6059) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6060) 		set_bit(MD_RECOVERY_RECOVER, &mddev->recovery);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6061) 	set_bit(MD_RECOVERY_NEEDED, &mddev->recovery);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6062) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6063) 	if (mddev->sb_flags)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6064) 		md_update_sb(mddev, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6065) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6066) 	md_new_event(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6067) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6068) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6069) bitmap_abort:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6070) 	mddev_detach(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6071) 	if (mddev->private)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6072) 		pers->free(mddev, mddev->private);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6073) 	mddev->private = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6074) 	module_put(pers->owner);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6075) 	md_bitmap_destroy(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6076) abort:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6077) 	bioset_exit(&mddev->bio_set);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6078) 	bioset_exit(&mddev->sync_set);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6079) 	return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6080) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6081) EXPORT_SYMBOL_GPL(md_run);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6082) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6083) int do_md_run(struct mddev *mddev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6084) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6085) 	int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6086) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6087) 	set_bit(MD_NOT_READY, &mddev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6088) 	err = md_run(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6089) 	if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6090) 		goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6091) 	err = md_bitmap_load(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6092) 	if (err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6093) 		md_bitmap_destroy(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6094) 		goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6095) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6096) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6097) 	if (mddev_is_clustered(mddev))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6098) 		md_allow_write(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6099) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6100) 	/* run start up tasks that require md_thread */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6101) 	md_start(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6102) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6103) 	md_wakeup_thread(mddev->thread);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6104) 	md_wakeup_thread(mddev->sync_thread); /* possibly kick off a reshape */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6105) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6106) 	set_capacity(mddev->gendisk, mddev->array_sectors);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6107) 	revalidate_disk_size(mddev->gendisk, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6108) 	clear_bit(MD_NOT_READY, &mddev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6109) 	mddev->changed = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6110) 	kobject_uevent(&disk_to_dev(mddev->gendisk)->kobj, KOBJ_CHANGE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6111) 	sysfs_notify_dirent_safe(mddev->sysfs_state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6112) 	sysfs_notify_dirent_safe(mddev->sysfs_action);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6113) 	sysfs_notify_dirent_safe(mddev->sysfs_degraded);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6114) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6115) 	clear_bit(MD_NOT_READY, &mddev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6116) 	return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6117) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6118) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6119) int md_start(struct mddev *mddev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6120) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6121) 	int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6122) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6123) 	if (mddev->pers->start) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6124) 		set_bit(MD_RECOVERY_WAIT, &mddev->recovery);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6125) 		md_wakeup_thread(mddev->thread);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6126) 		ret = mddev->pers->start(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6127) 		clear_bit(MD_RECOVERY_WAIT, &mddev->recovery);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6128) 		md_wakeup_thread(mddev->sync_thread);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6129) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6130) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6131) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6132) EXPORT_SYMBOL_GPL(md_start);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6133) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6134) static int restart_array(struct mddev *mddev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6135) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6136) 	struct gendisk *disk = mddev->gendisk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6137) 	struct md_rdev *rdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6138) 	bool has_journal = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6139) 	bool has_readonly = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6140) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6141) 	/* Complain if it has no devices */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6142) 	if (list_empty(&mddev->disks))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6143) 		return -ENXIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6144) 	if (!mddev->pers)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6145) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6146) 	if (!mddev->ro)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6147) 		return -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6148) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6149) 	rcu_read_lock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6150) 	rdev_for_each_rcu(rdev, mddev) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6151) 		if (test_bit(Journal, &rdev->flags) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6152) 		    !test_bit(Faulty, &rdev->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6153) 			has_journal = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6154) 		if (bdev_read_only(rdev->bdev))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6155) 			has_readonly = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6156) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6157) 	rcu_read_unlock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6158) 	if (test_bit(MD_HAS_JOURNAL, &mddev->flags) && !has_journal)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6159) 		/* Don't restart rw with journal missing/faulty */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6160) 			return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6161) 	if (has_readonly)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6162) 		return -EROFS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6163) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6164) 	mddev->safemode = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6165) 	mddev->ro = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6166) 	set_disk_ro(disk, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6167) 	pr_debug("md: %s switched to read-write mode.\n", mdname(mddev));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6168) 	/* Kick recovery or resync if necessary */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6169) 	set_bit(MD_RECOVERY_NEEDED, &mddev->recovery);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6170) 	md_wakeup_thread(mddev->thread);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6171) 	md_wakeup_thread(mddev->sync_thread);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6172) 	sysfs_notify_dirent_safe(mddev->sysfs_state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6173) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6174) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6175) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6176) static void md_clean(struct mddev *mddev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6177) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6178) 	mddev->array_sectors = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6179) 	mddev->external_size = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6180) 	mddev->dev_sectors = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6181) 	mddev->raid_disks = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6182) 	mddev->recovery_cp = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6183) 	mddev->resync_min = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6184) 	mddev->resync_max = MaxSector;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6185) 	mddev->reshape_position = MaxSector;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6186) 	mddev->external = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6187) 	mddev->persistent = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6188) 	mddev->level = LEVEL_NONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6189) 	mddev->clevel[0] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6190) 	mddev->flags = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6191) 	mddev->sb_flags = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6192) 	mddev->ro = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6193) 	mddev->metadata_type[0] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6194) 	mddev->chunk_sectors = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6195) 	mddev->ctime = mddev->utime = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6196) 	mddev->layout = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6197) 	mddev->max_disks = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6198) 	mddev->events = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6199) 	mddev->can_decrease_events = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6200) 	mddev->delta_disks = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6201) 	mddev->reshape_backwards = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6202) 	mddev->new_level = LEVEL_NONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6203) 	mddev->new_layout = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6204) 	mddev->new_chunk_sectors = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6205) 	mddev->curr_resync = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6206) 	atomic64_set(&mddev->resync_mismatches, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6207) 	mddev->suspend_lo = mddev->suspend_hi = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6208) 	mddev->sync_speed_min = mddev->sync_speed_max = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6209) 	mddev->recovery = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6210) 	mddev->in_sync = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6211) 	mddev->changed = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6212) 	mddev->degraded = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6213) 	mddev->safemode = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6214) 	mddev->private = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6215) 	mddev->cluster_info = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6216) 	mddev->bitmap_info.offset = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6217) 	mddev->bitmap_info.default_offset = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6218) 	mddev->bitmap_info.default_space = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6219) 	mddev->bitmap_info.chunksize = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6220) 	mddev->bitmap_info.daemon_sleep = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6221) 	mddev->bitmap_info.max_write_behind = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6222) 	mddev->bitmap_info.nodes = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6223) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6224) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6225) static void __md_stop_writes(struct mddev *mddev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6226) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6227) 	set_bit(MD_RECOVERY_FROZEN, &mddev->recovery);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6228) 	if (work_pending(&mddev->del_work))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6229) 		flush_workqueue(md_misc_wq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6230) 	if (mddev->sync_thread) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6231) 		set_bit(MD_RECOVERY_INTR, &mddev->recovery);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6232) 		md_reap_sync_thread(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6233) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6234) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6235) 	del_timer_sync(&mddev->safemode_timer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6236) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6237) 	if (mddev->pers && mddev->pers->quiesce) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6238) 		mddev->pers->quiesce(mddev, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6239) 		mddev->pers->quiesce(mddev, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6240) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6241) 	md_bitmap_flush(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6242) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6243) 	if (mddev->ro == 0 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6244) 	    ((!mddev->in_sync && !mddev_is_clustered(mddev)) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6245) 	     mddev->sb_flags)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6246) 		/* mark array as shutdown cleanly */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6247) 		if (!mddev_is_clustered(mddev))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6248) 			mddev->in_sync = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6249) 		md_update_sb(mddev, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6250) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6251) 	/* disable policy to guarantee rdevs free resources for serialization */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6252) 	mddev->serialize_policy = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6253) 	mddev_destroy_serial_pool(mddev, NULL, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6254) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6255) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6256) void md_stop_writes(struct mddev *mddev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6257) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6258) 	mddev_lock_nointr(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6259) 	__md_stop_writes(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6260) 	mddev_unlock(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6261) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6262) EXPORT_SYMBOL_GPL(md_stop_writes);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6263) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6264) static void mddev_detach(struct mddev *mddev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6265) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6266) 	md_bitmap_wait_behind_writes(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6267) 	if (mddev->pers && mddev->pers->quiesce && !mddev->suspended) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6268) 		mddev->pers->quiesce(mddev, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6269) 		mddev->pers->quiesce(mddev, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6270) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6271) 	md_unregister_thread(&mddev->thread);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6272) 	if (mddev->queue)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6273) 		blk_sync_queue(mddev->queue); /* the unplug fn references 'conf'*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6274) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6275) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6276) static void __md_stop(struct mddev *mddev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6277) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6278) 	struct md_personality *pers = mddev->pers;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6279) 	md_bitmap_destroy(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6280) 	mddev_detach(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6281) 	/* Ensure ->event_work is done */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6282) 	if (mddev->event_work.func)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6283) 		flush_workqueue(md_misc_wq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6284) 	spin_lock(&mddev->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6285) 	mddev->pers = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6286) 	spin_unlock(&mddev->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6287) 	pers->free(mddev, mddev->private);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6288) 	mddev->private = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6289) 	if (pers->sync_request && mddev->to_remove == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6290) 		mddev->to_remove = &md_redundancy_group;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6291) 	module_put(pers->owner);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6292) 	clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6293) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6294) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6295) void md_stop(struct mddev *mddev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6296) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6297) 	/* stop the array and free an attached data structures.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6298) 	 * This is called from dm-raid
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6299) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6300) 	__md_stop(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6301) 	bioset_exit(&mddev->bio_set);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6302) 	bioset_exit(&mddev->sync_set);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6303) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6304) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6305) EXPORT_SYMBOL_GPL(md_stop);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6306) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6307) static int md_set_readonly(struct mddev *mddev, struct block_device *bdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6308) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6309) 	int err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6310) 	int did_freeze = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6311) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6312) 	if (!test_bit(MD_RECOVERY_FROZEN, &mddev->recovery)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6313) 		did_freeze = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6314) 		set_bit(MD_RECOVERY_FROZEN, &mddev->recovery);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6315) 		md_wakeup_thread(mddev->thread);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6316) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6317) 	if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6318) 		set_bit(MD_RECOVERY_INTR, &mddev->recovery);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6319) 	if (mddev->sync_thread)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6320) 		/* Thread might be blocked waiting for metadata update
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6321) 		 * which will now never happen */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6322) 		wake_up_process(mddev->sync_thread->tsk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6323) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6324) 	if (mddev->external && test_bit(MD_SB_CHANGE_PENDING, &mddev->sb_flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6325) 		return -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6326) 	mddev_unlock(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6327) 	wait_event(resync_wait, !test_bit(MD_RECOVERY_RUNNING,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6328) 					  &mddev->recovery));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6329) 	wait_event(mddev->sb_wait,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6330) 		   !test_bit(MD_SB_CHANGE_PENDING, &mddev->sb_flags));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6331) 	mddev_lock_nointr(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6332) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6333) 	mutex_lock(&mddev->open_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6334) 	if ((mddev->pers && atomic_read(&mddev->openers) > !!bdev) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6335) 	    mddev->sync_thread ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6336) 	    test_bit(MD_RECOVERY_RUNNING, &mddev->recovery)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6337) 		pr_warn("md: %s still in use.\n",mdname(mddev));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6338) 		if (did_freeze) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6339) 			clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6340) 			set_bit(MD_RECOVERY_NEEDED, &mddev->recovery);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6341) 			md_wakeup_thread(mddev->thread);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6342) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6343) 		err = -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6344) 		goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6345) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6346) 	if (mddev->pers) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6347) 		__md_stop_writes(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6348) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6349) 		err  = -ENXIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6350) 		if (mddev->ro==1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6351) 			goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6352) 		mddev->ro = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6353) 		set_disk_ro(mddev->gendisk, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6354) 		clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6355) 		set_bit(MD_RECOVERY_NEEDED, &mddev->recovery);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6356) 		md_wakeup_thread(mddev->thread);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6357) 		sysfs_notify_dirent_safe(mddev->sysfs_state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6358) 		err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6359) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6360) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6361) 	mutex_unlock(&mddev->open_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6362) 	return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6363) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6364) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6365) /* mode:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6366)  *   0 - completely stop and dis-assemble array
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6367)  *   2 - stop but do not disassemble array
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6368)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6369) static int do_md_stop(struct mddev *mddev, int mode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6370) 		      struct block_device *bdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6371) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6372) 	struct gendisk *disk = mddev->gendisk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6373) 	struct md_rdev *rdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6374) 	int did_freeze = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6375) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6376) 	if (!test_bit(MD_RECOVERY_FROZEN, &mddev->recovery)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6377) 		did_freeze = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6378) 		set_bit(MD_RECOVERY_FROZEN, &mddev->recovery);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6379) 		md_wakeup_thread(mddev->thread);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6380) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6381) 	if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6382) 		set_bit(MD_RECOVERY_INTR, &mddev->recovery);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6383) 	if (mddev->sync_thread)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6384) 		/* Thread might be blocked waiting for metadata update
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6385) 		 * which will now never happen */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6386) 		wake_up_process(mddev->sync_thread->tsk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6387) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6388) 	mddev_unlock(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6389) 	wait_event(resync_wait, (mddev->sync_thread == NULL &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6390) 				 !test_bit(MD_RECOVERY_RUNNING,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6391) 					   &mddev->recovery)));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6392) 	mddev_lock_nointr(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6393) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6394) 	mutex_lock(&mddev->open_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6395) 	if ((mddev->pers && atomic_read(&mddev->openers) > !!bdev) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6396) 	    mddev->sysfs_active ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6397) 	    mddev->sync_thread ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6398) 	    test_bit(MD_RECOVERY_RUNNING, &mddev->recovery)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6399) 		pr_warn("md: %s still in use.\n",mdname(mddev));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6400) 		mutex_unlock(&mddev->open_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6401) 		if (did_freeze) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6402) 			clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6403) 			set_bit(MD_RECOVERY_NEEDED, &mddev->recovery);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6404) 			md_wakeup_thread(mddev->thread);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6405) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6406) 		return -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6407) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6408) 	if (mddev->pers) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6409) 		if (mddev->ro)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6410) 			set_disk_ro(disk, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6411) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6412) 		__md_stop_writes(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6413) 		__md_stop(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6414) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6415) 		/* tell userspace to handle 'inactive' */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6416) 		sysfs_notify_dirent_safe(mddev->sysfs_state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6417) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6418) 		rdev_for_each(rdev, mddev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6419) 			if (rdev->raid_disk >= 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6420) 				sysfs_unlink_rdev(mddev, rdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6421) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6422) 		set_capacity(disk, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6423) 		mutex_unlock(&mddev->open_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6424) 		mddev->changed = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6425) 		revalidate_disk_size(disk, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6426) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6427) 		if (mddev->ro)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6428) 			mddev->ro = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6429) 	} else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6430) 		mutex_unlock(&mddev->open_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6431) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6432) 	 * Free resources if final stop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6433) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6434) 	if (mode == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6435) 		pr_info("md: %s stopped.\n", mdname(mddev));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6436) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6437) 		if (mddev->bitmap_info.file) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6438) 			struct file *f = mddev->bitmap_info.file;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6439) 			spin_lock(&mddev->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6440) 			mddev->bitmap_info.file = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6441) 			spin_unlock(&mddev->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6442) 			fput(f);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6443) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6444) 		mddev->bitmap_info.offset = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6445) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6446) 		export_array(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6447) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6448) 		md_clean(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6449) 		if (mddev->hold_active == UNTIL_STOP)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6450) 			mddev->hold_active = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6451) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6452) 	md_new_event(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6453) 	sysfs_notify_dirent_safe(mddev->sysfs_state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6454) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6455) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6456) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6457) #ifndef MODULE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6458) static void autorun_array(struct mddev *mddev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6459) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6460) 	struct md_rdev *rdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6461) 	int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6462) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6463) 	if (list_empty(&mddev->disks))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6464) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6465) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6466) 	pr_info("md: running: ");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6467) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6468) 	rdev_for_each(rdev, mddev) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6469) 		char b[BDEVNAME_SIZE];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6470) 		pr_cont("<%s>", bdevname(rdev->bdev,b));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6471) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6472) 	pr_cont("\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6473) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6474) 	err = do_md_run(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6475) 	if (err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6476) 		pr_warn("md: do_md_run() returned %d\n", err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6477) 		do_md_stop(mddev, 0, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6478) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6479) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6480) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6481) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6482)  * lets try to run arrays based on all disks that have arrived
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6483)  * until now. (those are in pending_raid_disks)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6484)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6485)  * the method: pick the first pending disk, collect all disks with
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6486)  * the same UUID, remove all from the pending list and put them into
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6487)  * the 'same_array' list. Then order this list based on superblock
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6488)  * update time (freshest comes first), kick out 'old' disks and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6489)  * compare superblocks. If everything's fine then run it.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6490)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6491)  * If "unit" is allocated, then bump its reference count
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6492)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6493) static void autorun_devices(int part)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6494) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6495) 	struct md_rdev *rdev0, *rdev, *tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6496) 	struct mddev *mddev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6497) 	char b[BDEVNAME_SIZE];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6498) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6499) 	pr_info("md: autorun ...\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6500) 	while (!list_empty(&pending_raid_disks)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6501) 		int unit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6502) 		dev_t dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6503) 		LIST_HEAD(candidates);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6504) 		rdev0 = list_entry(pending_raid_disks.next,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6505) 					 struct md_rdev, same_set);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6506) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6507) 		pr_debug("md: considering %s ...\n", bdevname(rdev0->bdev,b));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6508) 		INIT_LIST_HEAD(&candidates);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6509) 		rdev_for_each_list(rdev, tmp, &pending_raid_disks)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6510) 			if (super_90_load(rdev, rdev0, 0) >= 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6511) 				pr_debug("md:  adding %s ...\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6512) 					 bdevname(rdev->bdev,b));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6513) 				list_move(&rdev->same_set, &candidates);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6514) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6515) 		/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6516) 		 * now we have a set of devices, with all of them having
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6517) 		 * mostly sane superblocks. It's time to allocate the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6518) 		 * mddev.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6519) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6520) 		if (part) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6521) 			dev = MKDEV(mdp_major,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6522) 				    rdev0->preferred_minor << MdpMinorShift);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6523) 			unit = MINOR(dev) >> MdpMinorShift;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6524) 		} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6525) 			dev = MKDEV(MD_MAJOR, rdev0->preferred_minor);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6526) 			unit = MINOR(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6527) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6528) 		if (rdev0->preferred_minor != unit) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6529) 			pr_warn("md: unit number in %s is bad: %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6530) 				bdevname(rdev0->bdev, b), rdev0->preferred_minor);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6531) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6532) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6533) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6534) 		md_probe(dev, NULL, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6535) 		mddev = mddev_find(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6536) 		if (!mddev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6537) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6538) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6539) 		if (mddev_lock(mddev))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6540) 			pr_warn("md: %s locked, cannot run\n", mdname(mddev));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6541) 		else if (mddev->raid_disks || mddev->major_version
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6542) 			 || !list_empty(&mddev->disks)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6543) 			pr_warn("md: %s already running, cannot run %s\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6544) 				mdname(mddev), bdevname(rdev0->bdev,b));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6545) 			mddev_unlock(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6546) 		} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6547) 			pr_debug("md: created %s\n", mdname(mddev));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6548) 			mddev->persistent = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6549) 			rdev_for_each_list(rdev, tmp, &candidates) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6550) 				list_del_init(&rdev->same_set);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6551) 				if (bind_rdev_to_array(rdev, mddev))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6552) 					export_rdev(rdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6553) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6554) 			autorun_array(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6555) 			mddev_unlock(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6556) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6557) 		/* on success, candidates will be empty, on error
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6558) 		 * it won't...
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6559) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6560) 		rdev_for_each_list(rdev, tmp, &candidates) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6561) 			list_del_init(&rdev->same_set);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6562) 			export_rdev(rdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6563) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6564) 		mddev_put(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6565) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6566) 	pr_info("md: ... autorun DONE.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6567) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6568) #endif /* !MODULE */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6569) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6570) static int get_version(void __user *arg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6571) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6572) 	mdu_version_t ver;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6573) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6574) 	ver.major = MD_MAJOR_VERSION;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6575) 	ver.minor = MD_MINOR_VERSION;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6576) 	ver.patchlevel = MD_PATCHLEVEL_VERSION;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6577) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6578) 	if (copy_to_user(arg, &ver, sizeof(ver)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6579) 		return -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6580) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6581) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6582) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6583) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6584) static int get_array_info(struct mddev *mddev, void __user *arg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6585) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6586) 	mdu_array_info_t info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6587) 	int nr,working,insync,failed,spare;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6588) 	struct md_rdev *rdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6589) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6590) 	nr = working = insync = failed = spare = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6591) 	rcu_read_lock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6592) 	rdev_for_each_rcu(rdev, mddev) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6593) 		nr++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6594) 		if (test_bit(Faulty, &rdev->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6595) 			failed++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6596) 		else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6597) 			working++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6598) 			if (test_bit(In_sync, &rdev->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6599) 				insync++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6600) 			else if (test_bit(Journal, &rdev->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6601) 				/* TODO: add journal count to md_u.h */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6602) 				;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6603) 			else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6604) 				spare++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6605) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6606) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6607) 	rcu_read_unlock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6608) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6609) 	info.major_version = mddev->major_version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6610) 	info.minor_version = mddev->minor_version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6611) 	info.patch_version = MD_PATCHLEVEL_VERSION;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6612) 	info.ctime         = clamp_t(time64_t, mddev->ctime, 0, U32_MAX);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6613) 	info.level         = mddev->level;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6614) 	info.size          = mddev->dev_sectors / 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6615) 	if (info.size != mddev->dev_sectors / 2) /* overflow */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6616) 		info.size = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6617) 	info.nr_disks      = nr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6618) 	info.raid_disks    = mddev->raid_disks;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6619) 	info.md_minor      = mddev->md_minor;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6620) 	info.not_persistent= !mddev->persistent;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6621) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6622) 	info.utime         = clamp_t(time64_t, mddev->utime, 0, U32_MAX);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6623) 	info.state         = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6624) 	if (mddev->in_sync)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6625) 		info.state = (1<<MD_SB_CLEAN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6626) 	if (mddev->bitmap && mddev->bitmap_info.offset)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6627) 		info.state |= (1<<MD_SB_BITMAP_PRESENT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6628) 	if (mddev_is_clustered(mddev))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6629) 		info.state |= (1<<MD_SB_CLUSTERED);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6630) 	info.active_disks  = insync;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6631) 	info.working_disks = working;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6632) 	info.failed_disks  = failed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6633) 	info.spare_disks   = spare;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6634) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6635) 	info.layout        = mddev->layout;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6636) 	info.chunk_size    = mddev->chunk_sectors << 9;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6637) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6638) 	if (copy_to_user(arg, &info, sizeof(info)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6639) 		return -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6640) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6641) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6642) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6643) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6644) static int get_bitmap_file(struct mddev *mddev, void __user * arg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6645) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6646) 	mdu_bitmap_file_t *file = NULL; /* too big for stack allocation */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6647) 	char *ptr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6648) 	int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6649) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6650) 	file = kzalloc(sizeof(*file), GFP_NOIO);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6651) 	if (!file)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6652) 		return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6653) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6654) 	err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6655) 	spin_lock(&mddev->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6656) 	/* bitmap enabled */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6657) 	if (mddev->bitmap_info.file) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6658) 		ptr = file_path(mddev->bitmap_info.file, file->pathname,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6659) 				sizeof(file->pathname));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6660) 		if (IS_ERR(ptr))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6661) 			err = PTR_ERR(ptr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6662) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6663) 			memmove(file->pathname, ptr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6664) 				sizeof(file->pathname)-(ptr-file->pathname));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6665) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6666) 	spin_unlock(&mddev->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6667) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6668) 	if (err == 0 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6669) 	    copy_to_user(arg, file, sizeof(*file)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6670) 		err = -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6671) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6672) 	kfree(file);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6673) 	return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6674) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6675) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6676) static int get_disk_info(struct mddev *mddev, void __user * arg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6677) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6678) 	mdu_disk_info_t info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6679) 	struct md_rdev *rdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6680) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6681) 	if (copy_from_user(&info, arg, sizeof(info)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6682) 		return -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6683) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6684) 	rcu_read_lock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6685) 	rdev = md_find_rdev_nr_rcu(mddev, info.number);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6686) 	if (rdev) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6687) 		info.major = MAJOR(rdev->bdev->bd_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6688) 		info.minor = MINOR(rdev->bdev->bd_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6689) 		info.raid_disk = rdev->raid_disk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6690) 		info.state = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6691) 		if (test_bit(Faulty, &rdev->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6692) 			info.state |= (1<<MD_DISK_FAULTY);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6693) 		else if (test_bit(In_sync, &rdev->flags)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6694) 			info.state |= (1<<MD_DISK_ACTIVE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6695) 			info.state |= (1<<MD_DISK_SYNC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6696) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6697) 		if (test_bit(Journal, &rdev->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6698) 			info.state |= (1<<MD_DISK_JOURNAL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6699) 		if (test_bit(WriteMostly, &rdev->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6700) 			info.state |= (1<<MD_DISK_WRITEMOSTLY);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6701) 		if (test_bit(FailFast, &rdev->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6702) 			info.state |= (1<<MD_DISK_FAILFAST);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6703) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6704) 		info.major = info.minor = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6705) 		info.raid_disk = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6706) 		info.state = (1<<MD_DISK_REMOVED);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6707) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6708) 	rcu_read_unlock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6709) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6710) 	if (copy_to_user(arg, &info, sizeof(info)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6711) 		return -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6712) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6713) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6714) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6715) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6716) int md_add_new_disk(struct mddev *mddev, struct mdu_disk_info_s *info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6717) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6718) 	char b[BDEVNAME_SIZE], b2[BDEVNAME_SIZE];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6719) 	struct md_rdev *rdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6720) 	dev_t dev = MKDEV(info->major,info->minor);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6721) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6722) 	if (mddev_is_clustered(mddev) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6723) 		!(info->state & ((1 << MD_DISK_CLUSTER_ADD) | (1 << MD_DISK_CANDIDATE)))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6724) 		pr_warn("%s: Cannot add to clustered mddev.\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6725) 			mdname(mddev));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6726) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6727) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6728) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6729) 	if (info->major != MAJOR(dev) || info->minor != MINOR(dev))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6730) 		return -EOVERFLOW;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6731) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6732) 	if (!mddev->raid_disks) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6733) 		int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6734) 		/* expecting a device which has a superblock */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6735) 		rdev = md_import_device(dev, mddev->major_version, mddev->minor_version);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6736) 		if (IS_ERR(rdev)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6737) 			pr_warn("md: md_import_device returned %ld\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6738) 				PTR_ERR(rdev));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6739) 			return PTR_ERR(rdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6740) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6741) 		if (!list_empty(&mddev->disks)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6742) 			struct md_rdev *rdev0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6743) 				= list_entry(mddev->disks.next,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6744) 					     struct md_rdev, same_set);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6745) 			err = super_types[mddev->major_version]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6746) 				.load_super(rdev, rdev0, mddev->minor_version);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6747) 			if (err < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6748) 				pr_warn("md: %s has different UUID to %s\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6749) 					bdevname(rdev->bdev,b),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6750) 					bdevname(rdev0->bdev,b2));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6751) 				export_rdev(rdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6752) 				return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6753) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6754) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6755) 		err = bind_rdev_to_array(rdev, mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6756) 		if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6757) 			export_rdev(rdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6758) 		return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6759) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6760) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6761) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6762) 	 * md_add_new_disk can be used once the array is assembled
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6763) 	 * to add "hot spares".  They must already have a superblock
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6764) 	 * written
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6765) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6766) 	if (mddev->pers) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6767) 		int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6768) 		if (!mddev->pers->hot_add_disk) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6769) 			pr_warn("%s: personality does not support diskops!\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6770) 				mdname(mddev));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6771) 			return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6772) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6773) 		if (mddev->persistent)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6774) 			rdev = md_import_device(dev, mddev->major_version,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6775) 						mddev->minor_version);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6776) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6777) 			rdev = md_import_device(dev, -1, -1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6778) 		if (IS_ERR(rdev)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6779) 			pr_warn("md: md_import_device returned %ld\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6780) 				PTR_ERR(rdev));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6781) 			return PTR_ERR(rdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6782) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6783) 		/* set saved_raid_disk if appropriate */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6784) 		if (!mddev->persistent) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6785) 			if (info->state & (1<<MD_DISK_SYNC)  &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6786) 			    info->raid_disk < mddev->raid_disks) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6787) 				rdev->raid_disk = info->raid_disk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6788) 				set_bit(In_sync, &rdev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6789) 				clear_bit(Bitmap_sync, &rdev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6790) 			} else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6791) 				rdev->raid_disk = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6792) 			rdev->saved_raid_disk = rdev->raid_disk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6793) 		} else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6794) 			super_types[mddev->major_version].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6795) 				validate_super(mddev, rdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6796) 		if ((info->state & (1<<MD_DISK_SYNC)) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6797) 		     rdev->raid_disk != info->raid_disk) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6798) 			/* This was a hot-add request, but events doesn't
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6799) 			 * match, so reject it.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6800) 			 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6801) 			export_rdev(rdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6802) 			return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6803) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6804) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6805) 		clear_bit(In_sync, &rdev->flags); /* just to be sure */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6806) 		if (info->state & (1<<MD_DISK_WRITEMOSTLY))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6807) 			set_bit(WriteMostly, &rdev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6808) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6809) 			clear_bit(WriteMostly, &rdev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6810) 		if (info->state & (1<<MD_DISK_FAILFAST))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6811) 			set_bit(FailFast, &rdev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6812) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6813) 			clear_bit(FailFast, &rdev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6814) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6815) 		if (info->state & (1<<MD_DISK_JOURNAL)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6816) 			struct md_rdev *rdev2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6817) 			bool has_journal = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6818) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6819) 			/* make sure no existing journal disk */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6820) 			rdev_for_each(rdev2, mddev) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6821) 				if (test_bit(Journal, &rdev2->flags)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6822) 					has_journal = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6823) 					break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6824) 				}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6825) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6826) 			if (has_journal || mddev->bitmap) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6827) 				export_rdev(rdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6828) 				return -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6829) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6830) 			set_bit(Journal, &rdev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6831) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6832) 		/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6833) 		 * check whether the device shows up in other nodes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6834) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6835) 		if (mddev_is_clustered(mddev)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6836) 			if (info->state & (1 << MD_DISK_CANDIDATE))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6837) 				set_bit(Candidate, &rdev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6838) 			else if (info->state & (1 << MD_DISK_CLUSTER_ADD)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6839) 				/* --add initiated by this node */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6840) 				err = md_cluster_ops->add_new_disk(mddev, rdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6841) 				if (err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6842) 					export_rdev(rdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6843) 					return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6844) 				}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6845) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6846) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6847) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6848) 		rdev->raid_disk = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6849) 		err = bind_rdev_to_array(rdev, mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6850) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6851) 		if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6852) 			export_rdev(rdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6853) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6854) 		if (mddev_is_clustered(mddev)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6855) 			if (info->state & (1 << MD_DISK_CANDIDATE)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6856) 				if (!err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6857) 					err = md_cluster_ops->new_disk_ack(mddev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6858) 						err == 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6859) 					if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6860) 						md_kick_rdev_from_array(rdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6861) 				}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6862) 			} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6863) 				if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6864) 					md_cluster_ops->add_new_disk_cancel(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6865) 				else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6866) 					err = add_bound_rdev(rdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6867) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6868) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6869) 		} else if (!err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6870) 			err = add_bound_rdev(rdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6871) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6872) 		return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6873) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6874) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6875) 	/* otherwise, md_add_new_disk is only allowed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6876) 	 * for major_version==0 superblocks
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6877) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6878) 	if (mddev->major_version != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6879) 		pr_warn("%s: ADD_NEW_DISK not supported\n", mdname(mddev));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6880) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6881) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6882) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6883) 	if (!(info->state & (1<<MD_DISK_FAULTY))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6884) 		int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6885) 		rdev = md_import_device(dev, -1, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6886) 		if (IS_ERR(rdev)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6887) 			pr_warn("md: error, md_import_device() returned %ld\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6888) 				PTR_ERR(rdev));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6889) 			return PTR_ERR(rdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6890) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6891) 		rdev->desc_nr = info->number;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6892) 		if (info->raid_disk < mddev->raid_disks)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6893) 			rdev->raid_disk = info->raid_disk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6894) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6895) 			rdev->raid_disk = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6896) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6897) 		if (rdev->raid_disk < mddev->raid_disks)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6898) 			if (info->state & (1<<MD_DISK_SYNC))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6899) 				set_bit(In_sync, &rdev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6900) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6901) 		if (info->state & (1<<MD_DISK_WRITEMOSTLY))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6902) 			set_bit(WriteMostly, &rdev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6903) 		if (info->state & (1<<MD_DISK_FAILFAST))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6904) 			set_bit(FailFast, &rdev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6905) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6906) 		if (!mddev->persistent) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6907) 			pr_debug("md: nonpersistent superblock ...\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6908) 			rdev->sb_start = i_size_read(rdev->bdev->bd_inode) / 512;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6909) 		} else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6910) 			rdev->sb_start = calc_dev_sboffset(rdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6911) 		rdev->sectors = rdev->sb_start;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6912) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6913) 		err = bind_rdev_to_array(rdev, mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6914) 		if (err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6915) 			export_rdev(rdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6916) 			return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6917) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6918) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6919) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6920) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6921) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6922) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6923) static int hot_remove_disk(struct mddev *mddev, dev_t dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6924) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6925) 	char b[BDEVNAME_SIZE];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6926) 	struct md_rdev *rdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6927) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6928) 	if (!mddev->pers)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6929) 		return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6930) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6931) 	rdev = find_rdev(mddev, dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6932) 	if (!rdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6933) 		return -ENXIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6934) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6935) 	if (rdev->raid_disk < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6936) 		goto kick_rdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6937) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6938) 	clear_bit(Blocked, &rdev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6939) 	remove_and_add_spares(mddev, rdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6940) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6941) 	if (rdev->raid_disk >= 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6942) 		goto busy;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6943) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6944) kick_rdev:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6945) 	if (mddev_is_clustered(mddev)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6946) 		if (md_cluster_ops->remove_disk(mddev, rdev))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6947) 			goto busy;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6948) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6949) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6950) 	md_kick_rdev_from_array(rdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6951) 	set_bit(MD_SB_CHANGE_DEVS, &mddev->sb_flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6952) 	if (mddev->thread)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6953) 		md_wakeup_thread(mddev->thread);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6954) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6955) 		md_update_sb(mddev, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6956) 	md_new_event(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6957) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6958) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6959) busy:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6960) 	pr_debug("md: cannot remove active disk %s from %s ...\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6961) 		 bdevname(rdev->bdev,b), mdname(mddev));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6962) 	return -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6963) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6964) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6965) static int hot_add_disk(struct mddev *mddev, dev_t dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6966) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6967) 	char b[BDEVNAME_SIZE];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6968) 	int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6969) 	struct md_rdev *rdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6970) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6971) 	if (!mddev->pers)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6972) 		return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6973) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6974) 	if (mddev->major_version != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6975) 		pr_warn("%s: HOT_ADD may only be used with version-0 superblocks.\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6976) 			mdname(mddev));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6977) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6978) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6979) 	if (!mddev->pers->hot_add_disk) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6980) 		pr_warn("%s: personality does not support diskops!\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6981) 			mdname(mddev));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6982) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6983) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6984) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6985) 	rdev = md_import_device(dev, -1, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6986) 	if (IS_ERR(rdev)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6987) 		pr_warn("md: error, md_import_device() returned %ld\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6988) 			PTR_ERR(rdev));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6989) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6990) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6991) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6992) 	if (mddev->persistent)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6993) 		rdev->sb_start = calc_dev_sboffset(rdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6994) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6995) 		rdev->sb_start = i_size_read(rdev->bdev->bd_inode) / 512;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6996) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6997) 	rdev->sectors = rdev->sb_start;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6998) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6999) 	if (test_bit(Faulty, &rdev->flags)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7000) 		pr_warn("md: can not hot-add faulty %s disk to %s!\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7001) 			bdevname(rdev->bdev,b), mdname(mddev));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7002) 		err = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7003) 		goto abort_export;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7004) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7005) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7006) 	clear_bit(In_sync, &rdev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7007) 	rdev->desc_nr = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7008) 	rdev->saved_raid_disk = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7009) 	err = bind_rdev_to_array(rdev, mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7010) 	if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7011) 		goto abort_export;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7012) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7013) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7014) 	 * The rest should better be atomic, we can have disk failures
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7015) 	 * noticed in interrupt contexts ...
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7016) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7017) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7018) 	rdev->raid_disk = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7019) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7020) 	set_bit(MD_SB_CHANGE_DEVS, &mddev->sb_flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7021) 	if (!mddev->thread)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7022) 		md_update_sb(mddev, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7023) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7024) 	 * Kick recovery, maybe this spare has to be added to the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7025) 	 * array immediately.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7026) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7027) 	set_bit(MD_RECOVERY_NEEDED, &mddev->recovery);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7028) 	md_wakeup_thread(mddev->thread);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7029) 	md_new_event(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7030) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7031) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7032) abort_export:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7033) 	export_rdev(rdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7034) 	return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7035) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7036) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7037) static int set_bitmap_file(struct mddev *mddev, int fd)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7038) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7039) 	int err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7040) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7041) 	if (mddev->pers) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7042) 		if (!mddev->pers->quiesce || !mddev->thread)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7043) 			return -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7044) 		if (mddev->recovery || mddev->sync_thread)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7045) 			return -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7046) 		/* we should be able to change the bitmap.. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7047) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7048) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7049) 	if (fd >= 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7050) 		struct inode *inode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7051) 		struct file *f;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7052) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7053) 		if (mddev->bitmap || mddev->bitmap_info.file)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7054) 			return -EEXIST; /* cannot add when bitmap is present */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7055) 		f = fget(fd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7056) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7057) 		if (f == NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7058) 			pr_warn("%s: error: failed to get bitmap file\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7059) 				mdname(mddev));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7060) 			return -EBADF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7061) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7062) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7063) 		inode = f->f_mapping->host;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7064) 		if (!S_ISREG(inode->i_mode)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7065) 			pr_warn("%s: error: bitmap file must be a regular file\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7066) 				mdname(mddev));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7067) 			err = -EBADF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7068) 		} else if (!(f->f_mode & FMODE_WRITE)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7069) 			pr_warn("%s: error: bitmap file must open for write\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7070) 				mdname(mddev));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7071) 			err = -EBADF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7072) 		} else if (atomic_read(&inode->i_writecount) != 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7073) 			pr_warn("%s: error: bitmap file is already in use\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7074) 				mdname(mddev));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7075) 			err = -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7076) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7077) 		if (err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7078) 			fput(f);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7079) 			return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7080) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7081) 		mddev->bitmap_info.file = f;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7082) 		mddev->bitmap_info.offset = 0; /* file overrides offset */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7083) 	} else if (mddev->bitmap == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7084) 		return -ENOENT; /* cannot remove what isn't there */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7085) 	err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7086) 	if (mddev->pers) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7087) 		if (fd >= 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7088) 			struct bitmap *bitmap;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7089) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7090) 			bitmap = md_bitmap_create(mddev, -1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7091) 			mddev_suspend(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7092) 			if (!IS_ERR(bitmap)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7093) 				mddev->bitmap = bitmap;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7094) 				err = md_bitmap_load(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7095) 			} else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7096) 				err = PTR_ERR(bitmap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7097) 			if (err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7098) 				md_bitmap_destroy(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7099) 				fd = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7100) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7101) 			mddev_resume(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7102) 		} else if (fd < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7103) 			mddev_suspend(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7104) 			md_bitmap_destroy(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7105) 			mddev_resume(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7106) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7107) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7108) 	if (fd < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7109) 		struct file *f = mddev->bitmap_info.file;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7110) 		if (f) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7111) 			spin_lock(&mddev->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7112) 			mddev->bitmap_info.file = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7113) 			spin_unlock(&mddev->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7114) 			fput(f);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7115) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7116) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7117) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7118) 	return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7119) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7120) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7121) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7122)  * md_set_array_info is used two different ways
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7123)  * The original usage is when creating a new array.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7124)  * In this usage, raid_disks is > 0 and it together with
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7125)  *  level, size, not_persistent,layout,chunksize determine the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7126)  *  shape of the array.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7127)  *  This will always create an array with a type-0.90.0 superblock.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7128)  * The newer usage is when assembling an array.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7129)  *  In this case raid_disks will be 0, and the major_version field is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7130)  *  use to determine which style super-blocks are to be found on the devices.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7131)  *  The minor and patch _version numbers are also kept incase the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7132)  *  super_block handler wishes to interpret them.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7133)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7134) int md_set_array_info(struct mddev *mddev, struct mdu_array_info_s *info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7135) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7136) 	if (info->raid_disks == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7137) 		/* just setting version number for superblock loading */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7138) 		if (info->major_version < 0 ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7139) 		    info->major_version >= ARRAY_SIZE(super_types) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7140) 		    super_types[info->major_version].name == NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7141) 			/* maybe try to auto-load a module? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7142) 			pr_warn("md: superblock version %d not known\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7143) 				info->major_version);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7144) 			return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7145) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7146) 		mddev->major_version = info->major_version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7147) 		mddev->minor_version = info->minor_version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7148) 		mddev->patch_version = info->patch_version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7149) 		mddev->persistent = !info->not_persistent;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7150) 		/* ensure mddev_put doesn't delete this now that there
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7151) 		 * is some minimal configuration.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7152) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7153) 		mddev->ctime         = ktime_get_real_seconds();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7154) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7155) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7156) 	mddev->major_version = MD_MAJOR_VERSION;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7157) 	mddev->minor_version = MD_MINOR_VERSION;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7158) 	mddev->patch_version = MD_PATCHLEVEL_VERSION;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7159) 	mddev->ctime         = ktime_get_real_seconds();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7160) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7161) 	mddev->level         = info->level;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7162) 	mddev->clevel[0]     = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7163) 	mddev->dev_sectors   = 2 * (sector_t)info->size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7164) 	mddev->raid_disks    = info->raid_disks;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7165) 	/* don't set md_minor, it is determined by which /dev/md* was
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7166) 	 * openned
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7167) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7168) 	if (info->state & (1<<MD_SB_CLEAN))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7169) 		mddev->recovery_cp = MaxSector;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7170) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7171) 		mddev->recovery_cp = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7172) 	mddev->persistent    = ! info->not_persistent;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7173) 	mddev->external	     = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7174) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7175) 	mddev->layout        = info->layout;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7176) 	if (mddev->level == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7177) 		/* Cannot trust RAID0 layout info here */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7178) 		mddev->layout = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7179) 	mddev->chunk_sectors = info->chunk_size >> 9;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7180) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7181) 	if (mddev->persistent) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7182) 		mddev->max_disks = MD_SB_DISKS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7183) 		mddev->flags = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7184) 		mddev->sb_flags = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7185) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7186) 	set_bit(MD_SB_CHANGE_DEVS, &mddev->sb_flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7187) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7188) 	mddev->bitmap_info.default_offset = MD_SB_BYTES >> 9;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7189) 	mddev->bitmap_info.default_space = 64*2 - (MD_SB_BYTES >> 9);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7190) 	mddev->bitmap_info.offset = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7191) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7192) 	mddev->reshape_position = MaxSector;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7193) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7194) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7195) 	 * Generate a 128 bit UUID
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7196) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7197) 	get_random_bytes(mddev->uuid, 16);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7198) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7199) 	mddev->new_level = mddev->level;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7200) 	mddev->new_chunk_sectors = mddev->chunk_sectors;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7201) 	mddev->new_layout = mddev->layout;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7202) 	mddev->delta_disks = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7203) 	mddev->reshape_backwards = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7204) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7205) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7206) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7207) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7208) void md_set_array_sectors(struct mddev *mddev, sector_t array_sectors)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7209) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7210) 	lockdep_assert_held(&mddev->reconfig_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7211) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7212) 	if (mddev->external_size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7213) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7214) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7215) 	mddev->array_sectors = array_sectors;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7216) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7217) EXPORT_SYMBOL(md_set_array_sectors);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7218) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7219) static int update_size(struct mddev *mddev, sector_t num_sectors)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7220) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7221) 	struct md_rdev *rdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7222) 	int rv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7223) 	int fit = (num_sectors == 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7224) 	sector_t old_dev_sectors = mddev->dev_sectors;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7225) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7226) 	if (mddev->pers->resize == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7227) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7228) 	/* The "num_sectors" is the number of sectors of each device that
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7229) 	 * is used.  This can only make sense for arrays with redundancy.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7230) 	 * linear and raid0 always use whatever space is available. We can only
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7231) 	 * consider changing this number if no resync or reconstruction is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7232) 	 * happening, and if the new size is acceptable. It must fit before the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7233) 	 * sb_start or, if that is <data_offset, it must fit before the size
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7234) 	 * of each device.  If num_sectors is zero, we find the largest size
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7235) 	 * that fits.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7236) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7237) 	if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7238) 	    mddev->sync_thread)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7239) 		return -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7240) 	if (mddev->ro)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7241) 		return -EROFS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7242) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7243) 	rdev_for_each(rdev, mddev) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7244) 		sector_t avail = rdev->sectors;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7245) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7246) 		if (fit && (num_sectors == 0 || num_sectors > avail))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7247) 			num_sectors = avail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7248) 		if (avail < num_sectors)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7249) 			return -ENOSPC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7250) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7251) 	rv = mddev->pers->resize(mddev, num_sectors);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7252) 	if (!rv) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7253) 		if (mddev_is_clustered(mddev))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7254) 			md_cluster_ops->update_size(mddev, old_dev_sectors);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7255) 		else if (mddev->queue) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7256) 			set_capacity(mddev->gendisk, mddev->array_sectors);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7257) 			revalidate_disk_size(mddev->gendisk, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7258) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7259) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7260) 	return rv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7261) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7262) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7263) static int update_raid_disks(struct mddev *mddev, int raid_disks)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7264) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7265) 	int rv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7266) 	struct md_rdev *rdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7267) 	/* change the number of raid disks */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7268) 	if (mddev->pers->check_reshape == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7269) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7270) 	if (mddev->ro)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7271) 		return -EROFS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7272) 	if (raid_disks <= 0 ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7273) 	    (mddev->max_disks && raid_disks >= mddev->max_disks))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7274) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7275) 	if (mddev->sync_thread ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7276) 	    test_bit(MD_RECOVERY_RUNNING, &mddev->recovery) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7277) 	    test_bit(MD_RESYNCING_REMOTE, &mddev->recovery) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7278) 	    mddev->reshape_position != MaxSector)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7279) 		return -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7280) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7281) 	rdev_for_each(rdev, mddev) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7282) 		if (mddev->raid_disks < raid_disks &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7283) 		    rdev->data_offset < rdev->new_data_offset)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7284) 			return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7285) 		if (mddev->raid_disks > raid_disks &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7286) 		    rdev->data_offset > rdev->new_data_offset)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7287) 			return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7288) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7289) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7290) 	mddev->delta_disks = raid_disks - mddev->raid_disks;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7291) 	if (mddev->delta_disks < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7292) 		mddev->reshape_backwards = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7293) 	else if (mddev->delta_disks > 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7294) 		mddev->reshape_backwards = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7295) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7296) 	rv = mddev->pers->check_reshape(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7297) 	if (rv < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7298) 		mddev->delta_disks = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7299) 		mddev->reshape_backwards = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7300) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7301) 	return rv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7302) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7303) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7304) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7305)  * update_array_info is used to change the configuration of an
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7306)  * on-line array.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7307)  * The version, ctime,level,size,raid_disks,not_persistent, layout,chunk_size
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7308)  * fields in the info are checked against the array.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7309)  * Any differences that cannot be handled will cause an error.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7310)  * Normally, only one change can be managed at a time.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7311)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7312) static int update_array_info(struct mddev *mddev, mdu_array_info_t *info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7313) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7314) 	int rv = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7315) 	int cnt = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7316) 	int state = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7317) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7318) 	/* calculate expected state,ignoring low bits */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7319) 	if (mddev->bitmap && mddev->bitmap_info.offset)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7320) 		state |= (1 << MD_SB_BITMAP_PRESENT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7321) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7322) 	if (mddev->major_version != info->major_version ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7323) 	    mddev->minor_version != info->minor_version ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7324) /*	    mddev->patch_version != info->patch_version || */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7325) 	    mddev->ctime         != info->ctime         ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7326) 	    mddev->level         != info->level         ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7327) /*	    mddev->layout        != info->layout        || */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7328) 	    mddev->persistent	 != !info->not_persistent ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7329) 	    mddev->chunk_sectors != info->chunk_size >> 9 ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7330) 	    /* ignore bottom 8 bits of state, and allow SB_BITMAP_PRESENT to change */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7331) 	    ((state^info->state) & 0xfffffe00)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7332) 		)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7333) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7334) 	/* Check there is only one change */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7335) 	if (info->size >= 0 && mddev->dev_sectors / 2 != info->size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7336) 		cnt++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7337) 	if (mddev->raid_disks != info->raid_disks)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7338) 		cnt++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7339) 	if (mddev->layout != info->layout)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7340) 		cnt++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7341) 	if ((state ^ info->state) & (1<<MD_SB_BITMAP_PRESENT))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7342) 		cnt++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7343) 	if (cnt == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7344) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7345) 	if (cnt > 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7346) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7347) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7348) 	if (mddev->layout != info->layout) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7349) 		/* Change layout
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7350) 		 * we don't need to do anything at the md level, the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7351) 		 * personality will take care of it all.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7352) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7353) 		if (mddev->pers->check_reshape == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7354) 			return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7355) 		else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7356) 			mddev->new_layout = info->layout;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7357) 			rv = mddev->pers->check_reshape(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7358) 			if (rv)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7359) 				mddev->new_layout = mddev->layout;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7360) 			return rv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7361) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7362) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7363) 	if (info->size >= 0 && mddev->dev_sectors / 2 != info->size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7364) 		rv = update_size(mddev, (sector_t)info->size * 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7365) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7366) 	if (mddev->raid_disks    != info->raid_disks)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7367) 		rv = update_raid_disks(mddev, info->raid_disks);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7368) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7369) 	if ((state ^ info->state) & (1<<MD_SB_BITMAP_PRESENT)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7370) 		if (mddev->pers->quiesce == NULL || mddev->thread == NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7371) 			rv = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7372) 			goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7373) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7374) 		if (mddev->recovery || mddev->sync_thread) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7375) 			rv = -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7376) 			goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7377) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7378) 		if (info->state & (1<<MD_SB_BITMAP_PRESENT)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7379) 			struct bitmap *bitmap;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7380) 			/* add the bitmap */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7381) 			if (mddev->bitmap) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7382) 				rv = -EEXIST;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7383) 				goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7384) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7385) 			if (mddev->bitmap_info.default_offset == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7386) 				rv = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7387) 				goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7388) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7389) 			mddev->bitmap_info.offset =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7390) 				mddev->bitmap_info.default_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7391) 			mddev->bitmap_info.space =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7392) 				mddev->bitmap_info.default_space;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7393) 			bitmap = md_bitmap_create(mddev, -1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7394) 			mddev_suspend(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7395) 			if (!IS_ERR(bitmap)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7396) 				mddev->bitmap = bitmap;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7397) 				rv = md_bitmap_load(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7398) 			} else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7399) 				rv = PTR_ERR(bitmap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7400) 			if (rv)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7401) 				md_bitmap_destroy(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7402) 			mddev_resume(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7403) 		} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7404) 			/* remove the bitmap */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7405) 			if (!mddev->bitmap) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7406) 				rv = -ENOENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7407) 				goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7408) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7409) 			if (mddev->bitmap->storage.file) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7410) 				rv = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7411) 				goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7412) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7413) 			if (mddev->bitmap_info.nodes) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7414) 				/* hold PW on all the bitmap lock */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7415) 				if (md_cluster_ops->lock_all_bitmaps(mddev) <= 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7416) 					pr_warn("md: can't change bitmap to none since the array is in use by more than one node\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7417) 					rv = -EPERM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7418) 					md_cluster_ops->unlock_all_bitmaps(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7419) 					goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7420) 				}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7421) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7422) 				mddev->bitmap_info.nodes = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7423) 				md_cluster_ops->leave(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7424) 				module_put(md_cluster_mod);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7425) 				mddev->safemode_delay = DEFAULT_SAFEMODE_DELAY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7426) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7427) 			mddev_suspend(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7428) 			md_bitmap_destroy(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7429) 			mddev_resume(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7430) 			mddev->bitmap_info.offset = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7431) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7432) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7433) 	md_update_sb(mddev, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7434) 	return rv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7435) err:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7436) 	return rv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7437) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7438) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7439) static int set_disk_faulty(struct mddev *mddev, dev_t dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7440) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7441) 	struct md_rdev *rdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7442) 	int err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7443) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7444) 	if (mddev->pers == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7445) 		return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7446) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7447) 	rcu_read_lock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7448) 	rdev = md_find_rdev_rcu(mddev, dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7449) 	if (!rdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7450) 		err =  -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7451) 	else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7452) 		md_error(mddev, rdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7453) 		if (!test_bit(Faulty, &rdev->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7454) 			err = -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7455) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7456) 	rcu_read_unlock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7457) 	return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7458) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7459) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7460) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7461)  * We have a problem here : there is no easy way to give a CHS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7462)  * virtual geometry. We currently pretend that we have a 2 heads
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7463)  * 4 sectors (with a BIG number of cylinders...). This drives
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7464)  * dosfs just mad... ;-)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7465)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7466) static int md_getgeo(struct block_device *bdev, struct hd_geometry *geo)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7467) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7468) 	struct mddev *mddev = bdev->bd_disk->private_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7469) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7470) 	geo->heads = 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7471) 	geo->sectors = 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7472) 	geo->cylinders = mddev->array_sectors / 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7473) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7474) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7475) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7476) static inline bool md_ioctl_valid(unsigned int cmd)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7477) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7478) 	switch (cmd) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7479) 	case ADD_NEW_DISK:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7480) 	case BLKROSET:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7481) 	case GET_ARRAY_INFO:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7482) 	case GET_BITMAP_FILE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7483) 	case GET_DISK_INFO:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7484) 	case HOT_ADD_DISK:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7485) 	case HOT_REMOVE_DISK:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7486) 	case RAID_VERSION:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7487) 	case RESTART_ARRAY_RW:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7488) 	case RUN_ARRAY:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7489) 	case SET_ARRAY_INFO:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7490) 	case SET_BITMAP_FILE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7491) 	case SET_DISK_FAULTY:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7492) 	case STOP_ARRAY:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7493) 	case STOP_ARRAY_RO:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7494) 	case CLUSTERED_DISK_NACK:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7495) 		return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7496) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7497) 		return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7498) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7499) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7500) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7501) static int md_ioctl(struct block_device *bdev, fmode_t mode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7502) 			unsigned int cmd, unsigned long arg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7503) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7504) 	int err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7505) 	void __user *argp = (void __user *)arg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7506) 	struct mddev *mddev = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7507) 	int ro;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7508) 	bool did_set_md_closing = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7509) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7510) 	if (!md_ioctl_valid(cmd))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7511) 		return -ENOTTY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7512) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7513) 	switch (cmd) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7514) 	case RAID_VERSION:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7515) 	case GET_ARRAY_INFO:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7516) 	case GET_DISK_INFO:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7517) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7518) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7519) 		if (!capable(CAP_SYS_ADMIN))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7520) 			return -EACCES;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7521) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7522) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7523) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7524) 	 * Commands dealing with the RAID driver but not any
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7525) 	 * particular array:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7526) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7527) 	switch (cmd) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7528) 	case RAID_VERSION:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7529) 		err = get_version(argp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7530) 		goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7531) 	default:;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7532) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7533) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7534) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7535) 	 * Commands creating/starting a new array:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7536) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7537) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7538) 	mddev = bdev->bd_disk->private_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7539) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7540) 	if (!mddev) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7541) 		BUG();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7542) 		goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7543) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7544) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7545) 	/* Some actions do not requires the mutex */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7546) 	switch (cmd) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7547) 	case GET_ARRAY_INFO:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7548) 		if (!mddev->raid_disks && !mddev->external)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7549) 			err = -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7550) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7551) 			err = get_array_info(mddev, argp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7552) 		goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7553) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7554) 	case GET_DISK_INFO:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7555) 		if (!mddev->raid_disks && !mddev->external)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7556) 			err = -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7557) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7558) 			err = get_disk_info(mddev, argp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7559) 		goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7560) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7561) 	case SET_DISK_FAULTY:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7562) 		err = set_disk_faulty(mddev, new_decode_dev(arg));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7563) 		goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7564) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7565) 	case GET_BITMAP_FILE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7566) 		err = get_bitmap_file(mddev, argp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7567) 		goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7568) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7569) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7570) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7571) 	if (cmd == ADD_NEW_DISK || cmd == HOT_ADD_DISK)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7572) 		flush_rdev_wq(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7573) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7574) 	if (cmd == HOT_REMOVE_DISK)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7575) 		/* need to ensure recovery thread has run */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7576) 		wait_event_interruptible_timeout(mddev->sb_wait,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7577) 						 !test_bit(MD_RECOVERY_NEEDED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7578) 							   &mddev->recovery),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7579) 						 msecs_to_jiffies(5000));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7580) 	if (cmd == STOP_ARRAY || cmd == STOP_ARRAY_RO) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7581) 		/* Need to flush page cache, and ensure no-one else opens
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7582) 		 * and writes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7583) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7584) 		mutex_lock(&mddev->open_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7585) 		if (mddev->pers && atomic_read(&mddev->openers) > 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7586) 			mutex_unlock(&mddev->open_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7587) 			err = -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7588) 			goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7589) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7590) 		if (test_and_set_bit(MD_CLOSING, &mddev->flags)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7591) 			mutex_unlock(&mddev->open_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7592) 			err = -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7593) 			goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7594) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7595) 		did_set_md_closing = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7596) 		mutex_unlock(&mddev->open_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7597) 		sync_blockdev(bdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7598) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7599) 	err = mddev_lock(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7600) 	if (err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7601) 		pr_debug("md: ioctl lock interrupted, reason %d, cmd %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7602) 			 err, cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7603) 		goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7604) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7605) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7606) 	if (cmd == SET_ARRAY_INFO) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7607) 		mdu_array_info_t info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7608) 		if (!arg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7609) 			memset(&info, 0, sizeof(info));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7610) 		else if (copy_from_user(&info, argp, sizeof(info))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7611) 			err = -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7612) 			goto unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7613) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7614) 		if (mddev->pers) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7615) 			err = update_array_info(mddev, &info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7616) 			if (err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7617) 				pr_warn("md: couldn't update array info. %d\n", err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7618) 				goto unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7619) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7620) 			goto unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7621) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7622) 		if (!list_empty(&mddev->disks)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7623) 			pr_warn("md: array %s already has disks!\n", mdname(mddev));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7624) 			err = -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7625) 			goto unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7626) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7627) 		if (mddev->raid_disks) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7628) 			pr_warn("md: array %s already initialised!\n", mdname(mddev));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7629) 			err = -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7630) 			goto unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7631) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7632) 		err = md_set_array_info(mddev, &info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7633) 		if (err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7634) 			pr_warn("md: couldn't set array info. %d\n", err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7635) 			goto unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7636) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7637) 		goto unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7638) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7639) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7640) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7641) 	 * Commands querying/configuring an existing array:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7642) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7643) 	/* if we are not initialised yet, only ADD_NEW_DISK, STOP_ARRAY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7644) 	 * RUN_ARRAY, and GET_ and SET_BITMAP_FILE are allowed */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7645) 	if ((!mddev->raid_disks && !mddev->external)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7646) 	    && cmd != ADD_NEW_DISK && cmd != STOP_ARRAY
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7647) 	    && cmd != RUN_ARRAY && cmd != SET_BITMAP_FILE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7648) 	    && cmd != GET_BITMAP_FILE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7649) 		err = -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7650) 		goto unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7651) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7652) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7653) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7654) 	 * Commands even a read-only array can execute:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7655) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7656) 	switch (cmd) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7657) 	case RESTART_ARRAY_RW:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7658) 		err = restart_array(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7659) 		goto unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7660) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7661) 	case STOP_ARRAY:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7662) 		err = do_md_stop(mddev, 0, bdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7663) 		goto unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7664) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7665) 	case STOP_ARRAY_RO:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7666) 		err = md_set_readonly(mddev, bdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7667) 		goto unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7668) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7669) 	case HOT_REMOVE_DISK:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7670) 		err = hot_remove_disk(mddev, new_decode_dev(arg));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7671) 		goto unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7672) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7673) 	case ADD_NEW_DISK:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7674) 		/* We can support ADD_NEW_DISK on read-only arrays
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7675) 		 * only if we are re-adding a preexisting device.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7676) 		 * So require mddev->pers and MD_DISK_SYNC.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7677) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7678) 		if (mddev->pers) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7679) 			mdu_disk_info_t info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7680) 			if (copy_from_user(&info, argp, sizeof(info)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7681) 				err = -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7682) 			else if (!(info.state & (1<<MD_DISK_SYNC)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7683) 				/* Need to clear read-only for this */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7684) 				break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7685) 			else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7686) 				err = md_add_new_disk(mddev, &info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7687) 			goto unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7688) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7689) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7690) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7691) 	case BLKROSET:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7692) 		if (get_user(ro, (int __user *)(arg))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7693) 			err = -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7694) 			goto unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7695) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7696) 		err = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7697) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7698) 		/* if the bdev is going readonly the value of mddev->ro
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7699) 		 * does not matter, no writes are coming
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7700) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7701) 		if (ro)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7702) 			goto unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7703) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7704) 		/* are we are already prepared for writes? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7705) 		if (mddev->ro != 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7706) 			goto unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7707) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7708) 		/* transitioning to readauto need only happen for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7709) 		 * arrays that call md_write_start
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7710) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7711) 		if (mddev->pers) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7712) 			err = restart_array(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7713) 			if (err == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7714) 				mddev->ro = 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7715) 				set_disk_ro(mddev->gendisk, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7716) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7717) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7718) 		goto unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7719) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7720) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7721) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7722) 	 * The remaining ioctls are changing the state of the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7723) 	 * superblock, so we do not allow them on read-only arrays.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7724) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7725) 	if (mddev->ro && mddev->pers) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7726) 		if (mddev->ro == 2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7727) 			mddev->ro = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7728) 			sysfs_notify_dirent_safe(mddev->sysfs_state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7729) 			set_bit(MD_RECOVERY_NEEDED, &mddev->recovery);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7730) 			/* mddev_unlock will wake thread */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7731) 			/* If a device failed while we were read-only, we
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7732) 			 * need to make sure the metadata is updated now.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7733) 			 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7734) 			if (test_bit(MD_SB_CHANGE_DEVS, &mddev->sb_flags)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7735) 				mddev_unlock(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7736) 				wait_event(mddev->sb_wait,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7737) 					   !test_bit(MD_SB_CHANGE_DEVS, &mddev->sb_flags) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7738) 					   !test_bit(MD_SB_CHANGE_PENDING, &mddev->sb_flags));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7739) 				mddev_lock_nointr(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7740) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7741) 		} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7742) 			err = -EROFS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7743) 			goto unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7744) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7745) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7746) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7747) 	switch (cmd) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7748) 	case ADD_NEW_DISK:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7749) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7750) 		mdu_disk_info_t info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7751) 		if (copy_from_user(&info, argp, sizeof(info)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7752) 			err = -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7753) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7754) 			err = md_add_new_disk(mddev, &info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7755) 		goto unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7756) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7757) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7758) 	case CLUSTERED_DISK_NACK:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7759) 		if (mddev_is_clustered(mddev))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7760) 			md_cluster_ops->new_disk_ack(mddev, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7761) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7762) 			err = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7763) 		goto unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7764) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7765) 	case HOT_ADD_DISK:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7766) 		err = hot_add_disk(mddev, new_decode_dev(arg));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7767) 		goto unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7768) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7769) 	case RUN_ARRAY:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7770) 		err = do_md_run(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7771) 		goto unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7772) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7773) 	case SET_BITMAP_FILE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7774) 		err = set_bitmap_file(mddev, (int)arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7775) 		goto unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7776) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7777) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7778) 		err = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7779) 		goto unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7780) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7781) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7782) unlock:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7783) 	if (mddev->hold_active == UNTIL_IOCTL &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7784) 	    err != -EINVAL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7785) 		mddev->hold_active = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7786) 	mddev_unlock(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7787) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7788) 	if(did_set_md_closing)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7789) 		clear_bit(MD_CLOSING, &mddev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7790) 	return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7791) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7792) #ifdef CONFIG_COMPAT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7793) static int md_compat_ioctl(struct block_device *bdev, fmode_t mode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7794) 		    unsigned int cmd, unsigned long arg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7795) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7796) 	switch (cmd) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7797) 	case HOT_REMOVE_DISK:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7798) 	case HOT_ADD_DISK:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7799) 	case SET_DISK_FAULTY:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7800) 	case SET_BITMAP_FILE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7801) 		/* These take in integer arg, do not convert */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7802) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7803) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7804) 		arg = (unsigned long)compat_ptr(arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7805) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7806) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7807) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7808) 	return md_ioctl(bdev, mode, cmd, arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7809) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7810) #endif /* CONFIG_COMPAT */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7811) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7812) static int md_open(struct block_device *bdev, fmode_t mode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7813) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7814) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7815) 	 * Succeed if we can lock the mddev, which confirms that
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7816) 	 * it isn't being stopped right now.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7817) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7818) 	struct mddev *mddev = mddev_find(bdev->bd_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7819) 	int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7820) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7821) 	if (!mddev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7822) 		return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7823) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7824) 	if (mddev->gendisk != bdev->bd_disk) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7825) 		/* we are racing with mddev_put which is discarding this
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7826) 		 * bd_disk.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7827) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7828) 		mddev_put(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7829) 		/* Wait until bdev->bd_disk is definitely gone */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7830) 		if (work_pending(&mddev->del_work))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7831) 			flush_workqueue(md_misc_wq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7832) 		return -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7833) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7834) 	BUG_ON(mddev != bdev->bd_disk->private_data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7835) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7836) 	if ((err = mutex_lock_interruptible(&mddev->open_mutex)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7837) 		goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7838) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7839) 	if (test_bit(MD_CLOSING, &mddev->flags)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7840) 		mutex_unlock(&mddev->open_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7841) 		err = -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7842) 		goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7843) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7844) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7845) 	err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7846) 	atomic_inc(&mddev->openers);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7847) 	mutex_unlock(&mddev->open_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7848) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7849) 	bdev_check_media_change(bdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7850)  out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7851) 	if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7852) 		mddev_put(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7853) 	return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7854) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7855) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7856) static void md_release(struct gendisk *disk, fmode_t mode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7857) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7858) 	struct mddev *mddev = disk->private_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7859) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7860) 	BUG_ON(!mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7861) 	atomic_dec(&mddev->openers);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7862) 	mddev_put(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7863) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7864) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7865) static unsigned int md_check_events(struct gendisk *disk, unsigned int clearing)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7866) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7867) 	struct mddev *mddev = disk->private_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7868) 	unsigned int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7869) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7870) 	if (mddev->changed)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7871) 		ret = DISK_EVENT_MEDIA_CHANGE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7872) 	mddev->changed = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7873) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7874) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7875) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7876) const struct block_device_operations md_fops =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7877) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7878) 	.owner		= THIS_MODULE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7879) 	.submit_bio	= md_submit_bio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7880) 	.open		= md_open,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7881) 	.release	= md_release,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7882) 	.ioctl		= md_ioctl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7883) #ifdef CONFIG_COMPAT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7884) 	.compat_ioctl	= md_compat_ioctl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7885) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7886) 	.getgeo		= md_getgeo,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7887) 	.check_events	= md_check_events,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7888) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7889) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7890) static int md_thread(void *arg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7891) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7892) 	struct md_thread *thread = arg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7893) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7894) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7895) 	 * md_thread is a 'system-thread', it's priority should be very
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7896) 	 * high. We avoid resource deadlocks individually in each
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7897) 	 * raid personality. (RAID5 does preallocation) We also use RR and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7898) 	 * the very same RT priority as kswapd, thus we will never get
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7899) 	 * into a priority inversion deadlock.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7900) 	 *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7901) 	 * we definitely have to have equal or higher priority than
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7902) 	 * bdflush, otherwise bdflush will deadlock if there are too
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7903) 	 * many dirty RAID5 blocks.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7904) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7905) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7906) 	allow_signal(SIGKILL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7907) 	while (!kthread_should_stop()) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7908) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7909) 		/* We need to wait INTERRUPTIBLE so that
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7910) 		 * we don't add to the load-average.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7911) 		 * That means we need to be sure no signals are
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7912) 		 * pending
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7913) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7914) 		if (signal_pending(current))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7915) 			flush_signals(current);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7916) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7917) 		wait_event_interruptible_timeout
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7918) 			(thread->wqueue,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7919) 			 test_bit(THREAD_WAKEUP, &thread->flags)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7920) 			 || kthread_should_stop() || kthread_should_park(),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7921) 			 thread->timeout);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7922) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7923) 		clear_bit(THREAD_WAKEUP, &thread->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7924) 		if (kthread_should_park())
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7925) 			kthread_parkme();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7926) 		if (!kthread_should_stop())
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7927) 			thread->run(thread);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7928) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7929) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7930) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7931) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7932) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7933) void md_wakeup_thread(struct md_thread *thread)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7934) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7935) 	if (thread) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7936) 		pr_debug("md: waking up MD thread %s.\n", thread->tsk->comm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7937) 		set_bit(THREAD_WAKEUP, &thread->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7938) 		wake_up(&thread->wqueue);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7939) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7940) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7941) EXPORT_SYMBOL(md_wakeup_thread);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7942) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7943) struct md_thread *md_register_thread(void (*run) (struct md_thread *),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7944) 		struct mddev *mddev, const char *name)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7945) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7946) 	struct md_thread *thread;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7947) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7948) 	thread = kzalloc(sizeof(struct md_thread), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7949) 	if (!thread)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7950) 		return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7951) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7952) 	init_waitqueue_head(&thread->wqueue);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7953) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7954) 	thread->run = run;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7955) 	thread->mddev = mddev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7956) 	thread->timeout = MAX_SCHEDULE_TIMEOUT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7957) 	thread->tsk = kthread_run(md_thread, thread,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7958) 				  "%s_%s",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7959) 				  mdname(thread->mddev),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7960) 				  name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7961) 	if (IS_ERR(thread->tsk)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7962) 		kfree(thread);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7963) 		return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7964) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7965) 	return thread;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7966) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7967) EXPORT_SYMBOL(md_register_thread);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7968) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7969) void md_unregister_thread(struct md_thread **threadp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7970) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7971) 	struct md_thread *thread = *threadp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7972) 	if (!thread)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7973) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7974) 	pr_debug("interrupting MD-thread pid %d\n", task_pid_nr(thread->tsk));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7975) 	/* Locking ensures that mddev_unlock does not wake_up a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7976) 	 * non-existent thread
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7977) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7978) 	spin_lock(&pers_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7979) 	*threadp = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7980) 	spin_unlock(&pers_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7981) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7982) 	kthread_stop(thread->tsk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7983) 	kfree(thread);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7984) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7985) EXPORT_SYMBOL(md_unregister_thread);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7986) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7987) void md_error(struct mddev *mddev, struct md_rdev *rdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7988) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7989) 	if (!rdev || test_bit(Faulty, &rdev->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7990) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7991) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7992) 	if (!mddev->pers || !mddev->pers->error_handler)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7993) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7994) 	mddev->pers->error_handler(mddev,rdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7995) 	if (mddev->degraded)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7996) 		set_bit(MD_RECOVERY_RECOVER, &mddev->recovery);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7997) 	sysfs_notify_dirent_safe(rdev->sysfs_state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7998) 	set_bit(MD_RECOVERY_INTR, &mddev->recovery);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7999) 	set_bit(MD_RECOVERY_NEEDED, &mddev->recovery);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8000) 	md_wakeup_thread(mddev->thread);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8001) 	if (mddev->event_work.func)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8002) 		queue_work(md_misc_wq, &mddev->event_work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8003) 	md_new_event(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8004) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8005) EXPORT_SYMBOL(md_error);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8006) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8007) /* seq_file implementation /proc/mdstat */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8008) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8009) static void status_unused(struct seq_file *seq)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8010) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8011) 	int i = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8012) 	struct md_rdev *rdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8013) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8014) 	seq_printf(seq, "unused devices: ");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8015) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8016) 	list_for_each_entry(rdev, &pending_raid_disks, same_set) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8017) 		char b[BDEVNAME_SIZE];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8018) 		i++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8019) 		seq_printf(seq, "%s ",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8020) 			      bdevname(rdev->bdev,b));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8021) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8022) 	if (!i)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8023) 		seq_printf(seq, "<none>");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8024) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8025) 	seq_printf(seq, "\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8026) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8027) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8028) static int status_resync(struct seq_file *seq, struct mddev *mddev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8029) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8030) 	sector_t max_sectors, resync, res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8031) 	unsigned long dt, db = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8032) 	sector_t rt, curr_mark_cnt, resync_mark_cnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8033) 	int scale, recovery_active;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8034) 	unsigned int per_milli;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8035) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8036) 	if (test_bit(MD_RECOVERY_SYNC, &mddev->recovery) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8037) 	    test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8038) 		max_sectors = mddev->resync_max_sectors;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8039) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8040) 		max_sectors = mddev->dev_sectors;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8041) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8042) 	resync = mddev->curr_resync;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8043) 	if (resync <= 3) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8044) 		if (test_bit(MD_RECOVERY_DONE, &mddev->recovery))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8045) 			/* Still cleaning up */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8046) 			resync = max_sectors;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8047) 	} else if (resync > max_sectors)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8048) 		resync = max_sectors;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8049) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8050) 		resync -= atomic_read(&mddev->recovery_active);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8051) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8052) 	if (resync == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8053) 		if (test_bit(MD_RESYNCING_REMOTE, &mddev->recovery)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8054) 			struct md_rdev *rdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8055) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8056) 			rdev_for_each(rdev, mddev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8057) 				if (rdev->raid_disk >= 0 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8058) 				    !test_bit(Faulty, &rdev->flags) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8059) 				    rdev->recovery_offset != MaxSector &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8060) 				    rdev->recovery_offset) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8061) 					seq_printf(seq, "\trecover=REMOTE");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8062) 					return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8063) 				}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8064) 			if (mddev->reshape_position != MaxSector)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8065) 				seq_printf(seq, "\treshape=REMOTE");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8066) 			else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8067) 				seq_printf(seq, "\tresync=REMOTE");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8068) 			return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8069) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8070) 		if (mddev->recovery_cp < MaxSector) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8071) 			seq_printf(seq, "\tresync=PENDING");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8072) 			return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8073) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8074) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8075) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8076) 	if (resync < 3) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8077) 		seq_printf(seq, "\tresync=DELAYED");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8078) 		return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8079) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8080) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8081) 	WARN_ON(max_sectors == 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8082) 	/* Pick 'scale' such that (resync>>scale)*1000 will fit
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8083) 	 * in a sector_t, and (max_sectors>>scale) will fit in a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8084) 	 * u32, as those are the requirements for sector_div.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8085) 	 * Thus 'scale' must be at least 10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8086) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8087) 	scale = 10;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8088) 	if (sizeof(sector_t) > sizeof(unsigned long)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8089) 		while ( max_sectors/2 > (1ULL<<(scale+32)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8090) 			scale++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8091) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8092) 	res = (resync>>scale)*1000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8093) 	sector_div(res, (u32)((max_sectors>>scale)+1));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8094) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8095) 	per_milli = res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8096) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8097) 		int i, x = per_milli/50, y = 20-x;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8098) 		seq_printf(seq, "[");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8099) 		for (i = 0; i < x; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8100) 			seq_printf(seq, "=");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8101) 		seq_printf(seq, ">");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8102) 		for (i = 0; i < y; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8103) 			seq_printf(seq, ".");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8104) 		seq_printf(seq, "] ");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8105) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8106) 	seq_printf(seq, " %s =%3u.%u%% (%llu/%llu)",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8107) 		   (test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery)?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8108) 		    "reshape" :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8109) 		    (test_bit(MD_RECOVERY_CHECK, &mddev->recovery)?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8110) 		     "check" :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8111) 		     (test_bit(MD_RECOVERY_SYNC, &mddev->recovery) ?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8112) 		      "resync" : "recovery"))),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8113) 		   per_milli/10, per_milli % 10,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8114) 		   (unsigned long long) resync/2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8115) 		   (unsigned long long) max_sectors/2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8116) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8117) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8118) 	 * dt: time from mark until now
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8119) 	 * db: blocks written from mark until now
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8120) 	 * rt: remaining time
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8121) 	 *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8122) 	 * rt is a sector_t, which is always 64bit now. We are keeping
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8123) 	 * the original algorithm, but it is not really necessary.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8124) 	 *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8125) 	 * Original algorithm:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8126) 	 *   So we divide before multiply in case it is 32bit and close
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8127) 	 *   to the limit.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8128) 	 *   We scale the divisor (db) by 32 to avoid losing precision
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8129) 	 *   near the end of resync when the number of remaining sectors
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8130) 	 *   is close to 'db'.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8131) 	 *   We then divide rt by 32 after multiplying by db to compensate.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8132) 	 *   The '+1' avoids division by zero if db is very small.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8133) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8134) 	dt = ((jiffies - mddev->resync_mark) / HZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8135) 	if (!dt) dt++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8136) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8137) 	curr_mark_cnt = mddev->curr_mark_cnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8138) 	recovery_active = atomic_read(&mddev->recovery_active);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8139) 	resync_mark_cnt = mddev->resync_mark_cnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8140) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8141) 	if (curr_mark_cnt >= (recovery_active + resync_mark_cnt))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8142) 		db = curr_mark_cnt - (recovery_active + resync_mark_cnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8143) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8144) 	rt = max_sectors - resync;    /* number of remaining sectors */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8145) 	rt = div64_u64(rt, db/32+1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8146) 	rt *= dt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8147) 	rt >>= 5;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8148) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8149) 	seq_printf(seq, " finish=%lu.%lumin", (unsigned long)rt / 60,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8150) 		   ((unsigned long)rt % 60)/6);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8151) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8152) 	seq_printf(seq, " speed=%ldK/sec", db/2/dt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8153) 	return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8154) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8155) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8156) static void *md_seq_start(struct seq_file *seq, loff_t *pos)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8157) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8158) 	struct list_head *tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8159) 	loff_t l = *pos;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8160) 	struct mddev *mddev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8161) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8162) 	if (l == 0x10000) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8163) 		++*pos;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8164) 		return (void *)2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8165) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8166) 	if (l > 0x10000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8167) 		return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8168) 	if (!l--)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8169) 		/* header */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8170) 		return (void*)1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8171) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8172) 	spin_lock(&all_mddevs_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8173) 	list_for_each(tmp,&all_mddevs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8174) 		if (!l--) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8175) 			mddev = list_entry(tmp, struct mddev, all_mddevs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8176) 			mddev_get(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8177) 			spin_unlock(&all_mddevs_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8178) 			return mddev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8179) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8180) 	spin_unlock(&all_mddevs_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8181) 	if (!l--)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8182) 		return (void*)2;/* tail */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8183) 	return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8184) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8185) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8186) static void *md_seq_next(struct seq_file *seq, void *v, loff_t *pos)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8187) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8188) 	struct list_head *tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8189) 	struct mddev *next_mddev, *mddev = v;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8190) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8191) 	++*pos;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8192) 	if (v == (void*)2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8193) 		return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8194) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8195) 	spin_lock(&all_mddevs_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8196) 	if (v == (void*)1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8197) 		tmp = all_mddevs.next;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8198) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8199) 		tmp = mddev->all_mddevs.next;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8200) 	if (tmp != &all_mddevs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8201) 		next_mddev = mddev_get(list_entry(tmp,struct mddev,all_mddevs));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8202) 	else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8203) 		next_mddev = (void*)2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8204) 		*pos = 0x10000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8205) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8206) 	spin_unlock(&all_mddevs_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8207) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8208) 	if (v != (void*)1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8209) 		mddev_put(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8210) 	return next_mddev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8211) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8212) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8213) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8214) static void md_seq_stop(struct seq_file *seq, void *v)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8215) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8216) 	struct mddev *mddev = v;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8217) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8218) 	if (mddev && v != (void*)1 && v != (void*)2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8219) 		mddev_put(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8220) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8221) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8222) static int md_seq_show(struct seq_file *seq, void *v)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8223) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8224) 	struct mddev *mddev = v;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8225) 	sector_t sectors;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8226) 	struct md_rdev *rdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8227) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8228) 	if (v == (void*)1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8229) 		struct md_personality *pers;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8230) 		seq_printf(seq, "Personalities : ");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8231) 		spin_lock(&pers_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8232) 		list_for_each_entry(pers, &pers_list, list)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8233) 			seq_printf(seq, "[%s] ", pers->name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8234) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8235) 		spin_unlock(&pers_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8236) 		seq_printf(seq, "\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8237) 		seq->poll_event = atomic_read(&md_event_count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8238) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8239) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8240) 	if (v == (void*)2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8241) 		status_unused(seq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8242) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8243) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8244) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8245) 	spin_lock(&mddev->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8246) 	if (mddev->pers || mddev->raid_disks || !list_empty(&mddev->disks)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8247) 		seq_printf(seq, "%s : %sactive", mdname(mddev),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8248) 						mddev->pers ? "" : "in");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8249) 		if (mddev->pers) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8250) 			if (mddev->ro==1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8251) 				seq_printf(seq, " (read-only)");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8252) 			if (mddev->ro==2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8253) 				seq_printf(seq, " (auto-read-only)");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8254) 			seq_printf(seq, " %s", mddev->pers->name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8255) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8256) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8257) 		sectors = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8258) 		rcu_read_lock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8259) 		rdev_for_each_rcu(rdev, mddev) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8260) 			char b[BDEVNAME_SIZE];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8261) 			seq_printf(seq, " %s[%d]",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8262) 				bdevname(rdev->bdev,b), rdev->desc_nr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8263) 			if (test_bit(WriteMostly, &rdev->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8264) 				seq_printf(seq, "(W)");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8265) 			if (test_bit(Journal, &rdev->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8266) 				seq_printf(seq, "(J)");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8267) 			if (test_bit(Faulty, &rdev->flags)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8268) 				seq_printf(seq, "(F)");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8269) 				continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8270) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8271) 			if (rdev->raid_disk < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8272) 				seq_printf(seq, "(S)"); /* spare */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8273) 			if (test_bit(Replacement, &rdev->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8274) 				seq_printf(seq, "(R)");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8275) 			sectors += rdev->sectors;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8276) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8277) 		rcu_read_unlock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8278) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8279) 		if (!list_empty(&mddev->disks)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8280) 			if (mddev->pers)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8281) 				seq_printf(seq, "\n      %llu blocks",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8282) 					   (unsigned long long)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8283) 					   mddev->array_sectors / 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8284) 			else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8285) 				seq_printf(seq, "\n      %llu blocks",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8286) 					   (unsigned long long)sectors / 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8287) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8288) 		if (mddev->persistent) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8289) 			if (mddev->major_version != 0 ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8290) 			    mddev->minor_version != 90) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8291) 				seq_printf(seq," super %d.%d",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8292) 					   mddev->major_version,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8293) 					   mddev->minor_version);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8294) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8295) 		} else if (mddev->external)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8296) 			seq_printf(seq, " super external:%s",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8297) 				   mddev->metadata_type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8298) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8299) 			seq_printf(seq, " super non-persistent");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8300) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8301) 		if (mddev->pers) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8302) 			mddev->pers->status(seq, mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8303) 			seq_printf(seq, "\n      ");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8304) 			if (mddev->pers->sync_request) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8305) 				if (status_resync(seq, mddev))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8306) 					seq_printf(seq, "\n      ");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8307) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8308) 		} else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8309) 			seq_printf(seq, "\n       ");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8310) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8311) 		md_bitmap_status(seq, mddev->bitmap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8312) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8313) 		seq_printf(seq, "\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8314) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8315) 	spin_unlock(&mddev->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8316) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8317) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8318) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8319) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8320) static const struct seq_operations md_seq_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8321) 	.start  = md_seq_start,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8322) 	.next   = md_seq_next,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8323) 	.stop   = md_seq_stop,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8324) 	.show   = md_seq_show,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8325) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8326) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8327) static int md_seq_open(struct inode *inode, struct file *file)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8328) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8329) 	struct seq_file *seq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8330) 	int error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8331) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8332) 	error = seq_open(file, &md_seq_ops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8333) 	if (error)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8334) 		return error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8335) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8336) 	seq = file->private_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8337) 	seq->poll_event = atomic_read(&md_event_count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8338) 	return error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8339) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8340) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8341) static int md_unloading;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8342) static __poll_t mdstat_poll(struct file *filp, poll_table *wait)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8343) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8344) 	struct seq_file *seq = filp->private_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8345) 	__poll_t mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8346) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8347) 	if (md_unloading)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8348) 		return EPOLLIN|EPOLLRDNORM|EPOLLERR|EPOLLPRI;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8349) 	poll_wait(filp, &md_event_waiters, wait);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8350) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8351) 	/* always allow read */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8352) 	mask = EPOLLIN | EPOLLRDNORM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8353) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8354) 	if (seq->poll_event != atomic_read(&md_event_count))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8355) 		mask |= EPOLLERR | EPOLLPRI;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8356) 	return mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8357) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8358) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8359) static const struct proc_ops mdstat_proc_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8360) 	.proc_open	= md_seq_open,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8361) 	.proc_read	= seq_read,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8362) 	.proc_lseek	= seq_lseek,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8363) 	.proc_release	= seq_release,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8364) 	.proc_poll	= mdstat_poll,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8365) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8366) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8367) int register_md_personality(struct md_personality *p)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8368) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8369) 	pr_debug("md: %s personality registered for level %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8370) 		 p->name, p->level);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8371) 	spin_lock(&pers_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8372) 	list_add_tail(&p->list, &pers_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8373) 	spin_unlock(&pers_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8374) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8375) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8376) EXPORT_SYMBOL(register_md_personality);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8377) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8378) int unregister_md_personality(struct md_personality *p)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8379) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8380) 	pr_debug("md: %s personality unregistered\n", p->name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8381) 	spin_lock(&pers_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8382) 	list_del_init(&p->list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8383) 	spin_unlock(&pers_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8384) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8385) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8386) EXPORT_SYMBOL(unregister_md_personality);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8387) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8388) int register_md_cluster_operations(struct md_cluster_operations *ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8389) 				   struct module *module)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8390) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8391) 	int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8392) 	spin_lock(&pers_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8393) 	if (md_cluster_ops != NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8394) 		ret = -EALREADY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8395) 	else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8396) 		md_cluster_ops = ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8397) 		md_cluster_mod = module;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8398) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8399) 	spin_unlock(&pers_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8400) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8401) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8402) EXPORT_SYMBOL(register_md_cluster_operations);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8403) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8404) int unregister_md_cluster_operations(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8405) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8406) 	spin_lock(&pers_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8407) 	md_cluster_ops = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8408) 	spin_unlock(&pers_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8409) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8410) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8411) EXPORT_SYMBOL(unregister_md_cluster_operations);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8412) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8413) int md_setup_cluster(struct mddev *mddev, int nodes)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8414) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8415) 	int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8416) 	if (!md_cluster_ops)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8417) 		request_module("md-cluster");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8418) 	spin_lock(&pers_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8419) 	/* ensure module won't be unloaded */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8420) 	if (!md_cluster_ops || !try_module_get(md_cluster_mod)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8421) 		pr_warn("can't find md-cluster module or get it's reference.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8422) 		spin_unlock(&pers_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8423) 		return -ENOENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8424) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8425) 	spin_unlock(&pers_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8426) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8427) 	ret = md_cluster_ops->join(mddev, nodes);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8428) 	if (!ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8429) 		mddev->safemode_delay = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8430) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8431) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8432) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8433) void md_cluster_stop(struct mddev *mddev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8434) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8435) 	if (!md_cluster_ops)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8436) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8437) 	md_cluster_ops->leave(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8438) 	module_put(md_cluster_mod);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8439) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8440) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8441) static int is_mddev_idle(struct mddev *mddev, int init)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8442) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8443) 	struct md_rdev *rdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8444) 	int idle;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8445) 	int curr_events;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8446) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8447) 	idle = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8448) 	rcu_read_lock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8449) 	rdev_for_each_rcu(rdev, mddev) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8450) 		struct gendisk *disk = rdev->bdev->bd_disk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8451) 		curr_events = (int)part_stat_read_accum(&disk->part0, sectors) -
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8452) 			      atomic_read(&disk->sync_io);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8453) 		/* sync IO will cause sync_io to increase before the disk_stats
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8454) 		 * as sync_io is counted when a request starts, and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8455) 		 * disk_stats is counted when it completes.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8456) 		 * So resync activity will cause curr_events to be smaller than
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8457) 		 * when there was no such activity.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8458) 		 * non-sync IO will cause disk_stat to increase without
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8459) 		 * increasing sync_io so curr_events will (eventually)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8460) 		 * be larger than it was before.  Once it becomes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8461) 		 * substantially larger, the test below will cause
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8462) 		 * the array to appear non-idle, and resync will slow
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8463) 		 * down.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8464) 		 * If there is a lot of outstanding resync activity when
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8465) 		 * we set last_event to curr_events, then all that activity
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8466) 		 * completing might cause the array to appear non-idle
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8467) 		 * and resync will be slowed down even though there might
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8468) 		 * not have been non-resync activity.  This will only
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8469) 		 * happen once though.  'last_events' will soon reflect
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8470) 		 * the state where there is little or no outstanding
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8471) 		 * resync requests, and further resync activity will
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8472) 		 * always make curr_events less than last_events.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8473) 		 *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8474) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8475) 		if (init || curr_events - rdev->last_events > 64) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8476) 			rdev->last_events = curr_events;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8477) 			idle = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8478) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8479) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8480) 	rcu_read_unlock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8481) 	return idle;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8482) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8483) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8484) void md_done_sync(struct mddev *mddev, int blocks, int ok)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8485) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8486) 	/* another "blocks" (512byte) blocks have been synced */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8487) 	atomic_sub(blocks, &mddev->recovery_active);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8488) 	wake_up(&mddev->recovery_wait);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8489) 	if (!ok) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8490) 		set_bit(MD_RECOVERY_INTR, &mddev->recovery);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8491) 		set_bit(MD_RECOVERY_ERROR, &mddev->recovery);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8492) 		md_wakeup_thread(mddev->thread);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8493) 		// stop recovery, signal do_sync ....
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8494) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8495) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8496) EXPORT_SYMBOL(md_done_sync);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8497) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8498) /* md_write_start(mddev, bi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8499)  * If we need to update some array metadata (e.g. 'active' flag
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8500)  * in superblock) before writing, schedule a superblock update
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8501)  * and wait for it to complete.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8502)  * A return value of 'false' means that the write wasn't recorded
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8503)  * and cannot proceed as the array is being suspend.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8504)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8505) bool md_write_start(struct mddev *mddev, struct bio *bi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8506) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8507) 	int did_change = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8508) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8509) 	if (bio_data_dir(bi) != WRITE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8510) 		return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8511) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8512) 	BUG_ON(mddev->ro == 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8513) 	if (mddev->ro == 2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8514) 		/* need to switch to read/write */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8515) 		mddev->ro = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8516) 		set_bit(MD_RECOVERY_NEEDED, &mddev->recovery);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8517) 		md_wakeup_thread(mddev->thread);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8518) 		md_wakeup_thread(mddev->sync_thread);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8519) 		did_change = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8520) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8521) 	rcu_read_lock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8522) 	percpu_ref_get(&mddev->writes_pending);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8523) 	smp_mb(); /* Match smp_mb in set_in_sync() */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8524) 	if (mddev->safemode == 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8525) 		mddev->safemode = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8526) 	/* sync_checkers is always 0 when writes_pending is in per-cpu mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8527) 	if (mddev->in_sync || mddev->sync_checkers) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8528) 		spin_lock(&mddev->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8529) 		if (mddev->in_sync) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8530) 			mddev->in_sync = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8531) 			set_bit(MD_SB_CHANGE_CLEAN, &mddev->sb_flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8532) 			set_bit(MD_SB_CHANGE_PENDING, &mddev->sb_flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8533) 			md_wakeup_thread(mddev->thread);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8534) 			did_change = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8535) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8536) 		spin_unlock(&mddev->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8537) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8538) 	rcu_read_unlock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8539) 	if (did_change)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8540) 		sysfs_notify_dirent_safe(mddev->sysfs_state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8541) 	if (!mddev->has_superblocks)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8542) 		return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8543) 	wait_event(mddev->sb_wait,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8544) 		   !test_bit(MD_SB_CHANGE_PENDING, &mddev->sb_flags) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8545) 		   mddev->suspended);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8546) 	if (test_bit(MD_SB_CHANGE_PENDING, &mddev->sb_flags)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8547) 		percpu_ref_put(&mddev->writes_pending);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8548) 		return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8549) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8550) 	return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8551) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8552) EXPORT_SYMBOL(md_write_start);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8553) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8554) /* md_write_inc can only be called when md_write_start() has
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8555)  * already been called at least once of the current request.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8556)  * It increments the counter and is useful when a single request
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8557)  * is split into several parts.  Each part causes an increment and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8558)  * so needs a matching md_write_end().
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8559)  * Unlike md_write_start(), it is safe to call md_write_inc() inside
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8560)  * a spinlocked region.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8561)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8562) void md_write_inc(struct mddev *mddev, struct bio *bi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8563) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8564) 	if (bio_data_dir(bi) != WRITE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8565) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8566) 	WARN_ON_ONCE(mddev->in_sync || mddev->ro);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8567) 	percpu_ref_get(&mddev->writes_pending);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8568) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8569) EXPORT_SYMBOL(md_write_inc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8570) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8571) void md_write_end(struct mddev *mddev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8572) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8573) 	percpu_ref_put(&mddev->writes_pending);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8574) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8575) 	if (mddev->safemode == 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8576) 		md_wakeup_thread(mddev->thread);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8577) 	else if (mddev->safemode_delay)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8578) 		/* The roundup() ensures this only performs locking once
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8579) 		 * every ->safemode_delay jiffies
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8580) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8581) 		mod_timer(&mddev->safemode_timer,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8582) 			  roundup(jiffies, mddev->safemode_delay) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8583) 			  mddev->safemode_delay);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8584) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8585) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8586) EXPORT_SYMBOL(md_write_end);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8587) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8588) /* md_allow_write(mddev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8589)  * Calling this ensures that the array is marked 'active' so that writes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8590)  * may proceed without blocking.  It is important to call this before
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8591)  * attempting a GFP_KERNEL allocation while holding the mddev lock.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8592)  * Must be called with mddev_lock held.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8593)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8594) void md_allow_write(struct mddev *mddev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8595) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8596) 	if (!mddev->pers)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8597) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8598) 	if (mddev->ro)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8599) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8600) 	if (!mddev->pers->sync_request)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8601) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8602) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8603) 	spin_lock(&mddev->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8604) 	if (mddev->in_sync) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8605) 		mddev->in_sync = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8606) 		set_bit(MD_SB_CHANGE_CLEAN, &mddev->sb_flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8607) 		set_bit(MD_SB_CHANGE_PENDING, &mddev->sb_flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8608) 		if (mddev->safemode_delay &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8609) 		    mddev->safemode == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8610) 			mddev->safemode = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8611) 		spin_unlock(&mddev->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8612) 		md_update_sb(mddev, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8613) 		sysfs_notify_dirent_safe(mddev->sysfs_state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8614) 		/* wait for the dirty state to be recorded in the metadata */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8615) 		wait_event(mddev->sb_wait,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8616) 			   !test_bit(MD_SB_CHANGE_PENDING, &mddev->sb_flags));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8617) 	} else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8618) 		spin_unlock(&mddev->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8619) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8620) EXPORT_SYMBOL_GPL(md_allow_write);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8621) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8622) #define SYNC_MARKS	10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8623) #define	SYNC_MARK_STEP	(3*HZ)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8624) #define UPDATE_FREQUENCY (5*60*HZ)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8625) void md_do_sync(struct md_thread *thread)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8626) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8627) 	struct mddev *mddev = thread->mddev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8628) 	struct mddev *mddev2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8629) 	unsigned int currspeed = 0, window;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8630) 	sector_t max_sectors,j, io_sectors, recovery_done;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8631) 	unsigned long mark[SYNC_MARKS];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8632) 	unsigned long update_time;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8633) 	sector_t mark_cnt[SYNC_MARKS];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8634) 	int last_mark,m;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8635) 	struct list_head *tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8636) 	sector_t last_check;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8637) 	int skipped = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8638) 	struct md_rdev *rdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8639) 	char *desc, *action = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8640) 	struct blk_plug plug;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8641) 	int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8642) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8643) 	/* just incase thread restarts... */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8644) 	if (test_bit(MD_RECOVERY_DONE, &mddev->recovery) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8645) 	    test_bit(MD_RECOVERY_WAIT, &mddev->recovery))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8646) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8647) 	if (mddev->ro) {/* never try to sync a read-only array */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8648) 		set_bit(MD_RECOVERY_INTR, &mddev->recovery);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8649) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8650) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8651) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8652) 	if (mddev_is_clustered(mddev)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8653) 		ret = md_cluster_ops->resync_start(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8654) 		if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8655) 			goto skip;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8656) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8657) 		set_bit(MD_CLUSTER_RESYNC_LOCKED, &mddev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8658) 		if (!(test_bit(MD_RECOVERY_SYNC, &mddev->recovery) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8659) 			test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8660) 			test_bit(MD_RECOVERY_RECOVER, &mddev->recovery))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8661) 		     && ((unsigned long long)mddev->curr_resync_completed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8662) 			 < (unsigned long long)mddev->resync_max_sectors))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8663) 			goto skip;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8664) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8665) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8666) 	if (test_bit(MD_RECOVERY_SYNC, &mddev->recovery)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8667) 		if (test_bit(MD_RECOVERY_CHECK, &mddev->recovery)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8668) 			desc = "data-check";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8669) 			action = "check";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8670) 		} else if (test_bit(MD_RECOVERY_REQUESTED, &mddev->recovery)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8671) 			desc = "requested-resync";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8672) 			action = "repair";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8673) 		} else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8674) 			desc = "resync";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8675) 	} else if (test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8676) 		desc = "reshape";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8677) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8678) 		desc = "recovery";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8679) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8680) 	mddev->last_sync_action = action ?: desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8681) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8682) 	/* we overload curr_resync somewhat here.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8683) 	 * 0 == not engaged in resync at all
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8684) 	 * 2 == checking that there is no conflict with another sync
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8685) 	 * 1 == like 2, but have yielded to allow conflicting resync to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8686) 	 *		commence
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8687) 	 * other == active in resync - this many blocks
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8688) 	 *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8689) 	 * Before starting a resync we must have set curr_resync to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8690) 	 * 2, and then checked that every "conflicting" array has curr_resync
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8691) 	 * less than ours.  When we find one that is the same or higher
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8692) 	 * we wait on resync_wait.  To avoid deadlock, we reduce curr_resync
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8693) 	 * to 1 if we choose to yield (based arbitrarily on address of mddev structure).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8694) 	 * This will mean we have to start checking from the beginning again.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8695) 	 *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8696) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8697) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8698) 	do {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8699) 		int mddev2_minor = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8700) 		mddev->curr_resync = 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8701) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8702) 	try_again:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8703) 		if (test_bit(MD_RECOVERY_INTR, &mddev->recovery))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8704) 			goto skip;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8705) 		for_each_mddev(mddev2, tmp) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8706) 			if (mddev2 == mddev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8707) 				continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8708) 			if (!mddev->parallel_resync
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8709) 			&&  mddev2->curr_resync
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8710) 			&&  match_mddev_units(mddev, mddev2)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8711) 				DEFINE_WAIT(wq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8712) 				if (mddev < mddev2 && mddev->curr_resync == 2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8713) 					/* arbitrarily yield */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8714) 					mddev->curr_resync = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8715) 					wake_up(&resync_wait);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8716) 				}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8717) 				if (mddev > mddev2 && mddev->curr_resync == 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8718) 					/* no need to wait here, we can wait the next
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8719) 					 * time 'round when curr_resync == 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8720) 					 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8721) 					continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8722) 				/* We need to wait 'interruptible' so as not to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8723) 				 * contribute to the load average, and not to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8724) 				 * be caught by 'softlockup'
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8725) 				 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8726) 				prepare_to_wait(&resync_wait, &wq, TASK_INTERRUPTIBLE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8727) 				if (!test_bit(MD_RECOVERY_INTR, &mddev->recovery) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8728) 				    mddev2->curr_resync >= mddev->curr_resync) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8729) 					if (mddev2_minor != mddev2->md_minor) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8730) 						mddev2_minor = mddev2->md_minor;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8731) 						pr_info("md: delaying %s of %s until %s has finished (they share one or more physical units)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8732) 							desc, mdname(mddev),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8733) 							mdname(mddev2));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8734) 					}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8735) 					mddev_put(mddev2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8736) 					if (signal_pending(current))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8737) 						flush_signals(current);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8738) 					schedule();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8739) 					finish_wait(&resync_wait, &wq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8740) 					goto try_again;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8741) 				}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8742) 				finish_wait(&resync_wait, &wq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8743) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8744) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8745) 	} while (mddev->curr_resync < 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8746) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8747) 	j = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8748) 	if (test_bit(MD_RECOVERY_SYNC, &mddev->recovery)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8749) 		/* resync follows the size requested by the personality,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8750) 		 * which defaults to physical size, but can be virtual size
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8751) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8752) 		max_sectors = mddev->resync_max_sectors;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8753) 		atomic64_set(&mddev->resync_mismatches, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8754) 		/* we don't use the checkpoint if there's a bitmap */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8755) 		if (test_bit(MD_RECOVERY_REQUESTED, &mddev->recovery))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8756) 			j = mddev->resync_min;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8757) 		else if (!mddev->bitmap)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8758) 			j = mddev->recovery_cp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8759) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8760) 	} else if (test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8761) 		max_sectors = mddev->resync_max_sectors;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8762) 		/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8763) 		 * If the original node aborts reshaping then we continue the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8764) 		 * reshaping, so set j again to avoid restart reshape from the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8765) 		 * first beginning
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8766) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8767) 		if (mddev_is_clustered(mddev) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8768) 		    mddev->reshape_position != MaxSector)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8769) 			j = mddev->reshape_position;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8770) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8771) 		/* recovery follows the physical size of devices */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8772) 		max_sectors = mddev->dev_sectors;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8773) 		j = MaxSector;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8774) 		rcu_read_lock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8775) 		rdev_for_each_rcu(rdev, mddev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8776) 			if (rdev->raid_disk >= 0 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8777) 			    !test_bit(Journal, &rdev->flags) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8778) 			    !test_bit(Faulty, &rdev->flags) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8779) 			    !test_bit(In_sync, &rdev->flags) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8780) 			    rdev->recovery_offset < j)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8781) 				j = rdev->recovery_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8782) 		rcu_read_unlock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8783) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8784) 		/* If there is a bitmap, we need to make sure all
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8785) 		 * writes that started before we added a spare
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8786) 		 * complete before we start doing a recovery.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8787) 		 * Otherwise the write might complete and (via
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8788) 		 * bitmap_endwrite) set a bit in the bitmap after the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8789) 		 * recovery has checked that bit and skipped that
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8790) 		 * region.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8791) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8792) 		if (mddev->bitmap) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8793) 			mddev->pers->quiesce(mddev, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8794) 			mddev->pers->quiesce(mddev, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8795) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8796) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8797) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8798) 	pr_info("md: %s of RAID array %s\n", desc, mdname(mddev));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8799) 	pr_debug("md: minimum _guaranteed_  speed: %d KB/sec/disk.\n", speed_min(mddev));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8800) 	pr_debug("md: using maximum available idle IO bandwidth (but not more than %d KB/sec) for %s.\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8801) 		 speed_max(mddev), desc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8802) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8803) 	is_mddev_idle(mddev, 1); /* this initializes IO event counters */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8804) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8805) 	io_sectors = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8806) 	for (m = 0; m < SYNC_MARKS; m++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8807) 		mark[m] = jiffies;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8808) 		mark_cnt[m] = io_sectors;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8809) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8810) 	last_mark = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8811) 	mddev->resync_mark = mark[last_mark];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8812) 	mddev->resync_mark_cnt = mark_cnt[last_mark];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8813) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8814) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8815) 	 * Tune reconstruction:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8816) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8817) 	window = 32 * (PAGE_SIZE / 512);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8818) 	pr_debug("md: using %dk window, over a total of %lluk.\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8819) 		 window/2, (unsigned long long)max_sectors/2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8820) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8821) 	atomic_set(&mddev->recovery_active, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8822) 	last_check = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8823) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8824) 	if (j>2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8825) 		pr_debug("md: resuming %s of %s from checkpoint.\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8826) 			 desc, mdname(mddev));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8827) 		mddev->curr_resync = j;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8828) 	} else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8829) 		mddev->curr_resync = 3; /* no longer delayed */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8830) 	mddev->curr_resync_completed = j;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8831) 	sysfs_notify_dirent_safe(mddev->sysfs_completed);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8832) 	md_new_event(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8833) 	update_time = jiffies;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8834) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8835) 	blk_start_plug(&plug);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8836) 	while (j < max_sectors) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8837) 		sector_t sectors;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8838) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8839) 		skipped = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8840) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8841) 		if (!test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8842) 		    ((mddev->curr_resync > mddev->curr_resync_completed &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8843) 		      (mddev->curr_resync - mddev->curr_resync_completed)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8844) 		      > (max_sectors >> 4)) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8845) 		     time_after_eq(jiffies, update_time + UPDATE_FREQUENCY) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8846) 		     (j - mddev->curr_resync_completed)*2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8847) 		     >= mddev->resync_max - mddev->curr_resync_completed ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8848) 		     mddev->curr_resync_completed > mddev->resync_max
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8849) 			    )) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8850) 			/* time to update curr_resync_completed */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8851) 			wait_event(mddev->recovery_wait,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8852) 				   atomic_read(&mddev->recovery_active) == 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8853) 			mddev->curr_resync_completed = j;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8854) 			if (test_bit(MD_RECOVERY_SYNC, &mddev->recovery) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8855) 			    j > mddev->recovery_cp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8856) 				mddev->recovery_cp = j;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8857) 			update_time = jiffies;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8858) 			set_bit(MD_SB_CHANGE_CLEAN, &mddev->sb_flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8859) 			sysfs_notify_dirent_safe(mddev->sysfs_completed);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8860) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8861) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8862) 		while (j >= mddev->resync_max &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8863) 		       !test_bit(MD_RECOVERY_INTR, &mddev->recovery)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8864) 			/* As this condition is controlled by user-space,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8865) 			 * we can block indefinitely, so use '_interruptible'
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8866) 			 * to avoid triggering warnings.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8867) 			 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8868) 			flush_signals(current); /* just in case */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8869) 			wait_event_interruptible(mddev->recovery_wait,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8870) 						 mddev->resync_max > j
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8871) 						 || test_bit(MD_RECOVERY_INTR,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8872) 							     &mddev->recovery));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8873) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8874) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8875) 		if (test_bit(MD_RECOVERY_INTR, &mddev->recovery))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8876) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8877) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8878) 		sectors = mddev->pers->sync_request(mddev, j, &skipped);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8879) 		if (sectors == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8880) 			set_bit(MD_RECOVERY_INTR, &mddev->recovery);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8881) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8882) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8883) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8884) 		if (!skipped) { /* actual IO requested */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8885) 			io_sectors += sectors;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8886) 			atomic_add(sectors, &mddev->recovery_active);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8887) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8888) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8889) 		if (test_bit(MD_RECOVERY_INTR, &mddev->recovery))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8890) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8891) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8892) 		j += sectors;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8893) 		if (j > max_sectors)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8894) 			/* when skipping, extra large numbers can be returned. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8895) 			j = max_sectors;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8896) 		if (j > 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8897) 			mddev->curr_resync = j;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8898) 		mddev->curr_mark_cnt = io_sectors;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8899) 		if (last_check == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8900) 			/* this is the earliest that rebuild will be
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8901) 			 * visible in /proc/mdstat
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8902) 			 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8903) 			md_new_event(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8904) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8905) 		if (last_check + window > io_sectors || j == max_sectors)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8906) 			continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8907) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8908) 		last_check = io_sectors;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8909) 	repeat:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8910) 		if (time_after_eq(jiffies, mark[last_mark] + SYNC_MARK_STEP )) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8911) 			/* step marks */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8912) 			int next = (last_mark+1) % SYNC_MARKS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8913) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8914) 			mddev->resync_mark = mark[next];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8915) 			mddev->resync_mark_cnt = mark_cnt[next];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8916) 			mark[next] = jiffies;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8917) 			mark_cnt[next] = io_sectors - atomic_read(&mddev->recovery_active);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8918) 			last_mark = next;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8919) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8920) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8921) 		if (test_bit(MD_RECOVERY_INTR, &mddev->recovery))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8922) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8923) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8924) 		/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8925) 		 * this loop exits only if either when we are slower than
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8926) 		 * the 'hard' speed limit, or the system was IO-idle for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8927) 		 * a jiffy.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8928) 		 * the system might be non-idle CPU-wise, but we only care
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8929) 		 * about not overloading the IO subsystem. (things like an
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8930) 		 * e2fsck being done on the RAID array should execute fast)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8931) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8932) 		cond_resched();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8933) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8934) 		recovery_done = io_sectors - atomic_read(&mddev->recovery_active);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8935) 		currspeed = ((unsigned long)(recovery_done - mddev->resync_mark_cnt))/2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8936) 			/((jiffies-mddev->resync_mark)/HZ +1) +1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8937) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8938) 		if (currspeed > speed_min(mddev)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8939) 			if (currspeed > speed_max(mddev)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8940) 				msleep(500);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8941) 				goto repeat;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8942) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8943) 			if (!is_mddev_idle(mddev, 0)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8944) 				/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8945) 				 * Give other IO more of a chance.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8946) 				 * The faster the devices, the less we wait.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8947) 				 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8948) 				wait_event(mddev->recovery_wait,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8949) 					   !atomic_read(&mddev->recovery_active));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8950) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8951) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8952) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8953) 	pr_info("md: %s: %s %s.\n",mdname(mddev), desc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8954) 		test_bit(MD_RECOVERY_INTR, &mddev->recovery)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8955) 		? "interrupted" : "done");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8956) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8957) 	 * this also signals 'finished resyncing' to md_stop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8958) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8959) 	blk_finish_plug(&plug);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8960) 	wait_event(mddev->recovery_wait, !atomic_read(&mddev->recovery_active));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8961) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8962) 	if (!test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8963) 	    !test_bit(MD_RECOVERY_INTR, &mddev->recovery) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8964) 	    mddev->curr_resync > 3) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8965) 		mddev->curr_resync_completed = mddev->curr_resync;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8966) 		sysfs_notify_dirent_safe(mddev->sysfs_completed);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8967) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8968) 	mddev->pers->sync_request(mddev, max_sectors, &skipped);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8969) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8970) 	if (!test_bit(MD_RECOVERY_CHECK, &mddev->recovery) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8971) 	    mddev->curr_resync > 3) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8972) 		if (test_bit(MD_RECOVERY_SYNC, &mddev->recovery)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8973) 			if (test_bit(MD_RECOVERY_INTR, &mddev->recovery)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8974) 				if (mddev->curr_resync >= mddev->recovery_cp) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8975) 					pr_debug("md: checkpointing %s of %s.\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8976) 						 desc, mdname(mddev));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8977) 					if (test_bit(MD_RECOVERY_ERROR,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8978) 						&mddev->recovery))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8979) 						mddev->recovery_cp =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8980) 							mddev->curr_resync_completed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8981) 					else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8982) 						mddev->recovery_cp =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8983) 							mddev->curr_resync;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8984) 				}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8985) 			} else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8986) 				mddev->recovery_cp = MaxSector;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8987) 		} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8988) 			if (!test_bit(MD_RECOVERY_INTR, &mddev->recovery))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8989) 				mddev->curr_resync = MaxSector;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8990) 			if (!test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8991) 			    test_bit(MD_RECOVERY_RECOVER, &mddev->recovery)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8992) 				rcu_read_lock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8993) 				rdev_for_each_rcu(rdev, mddev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8994) 					if (rdev->raid_disk >= 0 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8995) 					    mddev->delta_disks >= 0 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8996) 					    !test_bit(Journal, &rdev->flags) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8997) 					    !test_bit(Faulty, &rdev->flags) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8998) 					    !test_bit(In_sync, &rdev->flags) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8999) 					    rdev->recovery_offset < mddev->curr_resync)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9000) 						rdev->recovery_offset = mddev->curr_resync;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9001) 				rcu_read_unlock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9002) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9003) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9004) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9005)  skip:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9006) 	/* set CHANGE_PENDING here since maybe another update is needed,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9007) 	 * so other nodes are informed. It should be harmless for normal
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9008) 	 * raid */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9009) 	set_mask_bits(&mddev->sb_flags, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9010) 		      BIT(MD_SB_CHANGE_PENDING) | BIT(MD_SB_CHANGE_DEVS));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9011) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9012) 	if (test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9013) 			!test_bit(MD_RECOVERY_INTR, &mddev->recovery) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9014) 			mddev->delta_disks > 0 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9015) 			mddev->pers->finish_reshape &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9016) 			mddev->pers->size &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9017) 			mddev->queue) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9018) 		mddev_lock_nointr(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9019) 		md_set_array_sectors(mddev, mddev->pers->size(mddev, 0, 0));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9020) 		mddev_unlock(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9021) 		if (!mddev_is_clustered(mddev)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9022) 			set_capacity(mddev->gendisk, mddev->array_sectors);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9023) 			revalidate_disk_size(mddev->gendisk, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9024) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9025) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9026) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9027) 	spin_lock(&mddev->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9028) 	if (!test_bit(MD_RECOVERY_INTR, &mddev->recovery)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9029) 		/* We completed so min/max setting can be forgotten if used. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9030) 		if (test_bit(MD_RECOVERY_REQUESTED, &mddev->recovery))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9031) 			mddev->resync_min = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9032) 		mddev->resync_max = MaxSector;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9033) 	} else if (test_bit(MD_RECOVERY_REQUESTED, &mddev->recovery))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9034) 		mddev->resync_min = mddev->curr_resync_completed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9035) 	set_bit(MD_RECOVERY_DONE, &mddev->recovery);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9036) 	mddev->curr_resync = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9037) 	spin_unlock(&mddev->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9038) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9039) 	wake_up(&resync_wait);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9040) 	md_wakeup_thread(mddev->thread);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9041) 	return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9042) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9043) EXPORT_SYMBOL_GPL(md_do_sync);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9044) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9045) static int remove_and_add_spares(struct mddev *mddev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9046) 				 struct md_rdev *this)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9047) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9048) 	struct md_rdev *rdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9049) 	int spares = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9050) 	int removed = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9051) 	bool remove_some = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9052) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9053) 	if (this && test_bit(MD_RECOVERY_RUNNING, &mddev->recovery))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9054) 		/* Mustn't remove devices when resync thread is running */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9055) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9056) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9057) 	rdev_for_each(rdev, mddev) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9058) 		if ((this == NULL || rdev == this) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9059) 		    rdev->raid_disk >= 0 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9060) 		    !test_bit(Blocked, &rdev->flags) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9061) 		    test_bit(Faulty, &rdev->flags) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9062) 		    atomic_read(&rdev->nr_pending)==0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9063) 			/* Faulty non-Blocked devices with nr_pending == 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9064) 			 * never get nr_pending incremented,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9065) 			 * never get Faulty cleared, and never get Blocked set.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9066) 			 * So we can synchronize_rcu now rather than once per device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9067) 			 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9068) 			remove_some = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9069) 			set_bit(RemoveSynchronized, &rdev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9070) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9071) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9072) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9073) 	if (remove_some)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9074) 		synchronize_rcu();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9075) 	rdev_for_each(rdev, mddev) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9076) 		if ((this == NULL || rdev == this) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9077) 		    rdev->raid_disk >= 0 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9078) 		    !test_bit(Blocked, &rdev->flags) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9079) 		    ((test_bit(RemoveSynchronized, &rdev->flags) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9080) 		     (!test_bit(In_sync, &rdev->flags) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9081) 		      !test_bit(Journal, &rdev->flags))) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9082) 		    atomic_read(&rdev->nr_pending)==0)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9083) 			if (mddev->pers->hot_remove_disk(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9084) 				    mddev, rdev) == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9085) 				sysfs_unlink_rdev(mddev, rdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9086) 				rdev->saved_raid_disk = rdev->raid_disk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9087) 				rdev->raid_disk = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9088) 				removed++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9089) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9090) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9091) 		if (remove_some && test_bit(RemoveSynchronized, &rdev->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9092) 			clear_bit(RemoveSynchronized, &rdev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9093) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9094) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9095) 	if (removed && mddev->kobj.sd)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9096) 		sysfs_notify_dirent_safe(mddev->sysfs_degraded);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9097) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9098) 	if (this && removed)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9099) 		goto no_add;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9100) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9101) 	rdev_for_each(rdev, mddev) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9102) 		if (this && this != rdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9103) 			continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9104) 		if (test_bit(Candidate, &rdev->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9105) 			continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9106) 		if (rdev->raid_disk >= 0 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9107) 		    !test_bit(In_sync, &rdev->flags) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9108) 		    !test_bit(Journal, &rdev->flags) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9109) 		    !test_bit(Faulty, &rdev->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9110) 			spares++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9111) 		if (rdev->raid_disk >= 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9112) 			continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9113) 		if (test_bit(Faulty, &rdev->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9114) 			continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9115) 		if (!test_bit(Journal, &rdev->flags)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9116) 			if (mddev->ro &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9117) 			    ! (rdev->saved_raid_disk >= 0 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9118) 			       !test_bit(Bitmap_sync, &rdev->flags)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9119) 				continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9120) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9121) 			rdev->recovery_offset = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9122) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9123) 		if (mddev->pers->hot_add_disk(mddev, rdev) == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9124) 			/* failure here is OK */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9125) 			sysfs_link_rdev(mddev, rdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9126) 			if (!test_bit(Journal, &rdev->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9127) 				spares++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9128) 			md_new_event(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9129) 			set_bit(MD_SB_CHANGE_DEVS, &mddev->sb_flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9130) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9131) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9132) no_add:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9133) 	if (removed)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9134) 		set_bit(MD_SB_CHANGE_DEVS, &mddev->sb_flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9135) 	return spares;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9136) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9137) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9138) static void md_start_sync(struct work_struct *ws)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9139) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9140) 	struct mddev *mddev = container_of(ws, struct mddev, del_work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9141) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9142) 	mddev->sync_thread = md_register_thread(md_do_sync,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9143) 						mddev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9144) 						"resync");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9145) 	if (!mddev->sync_thread) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9146) 		pr_warn("%s: could not start resync thread...\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9147) 			mdname(mddev));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9148) 		/* leave the spares where they are, it shouldn't hurt */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9149) 		clear_bit(MD_RECOVERY_SYNC, &mddev->recovery);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9150) 		clear_bit(MD_RECOVERY_RESHAPE, &mddev->recovery);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9151) 		clear_bit(MD_RECOVERY_REQUESTED, &mddev->recovery);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9152) 		clear_bit(MD_RECOVERY_CHECK, &mddev->recovery);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9153) 		clear_bit(MD_RECOVERY_RUNNING, &mddev->recovery);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9154) 		wake_up(&resync_wait);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9155) 		if (test_and_clear_bit(MD_RECOVERY_RECOVER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9156) 				       &mddev->recovery))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9157) 			if (mddev->sysfs_action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9158) 				sysfs_notify_dirent_safe(mddev->sysfs_action);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9159) 	} else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9160) 		md_wakeup_thread(mddev->sync_thread);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9161) 	sysfs_notify_dirent_safe(mddev->sysfs_action);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9162) 	md_new_event(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9163) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9164) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9165) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9166)  * This routine is regularly called by all per-raid-array threads to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9167)  * deal with generic issues like resync and super-block update.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9168)  * Raid personalities that don't have a thread (linear/raid0) do not
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9169)  * need this as they never do any recovery or update the superblock.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9170)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9171)  * It does not do any resync itself, but rather "forks" off other threads
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9172)  * to do that as needed.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9173)  * When it is determined that resync is needed, we set MD_RECOVERY_RUNNING in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9174)  * "->recovery" and create a thread at ->sync_thread.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9175)  * When the thread finishes it sets MD_RECOVERY_DONE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9176)  * and wakeups up this thread which will reap the thread and finish up.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9177)  * This thread also removes any faulty devices (with nr_pending == 0).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9178)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9179)  * The overall approach is:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9180)  *  1/ if the superblock needs updating, update it.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9181)  *  2/ If a recovery thread is running, don't do anything else.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9182)  *  3/ If recovery has finished, clean up, possibly marking spares active.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9183)  *  4/ If there are any faulty devices, remove them.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9184)  *  5/ If array is degraded, try to add spares devices
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9185)  *  6/ If array has spares or is not in-sync, start a resync thread.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9186)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9187) void md_check_recovery(struct mddev *mddev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9188) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9189) 	if (test_bit(MD_ALLOW_SB_UPDATE, &mddev->flags) && mddev->sb_flags) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9190) 		/* Write superblock - thread that called mddev_suspend()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9191) 		 * holds reconfig_mutex for us.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9192) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9193) 		set_bit(MD_UPDATING_SB, &mddev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9194) 		smp_mb__after_atomic();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9195) 		if (test_bit(MD_ALLOW_SB_UPDATE, &mddev->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9196) 			md_update_sb(mddev, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9197) 		clear_bit_unlock(MD_UPDATING_SB, &mddev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9198) 		wake_up(&mddev->sb_wait);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9199) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9200) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9201) 	if (mddev->suspended)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9202) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9203) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9204) 	if (mddev->bitmap)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9205) 		md_bitmap_daemon_work(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9206) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9207) 	if (signal_pending(current)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9208) 		if (mddev->pers->sync_request && !mddev->external) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9209) 			pr_debug("md: %s in immediate safe mode\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9210) 				 mdname(mddev));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9211) 			mddev->safemode = 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9212) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9213) 		flush_signals(current);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9214) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9215) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9216) 	if (mddev->ro && !test_bit(MD_RECOVERY_NEEDED, &mddev->recovery))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9217) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9218) 	if ( ! (
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9219) 		(mddev->sb_flags & ~ (1<<MD_SB_CHANGE_PENDING)) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9220) 		test_bit(MD_RECOVERY_NEEDED, &mddev->recovery) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9221) 		test_bit(MD_RECOVERY_DONE, &mddev->recovery) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9222) 		(mddev->external == 0 && mddev->safemode == 1) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9223) 		(mddev->safemode == 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9224) 		 && !mddev->in_sync && mddev->recovery_cp == MaxSector)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9225) 		))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9226) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9227) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9228) 	if (mddev_trylock(mddev)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9229) 		int spares = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9230) 		bool try_set_sync = mddev->safemode != 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9231) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9232) 		if (!mddev->external && mddev->safemode == 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9233) 			mddev->safemode = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9234) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9235) 		if (mddev->ro) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9236) 			struct md_rdev *rdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9237) 			if (!mddev->external && mddev->in_sync)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9238) 				/* 'Blocked' flag not needed as failed devices
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9239) 				 * will be recorded if array switched to read/write.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9240) 				 * Leaving it set will prevent the device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9241) 				 * from being removed.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9242) 				 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9243) 				rdev_for_each(rdev, mddev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9244) 					clear_bit(Blocked, &rdev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9245) 			/* On a read-only array we can:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9246) 			 * - remove failed devices
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9247) 			 * - add already-in_sync devices if the array itself
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9248) 			 *   is in-sync.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9249) 			 * As we only add devices that are already in-sync,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9250) 			 * we can activate the spares immediately.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9251) 			 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9252) 			remove_and_add_spares(mddev, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9253) 			/* There is no thread, but we need to call
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9254) 			 * ->spare_active and clear saved_raid_disk
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9255) 			 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9256) 			set_bit(MD_RECOVERY_INTR, &mddev->recovery);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9257) 			md_reap_sync_thread(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9258) 			clear_bit(MD_RECOVERY_RECOVER, &mddev->recovery);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9259) 			clear_bit(MD_RECOVERY_NEEDED, &mddev->recovery);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9260) 			clear_bit(MD_SB_CHANGE_PENDING, &mddev->sb_flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9261) 			goto unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9262) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9263) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9264) 		if (mddev_is_clustered(mddev)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9265) 			struct md_rdev *rdev, *tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9266) 			/* kick the device if another node issued a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9267) 			 * remove disk.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9268) 			 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9269) 			rdev_for_each_safe(rdev, tmp, mddev) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9270) 				if (test_and_clear_bit(ClusterRemove, &rdev->flags) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9271) 						rdev->raid_disk < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9272) 					md_kick_rdev_from_array(rdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9273) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9274) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9275) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9276) 		if (try_set_sync && !mddev->external && !mddev->in_sync) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9277) 			spin_lock(&mddev->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9278) 			set_in_sync(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9279) 			spin_unlock(&mddev->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9280) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9281) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9282) 		if (mddev->sb_flags)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9283) 			md_update_sb(mddev, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9284) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9285) 		if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9286) 		    !test_bit(MD_RECOVERY_DONE, &mddev->recovery)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9287) 			/* resync/recovery still happening */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9288) 			clear_bit(MD_RECOVERY_NEEDED, &mddev->recovery);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9289) 			goto unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9290) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9291) 		if (mddev->sync_thread) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9292) 			md_reap_sync_thread(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9293) 			goto unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9294) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9295) 		/* Set RUNNING before clearing NEEDED to avoid
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9296) 		 * any transients in the value of "sync_action".
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9297) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9298) 		mddev->curr_resync_completed = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9299) 		spin_lock(&mddev->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9300) 		set_bit(MD_RECOVERY_RUNNING, &mddev->recovery);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9301) 		spin_unlock(&mddev->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9302) 		/* Clear some bits that don't mean anything, but
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9303) 		 * might be left set
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9304) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9305) 		clear_bit(MD_RECOVERY_INTR, &mddev->recovery);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9306) 		clear_bit(MD_RECOVERY_DONE, &mddev->recovery);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9307) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9308) 		if (!test_and_clear_bit(MD_RECOVERY_NEEDED, &mddev->recovery) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9309) 		    test_bit(MD_RECOVERY_FROZEN, &mddev->recovery))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9310) 			goto not_running;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9311) 		/* no recovery is running.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9312) 		 * remove any failed drives, then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9313) 		 * add spares if possible.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9314) 		 * Spares are also removed and re-added, to allow
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9315) 		 * the personality to fail the re-add.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9316) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9317) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9318) 		if (mddev->reshape_position != MaxSector) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9319) 			if (mddev->pers->check_reshape == NULL ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9320) 			    mddev->pers->check_reshape(mddev) != 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9321) 				/* Cannot proceed */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9322) 				goto not_running;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9323) 			set_bit(MD_RECOVERY_RESHAPE, &mddev->recovery);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9324) 			clear_bit(MD_RECOVERY_RECOVER, &mddev->recovery);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9325) 		} else if ((spares = remove_and_add_spares(mddev, NULL))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9326) 			clear_bit(MD_RECOVERY_SYNC, &mddev->recovery);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9327) 			clear_bit(MD_RECOVERY_CHECK, &mddev->recovery);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9328) 			clear_bit(MD_RECOVERY_REQUESTED, &mddev->recovery);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9329) 			set_bit(MD_RECOVERY_RECOVER, &mddev->recovery);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9330) 		} else if (mddev->recovery_cp < MaxSector) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9331) 			set_bit(MD_RECOVERY_SYNC, &mddev->recovery);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9332) 			clear_bit(MD_RECOVERY_RECOVER, &mddev->recovery);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9333) 		} else if (!test_bit(MD_RECOVERY_SYNC, &mddev->recovery))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9334) 			/* nothing to be done ... */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9335) 			goto not_running;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9336) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9337) 		if (mddev->pers->sync_request) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9338) 			if (spares) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9339) 				/* We are adding a device or devices to an array
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9340) 				 * which has the bitmap stored on all devices.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9341) 				 * So make sure all bitmap pages get written
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9342) 				 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9343) 				md_bitmap_write_all(mddev->bitmap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9344) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9345) 			INIT_WORK(&mddev->del_work, md_start_sync);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9346) 			queue_work(md_misc_wq, &mddev->del_work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9347) 			goto unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9348) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9349) 	not_running:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9350) 		if (!mddev->sync_thread) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9351) 			clear_bit(MD_RECOVERY_RUNNING, &mddev->recovery);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9352) 			wake_up(&resync_wait);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9353) 			if (test_and_clear_bit(MD_RECOVERY_RECOVER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9354) 					       &mddev->recovery))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9355) 				if (mddev->sysfs_action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9356) 					sysfs_notify_dirent_safe(mddev->sysfs_action);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9357) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9358) 	unlock:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9359) 		wake_up(&mddev->sb_wait);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9360) 		mddev_unlock(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9361) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9362) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9363) EXPORT_SYMBOL(md_check_recovery);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9364) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9365) void md_reap_sync_thread(struct mddev *mddev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9366) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9367) 	struct md_rdev *rdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9368) 	sector_t old_dev_sectors = mddev->dev_sectors;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9369) 	bool is_reshaped = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9370) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9371) 	/* resync has finished, collect result */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9372) 	md_unregister_thread(&mddev->sync_thread);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9373) 	if (!test_bit(MD_RECOVERY_INTR, &mddev->recovery) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9374) 	    !test_bit(MD_RECOVERY_REQUESTED, &mddev->recovery) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9375) 	    mddev->degraded != mddev->raid_disks) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9376) 		/* success...*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9377) 		/* activate any spares */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9378) 		if (mddev->pers->spare_active(mddev)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9379) 			sysfs_notify_dirent_safe(mddev->sysfs_degraded);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9380) 			set_bit(MD_SB_CHANGE_DEVS, &mddev->sb_flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9381) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9382) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9383) 	if (test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9384) 	    mddev->pers->finish_reshape) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9385) 		mddev->pers->finish_reshape(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9386) 		if (mddev_is_clustered(mddev))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9387) 			is_reshaped = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9388) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9389) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9390) 	/* If array is no-longer degraded, then any saved_raid_disk
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9391) 	 * information must be scrapped.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9392) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9393) 	if (!mddev->degraded)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9394) 		rdev_for_each(rdev, mddev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9395) 			rdev->saved_raid_disk = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9396) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9397) 	md_update_sb(mddev, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9398) 	/* MD_SB_CHANGE_PENDING should be cleared by md_update_sb, so we can
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9399) 	 * call resync_finish here if MD_CLUSTER_RESYNC_LOCKED is set by
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9400) 	 * clustered raid */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9401) 	if (test_and_clear_bit(MD_CLUSTER_RESYNC_LOCKED, &mddev->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9402) 		md_cluster_ops->resync_finish(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9403) 	clear_bit(MD_RECOVERY_RUNNING, &mddev->recovery);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9404) 	clear_bit(MD_RECOVERY_DONE, &mddev->recovery);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9405) 	clear_bit(MD_RECOVERY_SYNC, &mddev->recovery);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9406) 	clear_bit(MD_RECOVERY_RESHAPE, &mddev->recovery);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9407) 	clear_bit(MD_RECOVERY_REQUESTED, &mddev->recovery);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9408) 	clear_bit(MD_RECOVERY_CHECK, &mddev->recovery);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9409) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9410) 	 * We call md_cluster_ops->update_size here because sync_size could
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9411) 	 * be changed by md_update_sb, and MD_RECOVERY_RESHAPE is cleared,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9412) 	 * so it is time to update size across cluster.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9413) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9414) 	if (mddev_is_clustered(mddev) && is_reshaped
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9415) 				      && !test_bit(MD_CLOSING, &mddev->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9416) 		md_cluster_ops->update_size(mddev, old_dev_sectors);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9417) 	wake_up(&resync_wait);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9418) 	/* flag recovery needed just to double check */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9419) 	set_bit(MD_RECOVERY_NEEDED, &mddev->recovery);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9420) 	sysfs_notify_dirent_safe(mddev->sysfs_action);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9421) 	md_new_event(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9422) 	if (mddev->event_work.func)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9423) 		queue_work(md_misc_wq, &mddev->event_work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9424) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9425) EXPORT_SYMBOL(md_reap_sync_thread);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9426) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9427) void md_wait_for_blocked_rdev(struct md_rdev *rdev, struct mddev *mddev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9428) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9429) 	sysfs_notify_dirent_safe(rdev->sysfs_state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9430) 	wait_event_timeout(rdev->blocked_wait,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9431) 			   !test_bit(Blocked, &rdev->flags) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9432) 			   !test_bit(BlockedBadBlocks, &rdev->flags),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9433) 			   msecs_to_jiffies(5000));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9434) 	rdev_dec_pending(rdev, mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9435) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9436) EXPORT_SYMBOL(md_wait_for_blocked_rdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9437) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9438) void md_finish_reshape(struct mddev *mddev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9439) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9440) 	/* called be personality module when reshape completes. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9441) 	struct md_rdev *rdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9442) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9443) 	rdev_for_each(rdev, mddev) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9444) 		if (rdev->data_offset > rdev->new_data_offset)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9445) 			rdev->sectors += rdev->data_offset - rdev->new_data_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9446) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9447) 			rdev->sectors -= rdev->new_data_offset - rdev->data_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9448) 		rdev->data_offset = rdev->new_data_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9449) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9450) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9451) EXPORT_SYMBOL(md_finish_reshape);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9452) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9453) /* Bad block management */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9454) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9455) /* Returns 1 on success, 0 on failure */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9456) int rdev_set_badblocks(struct md_rdev *rdev, sector_t s, int sectors,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9457) 		       int is_new)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9458) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9459) 	struct mddev *mddev = rdev->mddev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9460) 	int rv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9461) 	if (is_new)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9462) 		s += rdev->new_data_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9463) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9464) 		s += rdev->data_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9465) 	rv = badblocks_set(&rdev->badblocks, s, sectors, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9466) 	if (rv == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9467) 		/* Make sure they get written out promptly */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9468) 		if (test_bit(ExternalBbl, &rdev->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9469) 			sysfs_notify_dirent_safe(rdev->sysfs_unack_badblocks);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9470) 		sysfs_notify_dirent_safe(rdev->sysfs_state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9471) 		set_mask_bits(&mddev->sb_flags, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9472) 			      BIT(MD_SB_CHANGE_CLEAN) | BIT(MD_SB_CHANGE_PENDING));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9473) 		md_wakeup_thread(rdev->mddev->thread);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9474) 		return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9475) 	} else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9476) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9477) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9478) EXPORT_SYMBOL_GPL(rdev_set_badblocks);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9479) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9480) int rdev_clear_badblocks(struct md_rdev *rdev, sector_t s, int sectors,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9481) 			 int is_new)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9482) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9483) 	int rv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9484) 	if (is_new)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9485) 		s += rdev->new_data_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9486) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9487) 		s += rdev->data_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9488) 	rv = badblocks_clear(&rdev->badblocks, s, sectors);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9489) 	if ((rv == 0) && test_bit(ExternalBbl, &rdev->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9490) 		sysfs_notify_dirent_safe(rdev->sysfs_badblocks);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9491) 	return rv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9492) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9493) EXPORT_SYMBOL_GPL(rdev_clear_badblocks);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9494) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9495) static int md_notify_reboot(struct notifier_block *this,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9496) 			    unsigned long code, void *x)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9497) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9498) 	struct list_head *tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9499) 	struct mddev *mddev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9500) 	int need_delay = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9501) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9502) 	for_each_mddev(mddev, tmp) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9503) 		if (mddev_trylock(mddev)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9504) 			if (mddev->pers)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9505) 				__md_stop_writes(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9506) 			if (mddev->persistent)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9507) 				mddev->safemode = 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9508) 			mddev_unlock(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9509) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9510) 		need_delay = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9511) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9512) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9513) 	 * certain more exotic SCSI devices are known to be
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9514) 	 * volatile wrt too early system reboots. While the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9515) 	 * right place to handle this issue is the given
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9516) 	 * driver, we do want to have a safe RAID driver ...
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9517) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9518) 	if (need_delay)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9519) 		mdelay(1000*1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9520) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9521) 	return NOTIFY_DONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9522) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9523) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9524) static struct notifier_block md_notifier = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9525) 	.notifier_call	= md_notify_reboot,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9526) 	.next		= NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9527) 	.priority	= INT_MAX, /* before any real devices */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9528) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9529) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9530) static void md_geninit(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9531) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9532) 	pr_debug("md: sizeof(mdp_super_t) = %d\n", (int)sizeof(mdp_super_t));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9533) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9534) 	proc_create("mdstat", S_IRUGO, NULL, &mdstat_proc_ops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9535) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9536) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9537) static int __init md_init(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9538) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9539) 	int ret = -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9540) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9541) 	md_wq = alloc_workqueue("md", WQ_MEM_RECLAIM, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9542) 	if (!md_wq)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9543) 		goto err_wq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9544) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9545) 	md_misc_wq = alloc_workqueue("md_misc", 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9546) 	if (!md_misc_wq)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9547) 		goto err_misc_wq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9548) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9549) 	md_rdev_misc_wq = alloc_workqueue("md_rdev_misc", 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9550) 	if (!md_rdev_misc_wq)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9551) 		goto err_rdev_misc_wq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9552) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9553) 	if ((ret = register_blkdev(MD_MAJOR, "md")) < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9554) 		goto err_md;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9555) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9556) 	if ((ret = register_blkdev(0, "mdp")) < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9557) 		goto err_mdp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9558) 	mdp_major = ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9559) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9560) 	blk_register_region(MKDEV(MD_MAJOR, 0), 512, THIS_MODULE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9561) 			    md_probe, NULL, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9562) 	blk_register_region(MKDEV(mdp_major, 0), 1UL<<MINORBITS, THIS_MODULE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9563) 			    md_probe, NULL, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9564) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9565) 	register_reboot_notifier(&md_notifier);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9566) 	raid_table_header = register_sysctl_table(raid_root_table);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9567) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9568) 	md_geninit();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9569) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9570) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9571) err_mdp:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9572) 	unregister_blkdev(MD_MAJOR, "md");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9573) err_md:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9574) 	destroy_workqueue(md_rdev_misc_wq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9575) err_rdev_misc_wq:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9576) 	destroy_workqueue(md_misc_wq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9577) err_misc_wq:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9578) 	destroy_workqueue(md_wq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9579) err_wq:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9580) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9581) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9582) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9583) static void check_sb_changes(struct mddev *mddev, struct md_rdev *rdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9584) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9585) 	struct mdp_superblock_1 *sb = page_address(rdev->sb_page);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9586) 	struct md_rdev *rdev2, *tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9587) 	int role, ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9588) 	char b[BDEVNAME_SIZE];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9589) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9590) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9591) 	 * If size is changed in another node then we need to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9592) 	 * do resize as well.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9593) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9594) 	if (mddev->dev_sectors != le64_to_cpu(sb->size)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9595) 		ret = mddev->pers->resize(mddev, le64_to_cpu(sb->size));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9596) 		if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9597) 			pr_info("md-cluster: resize failed\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9598) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9599) 			md_bitmap_update_sb(mddev->bitmap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9600) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9601) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9602) 	/* Check for change of roles in the active devices */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9603) 	rdev_for_each_safe(rdev2, tmp, mddev) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9604) 		if (test_bit(Faulty, &rdev2->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9605) 			continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9606) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9607) 		/* Check if the roles changed */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9608) 		role = le16_to_cpu(sb->dev_roles[rdev2->desc_nr]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9609) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9610) 		if (test_bit(Candidate, &rdev2->flags)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9611) 			if (role == 0xfffe) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9612) 				pr_info("md: Removing Candidate device %s because add failed\n", bdevname(rdev2->bdev,b));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9613) 				md_kick_rdev_from_array(rdev2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9614) 				continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9615) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9616) 			else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9617) 				clear_bit(Candidate, &rdev2->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9618) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9619) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9620) 		if (role != rdev2->raid_disk) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9621) 			/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9622) 			 * got activated except reshape is happening.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9623) 			 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9624) 			if (rdev2->raid_disk == -1 && role != 0xffff &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9625) 			    !(le32_to_cpu(sb->feature_map) &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9626) 			      MD_FEATURE_RESHAPE_ACTIVE)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9627) 				rdev2->saved_raid_disk = role;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9628) 				ret = remove_and_add_spares(mddev, rdev2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9629) 				pr_info("Activated spare: %s\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9630) 					bdevname(rdev2->bdev,b));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9631) 				/* wakeup mddev->thread here, so array could
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9632) 				 * perform resync with the new activated disk */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9633) 				set_bit(MD_RECOVERY_NEEDED, &mddev->recovery);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9634) 				md_wakeup_thread(mddev->thread);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9635) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9636) 			/* device faulty
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9637) 			 * We just want to do the minimum to mark the disk
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9638) 			 * as faulty. The recovery is performed by the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9639) 			 * one who initiated the error.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9640) 			 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9641) 			if ((role == 0xfffe) || (role == 0xfffd)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9642) 				md_error(mddev, rdev2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9643) 				clear_bit(Blocked, &rdev2->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9644) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9645) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9646) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9647) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9648) 	if (mddev->raid_disks != le32_to_cpu(sb->raid_disks)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9649) 		ret = update_raid_disks(mddev, le32_to_cpu(sb->raid_disks));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9650) 		if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9651) 			pr_warn("md: updating array disks failed. %d\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9652) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9653) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9654) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9655) 	 * Since mddev->delta_disks has already updated in update_raid_disks,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9656) 	 * so it is time to check reshape.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9657) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9658) 	if (test_bit(MD_RESYNCING_REMOTE, &mddev->recovery) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9659) 	    (le32_to_cpu(sb->feature_map) & MD_FEATURE_RESHAPE_ACTIVE)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9660) 		/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9661) 		 * reshape is happening in the remote node, we need to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9662) 		 * update reshape_position and call start_reshape.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9663) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9664) 		mddev->reshape_position = le64_to_cpu(sb->reshape_position);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9665) 		if (mddev->pers->update_reshape_pos)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9666) 			mddev->pers->update_reshape_pos(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9667) 		if (mddev->pers->start_reshape)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9668) 			mddev->pers->start_reshape(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9669) 	} else if (test_bit(MD_RESYNCING_REMOTE, &mddev->recovery) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9670) 		   mddev->reshape_position != MaxSector &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9671) 		   !(le32_to_cpu(sb->feature_map) & MD_FEATURE_RESHAPE_ACTIVE)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9672) 		/* reshape is just done in another node. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9673) 		mddev->reshape_position = MaxSector;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9674) 		if (mddev->pers->update_reshape_pos)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9675) 			mddev->pers->update_reshape_pos(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9676) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9677) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9678) 	/* Finally set the event to be up to date */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9679) 	mddev->events = le64_to_cpu(sb->events);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9680) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9681) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9682) static int read_rdev(struct mddev *mddev, struct md_rdev *rdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9683) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9684) 	int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9685) 	struct page *swapout = rdev->sb_page;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9686) 	struct mdp_superblock_1 *sb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9687) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9688) 	/* Store the sb page of the rdev in the swapout temporary
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9689) 	 * variable in case we err in the future
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9690) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9691) 	rdev->sb_page = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9692) 	err = alloc_disk_sb(rdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9693) 	if (err == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9694) 		ClearPageUptodate(rdev->sb_page);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9695) 		rdev->sb_loaded = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9696) 		err = super_types[mddev->major_version].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9697) 			load_super(rdev, NULL, mddev->minor_version);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9698) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9699) 	if (err < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9700) 		pr_warn("%s: %d Could not reload rdev(%d) err: %d. Restoring old values\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9701) 				__func__, __LINE__, rdev->desc_nr, err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9702) 		if (rdev->sb_page)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9703) 			put_page(rdev->sb_page);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9704) 		rdev->sb_page = swapout;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9705) 		rdev->sb_loaded = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9706) 		return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9707) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9708) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9709) 	sb = page_address(rdev->sb_page);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9710) 	/* Read the offset unconditionally, even if MD_FEATURE_RECOVERY_OFFSET
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9711) 	 * is not set
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9712) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9713) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9714) 	if ((le32_to_cpu(sb->feature_map) & MD_FEATURE_RECOVERY_OFFSET))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9715) 		rdev->recovery_offset = le64_to_cpu(sb->recovery_offset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9716) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9717) 	/* The other node finished recovery, call spare_active to set
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9718) 	 * device In_sync and mddev->degraded
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9719) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9720) 	if (rdev->recovery_offset == MaxSector &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9721) 	    !test_bit(In_sync, &rdev->flags) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9722) 	    mddev->pers->spare_active(mddev))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9723) 		sysfs_notify_dirent_safe(mddev->sysfs_degraded);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9724) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9725) 	put_page(swapout);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9726) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9727) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9728) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9729) void md_reload_sb(struct mddev *mddev, int nr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9730) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9731) 	struct md_rdev *rdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9732) 	int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9733) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9734) 	/* Find the rdev */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9735) 	rdev_for_each_rcu(rdev, mddev) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9736) 		if (rdev->desc_nr == nr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9737) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9738) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9739) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9740) 	if (!rdev || rdev->desc_nr != nr) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9741) 		pr_warn("%s: %d Could not find rdev with nr %d\n", __func__, __LINE__, nr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9742) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9743) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9744) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9745) 	err = read_rdev(mddev, rdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9746) 	if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9747) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9748) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9749) 	check_sb_changes(mddev, rdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9750) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9751) 	/* Read all rdev's to update recovery_offset */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9752) 	rdev_for_each_rcu(rdev, mddev) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9753) 		if (!test_bit(Faulty, &rdev->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9754) 			read_rdev(mddev, rdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9755) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9756) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9757) EXPORT_SYMBOL(md_reload_sb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9758) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9759) #ifndef MODULE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9760) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9761) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9762)  * Searches all registered partitions for autorun RAID arrays
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9763)  * at boot time.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9764)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9765) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9766) static DEFINE_MUTEX(detected_devices_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9767) static LIST_HEAD(all_detected_devices);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9768) struct detected_devices_node {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9769) 	struct list_head list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9770) 	dev_t dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9771) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9772) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9773) void md_autodetect_dev(dev_t dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9774) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9775) 	struct detected_devices_node *node_detected_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9776) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9777) 	node_detected_dev = kzalloc(sizeof(*node_detected_dev), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9778) 	if (node_detected_dev) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9779) 		node_detected_dev->dev = dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9780) 		mutex_lock(&detected_devices_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9781) 		list_add_tail(&node_detected_dev->list, &all_detected_devices);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9782) 		mutex_unlock(&detected_devices_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9783) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9784) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9785) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9786) void md_autostart_arrays(int part)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9787) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9788) 	struct md_rdev *rdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9789) 	struct detected_devices_node *node_detected_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9790) 	dev_t dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9791) 	int i_scanned, i_passed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9792) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9793) 	i_scanned = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9794) 	i_passed = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9795) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9796) 	pr_info("md: Autodetecting RAID arrays.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9797) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9798) 	mutex_lock(&detected_devices_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9799) 	while (!list_empty(&all_detected_devices) && i_scanned < INT_MAX) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9800) 		i_scanned++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9801) 		node_detected_dev = list_entry(all_detected_devices.next,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9802) 					struct detected_devices_node, list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9803) 		list_del(&node_detected_dev->list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9804) 		dev = node_detected_dev->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9805) 		kfree(node_detected_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9806) 		mutex_unlock(&detected_devices_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9807) 		rdev = md_import_device(dev,0, 90);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9808) 		mutex_lock(&detected_devices_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9809) 		if (IS_ERR(rdev))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9810) 			continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9811) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9812) 		if (test_bit(Faulty, &rdev->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9813) 			continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9814) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9815) 		set_bit(AutoDetected, &rdev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9816) 		list_add(&rdev->same_set, &pending_raid_disks);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9817) 		i_passed++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9818) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9819) 	mutex_unlock(&detected_devices_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9820) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9821) 	pr_debug("md: Scanned %d and added %d devices.\n", i_scanned, i_passed);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9822) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9823) 	autorun_devices(part);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9824) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9825) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9826) #endif /* !MODULE */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9827) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9828) static __exit void md_exit(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9829) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9830) 	struct mddev *mddev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9831) 	struct list_head *tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9832) 	int delay = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9833) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9834) 	blk_unregister_region(MKDEV(MD_MAJOR,0), 512);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9835) 	blk_unregister_region(MKDEV(mdp_major,0), 1U << MINORBITS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9836) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9837) 	unregister_blkdev(MD_MAJOR,"md");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9838) 	unregister_blkdev(mdp_major, "mdp");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9839) 	unregister_reboot_notifier(&md_notifier);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9840) 	unregister_sysctl_table(raid_table_header);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9841) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9842) 	/* We cannot unload the modules while some process is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9843) 	 * waiting for us in select() or poll() - wake them up
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9844) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9845) 	md_unloading = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9846) 	while (waitqueue_active(&md_event_waiters)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9847) 		/* not safe to leave yet */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9848) 		wake_up(&md_event_waiters);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9849) 		msleep(delay);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9850) 		delay += delay;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9851) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9852) 	remove_proc_entry("mdstat", NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9853) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9854) 	for_each_mddev(mddev, tmp) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9855) 		export_array(mddev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9856) 		mddev->ctime = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9857) 		mddev->hold_active = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9858) 		/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9859) 		 * for_each_mddev() will call mddev_put() at the end of each
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9860) 		 * iteration.  As the mddev is now fully clear, this will
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9861) 		 * schedule the mddev for destruction by a workqueue, and the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9862) 		 * destroy_workqueue() below will wait for that to complete.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9863) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9864) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9865) 	destroy_workqueue(md_rdev_misc_wq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9866) 	destroy_workqueue(md_misc_wq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9867) 	destroy_workqueue(md_wq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9868) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9869) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9870) subsys_initcall(md_init);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9871) module_exit(md_exit)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9872) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9873) static int get_ro(char *buffer, const struct kernel_param *kp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9874) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9875) 	return sprintf(buffer, "%d\n", start_readonly);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9876) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9877) static int set_ro(const char *val, const struct kernel_param *kp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9878) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9879) 	return kstrtouint(val, 10, (unsigned int *)&start_readonly);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9880) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9881) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9882) module_param_call(start_ro, set_ro, get_ro, NULL, S_IRUSR|S_IWUSR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9883) module_param(start_dirty_degraded, int, S_IRUGO|S_IWUSR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9884) module_param_call(new_array, add_named_array, NULL, NULL, S_IWUSR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9885) module_param(create_on_open, bool, S_IRUSR|S_IWUSR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9886) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9887) MODULE_LICENSE("GPL");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9888) MODULE_DESCRIPTION("MD RAID framework");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9889) MODULE_ALIAS("md");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9890) MODULE_ALIAS_BLOCKDEV_MAJOR(MD_MAJOR);