|
@@ -192,6 +192,25 @@ extern int rdev_clear_badblocks(struct md_rdev *rdev, sector_t s, int sectors,
|
|
|
int is_new);
|
|
|
struct md_cluster_info;
|
|
|
|
|
|
+enum mddev_flags {
|
|
|
+ MD_CHANGE_DEVS, /* Some device status has changed */
|
|
|
+ MD_CHANGE_CLEAN, /* transition to or from 'clean' */
|
|
|
+ MD_CHANGE_PENDING, /* switch from 'clean' to 'active' in progress */
|
|
|
+ MD_ARRAY_FIRST_USE, /* First use of array, needs initialization */
|
|
|
+ MD_CLOSING, /* If set, we are closing the array, do not open
|
|
|
+ * it then */
|
|
|
+ MD_JOURNAL_CLEAN, /* A raid with journal is already clean */
|
|
|
+ MD_HAS_JOURNAL, /* The raid array has journal feature set */
|
|
|
+ MD_RELOAD_SB, /* Reload the superblock because another node
|
|
|
+ * updated it.
|
|
|
+ */
|
|
|
+ MD_CLUSTER_RESYNC_LOCKED, /* cluster raid only, which means node
|
|
|
+ * already took resync lock, need to
|
|
|
+ * release the lock */
|
|
|
+};
|
|
|
+#define MD_UPDATE_SB_FLAGS (BIT(MD_CHANGE_DEVS) | \
|
|
|
+ BIT(MD_CHANGE_CLEAN) | \
|
|
|
+ BIT(MD_CHANGE_PENDING)) /* If these are set, md_update_sb needed */
|
|
|
struct mddev {
|
|
|
void *private;
|
|
|
struct md_personality *pers;
|
|
@@ -199,21 +218,6 @@ struct mddev {
|
|
|
int md_minor;
|
|
|
struct list_head disks;
|
|
|
unsigned long flags;
|
|
|
-#define MD_CHANGE_DEVS 0 /* Some device status has changed */
|
|
|
-#define MD_CHANGE_CLEAN 1 /* transition to or from 'clean' */
|
|
|
-#define MD_CHANGE_PENDING 2 /* switch from 'clean' to 'active' in progress */
|
|
|
-#define MD_UPDATE_SB_FLAGS (1 | 2 | 4) /* If these are set, md_update_sb needed */
|
|
|
-#define MD_ARRAY_FIRST_USE 3 /* First use of array, needs initialization */
|
|
|
-#define MD_CLOSING 4 /* If set, we are closing the array, do not open
|
|
|
- * it then */
|
|
|
-#define MD_JOURNAL_CLEAN 5 /* A raid with journal is already clean */
|
|
|
-#define MD_HAS_JOURNAL 6 /* The raid array has journal feature set */
|
|
|
-#define MD_RELOAD_SB 7 /* Reload the superblock because another node
|
|
|
- * updated it.
|
|
|
- */
|
|
|
-#define MD_CLUSTER_RESYNC_LOCKED 8 /* cluster raid only, which means node
|
|
|
- * already took resync lock, need to
|
|
|
- * release the lock */
|
|
|
|
|
|
int suspended;
|
|
|
atomic_t active_io;
|
|
@@ -307,31 +311,6 @@ struct mddev {
|
|
|
int parallel_resync;
|
|
|
|
|
|
int ok_start_degraded;
|
|
|
- /* recovery/resync flags
|
|
|
- * NEEDED: we might need to start a resync/recover
|
|
|
- * RUNNING: a thread is running, or about to be started
|
|
|
- * SYNC: actually doing a resync, not a recovery
|
|
|
- * RECOVER: doing recovery, or need to try it.
|
|
|
- * INTR: resync needs to be aborted for some reason
|
|
|
- * DONE: thread is done and is waiting to be reaped
|
|
|
- * REQUEST: user-space has requested a sync (used with SYNC)
|
|
|
- * CHECK: user-space request for check-only, no repair
|
|
|
- * RESHAPE: A reshape is happening
|
|
|
- * ERROR: sync-action interrupted because io-error
|
|
|
- *
|
|
|
- * If neither SYNC or RESHAPE are set, then it is a recovery.
|
|
|
- */
|
|
|
-#define MD_RECOVERY_RUNNING 0
|
|
|
-#define MD_RECOVERY_SYNC 1
|
|
|
-#define MD_RECOVERY_RECOVER 2
|
|
|
-#define MD_RECOVERY_INTR 3
|
|
|
-#define MD_RECOVERY_DONE 4
|
|
|
-#define MD_RECOVERY_NEEDED 5
|
|
|
-#define MD_RECOVERY_REQUESTED 6
|
|
|
-#define MD_RECOVERY_CHECK 7
|
|
|
-#define MD_RECOVERY_RESHAPE 8
|
|
|
-#define MD_RECOVERY_FROZEN 9
|
|
|
-#define MD_RECOVERY_ERROR 10
|
|
|
|
|
|
unsigned long recovery;
|
|
|
/* If a RAID personality determines that recovery (of a particular
|
|
@@ -445,6 +424,23 @@ struct mddev {
|
|
|
unsigned int good_device_nr; /* good device num within cluster raid */
|
|
|
};
|
|
|
|
|
|
+enum recovery_flags {
|
|
|
+ /*
|
|
|
+ * If neither SYNC or RESHAPE are set, then it is a recovery.
|
|
|
+ */
|
|
|
+ MD_RECOVERY_RUNNING, /* a thread is running, or about to be started */
|
|
|
+ MD_RECOVERY_SYNC, /* actually doing a resync, not a recovery */
|
|
|
+ MD_RECOVERY_RECOVER, /* doing recovery, or need to try it. */
|
|
|
+ MD_RECOVERY_INTR, /* resync needs to be aborted for some reason */
|
|
|
+ MD_RECOVERY_DONE, /* thread is done and is waiting to be reaped */
|
|
|
+ MD_RECOVERY_NEEDED, /* we might need to start a resync/recover */
|
|
|
+ MD_RECOVERY_REQUESTED, /* user-space has requested a sync (used with SYNC) */
|
|
|
+ MD_RECOVERY_CHECK, /* user-space request for check-only, no repair */
|
|
|
+ MD_RECOVERY_RESHAPE, /* A reshape is happening */
|
|
|
+ MD_RECOVERY_FROZEN, /* User request to abort, and not restart, any action */
|
|
|
+ MD_RECOVERY_ERROR, /* sync-action interrupted because io-error */
|
|
|
+};
|
|
|
+
|
|
|
static inline int __must_check mddev_lock(struct mddev *mddev)
|
|
|
{
|
|
|
return mutex_lock_interruptible(&mddev->reconfig_mutex);
|