hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/drivers/md/md.h
....@@ -1,15 +1,8 @@
1
+/* SPDX-License-Identifier: GPL-2.0-or-later */
12 /*
23 md.h : kernel internal structure of the Linux MD driver
34 Copyright (C) 1996-98 Ingo Molnar, Gadi Oxman
45
5
- This program is free software; you can redistribute it and/or modify
6
- it under the terms of the GNU General Public License as published by
7
- the Free Software Foundation; either version 2, or (at your option)
8
- any later version.
9
-
10
- You should have received a copy of the GNU General Public License
11
- (for example /usr/src/linux/COPYING); if not, write to the Free
12
- Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
136 */
147
158 #ifndef _MD_MD_H
....@@ -39,6 +32,16 @@
3932 * be retried.
4033 */
4134 #define MD_FAILFAST (REQ_FAILFAST_DEV | REQ_FAILFAST_TRANSPORT)
35
+
36
+/*
37
+ * The struct embedded in rdev is used to serialize IO.
38
+ */
39
+struct serial_in_rdev {
40
+ struct rb_root_cached serial_rb;
41
+ spinlock_t serial_lock;
42
+ wait_queue_head_t serial_io_wait;
43
+};
44
+
4245 /*
4346 * MD's 'extended' device
4447 */
....@@ -116,11 +119,17 @@
116119 * for reporting to userspace and storing
117120 * in superblock.
118121 */
122
+
123
+ struct serial_in_rdev *serial; /* used for raid1 io serialization */
124
+
119125 struct work_struct del_work; /* used for delayed sysfs removal */
120126
121127 struct kernfs_node *sysfs_state; /* handle for 'state'
122128 * sysfs entry */
123
-
129
+ /* handle for 'unacknowledged_bad_blocks' sysfs dentry */
130
+ struct kernfs_node *sysfs_unack_badblocks;
131
+ /* handle for 'bad_blocks' sysfs dentry */
132
+ struct kernfs_node *sysfs_badblocks;
124133 struct badblocks badblocks;
125134
126135 struct {
....@@ -200,6 +209,10 @@
200209 * it didn't fail, so don't use FailFast
201210 * any more for metadata
202211 */
212
+ CollisionCheck, /*
213
+ * check if there is collision between raid1
214
+ * serial bios.
215
+ */
203216 };
204217
205218 static inline int is_badblock(struct md_rdev *rdev, sector_t s, int sectors,
....@@ -246,6 +259,9 @@
246259 MD_NOT_READY, /* do_md_run() is active, so 'array_state'
247260 * must not report that array is ready yet
248261 */
262
+ MD_BROKEN, /* This is used in RAID-0/LINEAR only, to stop
263
+ * I/O in case an array member is gone/failed.
264
+ */
249265 };
250266
251267 enum mddev_sb_flags {
....@@ -253,6 +269,15 @@
253269 MD_SB_CHANGE_CLEAN, /* transition to or from 'clean' */
254270 MD_SB_CHANGE_PENDING, /* switch from 'clean' to 'active' in progress */
255271 MD_SB_NEED_REWRITE, /* metadata write needs to be repeated */
272
+};
273
+
274
+#define NR_SERIAL_INFOS 8
275
+/* record current range of serialize IOs */
276
+struct serial_info {
277
+ struct rb_node node;
278
+ sector_t start; /* start sector of rb node */
279
+ sector_t last; /* end sector of rb node */
280
+ sector_t _subtree_last; /* highest sector in subtree of rb node */
256281 };
257282
258283 struct mddev {
....@@ -372,7 +397,7 @@
372397 * These locks are separate due to conflicting interactions
373398 * with bdev->bd_mutex.
374399 * Lock ordering is:
375
- * reconfig_mutex -> bd_mutex : e.g. do_md_run -> revalidate_disk
400
+ * reconfig_mutex -> bd_mutex
376401 * bd_mutex -> open_mutex: e.g. __blkdev_get -> md_open
377402 */
378403 struct mutex open_mutex;
....@@ -398,6 +423,9 @@
398423 * file in sysfs.
399424 */
400425 struct kernfs_node *sysfs_action; /* handle for 'sync_action' */
426
+ struct kernfs_node *sysfs_completed; /*handle for 'sync_completed' */
427
+ struct kernfs_node *sysfs_degraded; /*handle for 'degraded' */
428
+ struct kernfs_node *sysfs_level; /*handle for 'level' */
401429
402430 struct work_struct del_work; /* used for delayed sysfs removal */
403431
....@@ -471,11 +499,15 @@
471499 */
472500 struct work_struct flush_work;
473501 struct work_struct event_work; /* used by dm to report failure event */
502
+ mempool_t *serial_info_pool;
474503 void (*sync_super)(struct mddev *mddev, struct md_rdev *rdev);
475504 struct md_cluster_info *cluster_info;
476505 unsigned int good_device_nr; /* good device num within cluster raid */
506
+ unsigned int noio_flag; /* for memalloc scope API */
477507
478508 bool has_superblocks:1;
509
+ bool fail_last_dev:1;
510
+ bool serialize_policy:1;
479511 };
480512
481513 enum recovery_flags {
....@@ -518,7 +550,7 @@
518550
519551 static inline void md_sync_acct(struct block_device *bdev, unsigned long nr_sectors)
520552 {
521
- atomic_add(nr_sectors, &bdev->bd_contains->bd_disk->sync_io);
553
+ atomic_add(nr_sectors, &bdev->bd_disk->sync_io);
522554 }
523555
524556 static inline void md_sync_acct_bio(struct bio *bio, unsigned long nr_sectors)
....@@ -555,6 +587,7 @@
555587 int (*check_reshape) (struct mddev *mddev);
556588 int (*start_reshape) (struct mddev *mddev);
557589 void (*finish_reshape) (struct mddev *mddev);
590
+ void (*update_reshape_pos) (struct mddev *mddev);
558591 /* quiesce suspends or resumes internal processing.
559592 * 1 - stop new actions and wait for action io to complete
560593 * 0 - return to normal behaviour
....@@ -570,9 +603,6 @@
570603 * array.
571604 */
572605 void *(*takeover) (struct mddev *mddev);
573
- /* congested implements bdi.congested_fn().
574
- * Will not be called while array is 'suspended' */
575
- int (*congested)(struct mddev *mddev, int bits);
576606 /* Changes the consistency policy of an active array. */
577607 int (*change_consistency_policy)(struct mddev *mddev, const char *buf);
578608 };
....@@ -683,7 +713,6 @@
683713 extern void md_error(struct mddev *mddev, struct md_rdev *rdev);
684714 extern void md_finish_reshape(struct mddev *mddev);
685715
686
-extern int mddev_congested(struct mddev *mddev, int bits);
687716 extern bool __must_check md_flush_request(struct mddev *mddev, struct bio *bio);
688717 extern void md_super_write(struct mddev *mddev, struct md_rdev *rdev,
689718 sector_t sector, int size, struct page *page);
....@@ -718,8 +747,25 @@
718747 extern void md_reload_sb(struct mddev *mddev, int raid_disk);
719748 extern void md_update_sb(struct mddev *mddev, int force);
720749 extern void md_kick_rdev_from_array(struct md_rdev * rdev);
750
+extern void mddev_create_serial_pool(struct mddev *mddev, struct md_rdev *rdev,
751
+ bool is_suspend);
752
+extern void mddev_destroy_serial_pool(struct mddev *mddev, struct md_rdev *rdev,
753
+ bool is_suspend);
721754 struct md_rdev *md_find_rdev_nr_rcu(struct mddev *mddev, int nr);
722755 struct md_rdev *md_find_rdev_rcu(struct mddev *mddev, dev_t dev);
756
+
757
+static inline bool is_mddev_broken(struct md_rdev *rdev, const char *md_type)
758
+{
759
+ int flags = rdev->bdev->bd_disk->flags;
760
+
761
+ if (!(flags & GENHD_FL_UP)) {
762
+ if (!test_and_set_bit(MD_BROKEN, &rdev->mddev->flags))
763
+ pr_warn("md: %s: %s array has a missing/failed member\n",
764
+ mdname(rdev->mddev), md_type);
765
+ return true;
766
+ }
767
+ return false;
768
+}
723769
724770 static inline void rdev_dec_pending(struct md_rdev *rdev, struct mddev *mddev)
725771 {
....@@ -756,4 +802,16 @@
756802 !bio->bi_disk->queue->limits.max_write_zeroes_sectors)
757803 mddev->queue->limits.max_write_zeroes_sectors = 0;
758804 }
805
+
806
+struct mdu_array_info_s;
807
+struct mdu_disk_info_s;
808
+
809
+extern int mdp_major;
810
+void md_autostart_arrays(int part);
811
+int md_set_array_info(struct mddev *mddev, struct mdu_array_info_s *info);
812
+int md_add_new_disk(struct mddev *mddev, struct mdu_disk_info_s *info);
813
+int do_md_run(struct mddev *mddev);
814
+
815
+extern const struct block_device_operations md_fops;
816
+
759817 #endif /* _MD_MD_H */