mirror of
https://github.com/torvalds/linux.git
synced 2026-06-05 04:56:13 +02:00
md: add new helpers for sync_action
The new helpers will get current sync_action of the array, will be used in later patches to make code cleaner. Signed-off-by: Yu Kuai <yukuai3@huawei.com> Signed-off-by: Song Liu <song@kernel.org> Link: https://lore.kernel.org/r/20240611132251.1967786-4-yukuai1@huaweicloud.com
This commit is contained in:
parent
a85aa09da2
commit
e792a4c215
|
|
@ -69,6 +69,16 @@
|
|||
#include "md-bitmap.h"
|
||||
#include "md-cluster.h"
|
||||
|
||||
static const char *action_name[NR_SYNC_ACTIONS] = {
|
||||
[ACTION_RESYNC] = "resync",
|
||||
[ACTION_RECOVER] = "recover",
|
||||
[ACTION_CHECK] = "check",
|
||||
[ACTION_REPAIR] = "repair",
|
||||
[ACTION_RESHAPE] = "reshape",
|
||||
[ACTION_FROZEN] = "frozen",
|
||||
[ACTION_IDLE] = "idle",
|
||||
};
|
||||
|
||||
/* pers_list is a list of registered personalities protected by pers_lock. */
|
||||
static LIST_HEAD(pers_list);
|
||||
static DEFINE_SPINLOCK(pers_lock);
|
||||
|
|
@ -4868,6 +4878,75 @@ metadata_store(struct mddev *mddev, const char *buf, size_t len)
|
|||
static struct md_sysfs_entry md_metadata =
|
||||
__ATTR_PREALLOC(metadata_version, S_IRUGO|S_IWUSR, metadata_show, metadata_store);
|
||||
|
||||
enum sync_action md_sync_action(struct mddev *mddev)
|
||||
{
|
||||
unsigned long recovery = mddev->recovery;
|
||||
|
||||
/*
|
||||
* frozen has the highest priority, means running sync_thread will be
|
||||
* stopped immediately, and no new sync_thread can start.
|
||||
*/
|
||||
if (test_bit(MD_RECOVERY_FROZEN, &recovery))
|
||||
return ACTION_FROZEN;
|
||||
|
||||
/*
|
||||
* read-only array can't register sync_thread, and it can only
|
||||
* add/remove spares.
|
||||
*/
|
||||
if (!md_is_rdwr(mddev))
|
||||
return ACTION_IDLE;
|
||||
|
||||
/*
|
||||
* idle means no sync_thread is running, and no new sync_thread is
|
||||
* requested.
|
||||
*/
|
||||
if (!test_bit(MD_RECOVERY_RUNNING, &recovery) &&
|
||||
!test_bit(MD_RECOVERY_NEEDED, &recovery))
|
||||
return ACTION_IDLE;
|
||||
|
||||
if (test_bit(MD_RECOVERY_RESHAPE, &recovery) ||
|
||||
mddev->reshape_position != MaxSector)
|
||||
return ACTION_RESHAPE;
|
||||
|
||||
if (test_bit(MD_RECOVERY_RECOVER, &recovery))
|
||||
return ACTION_RECOVER;
|
||||
|
||||
if (test_bit(MD_RECOVERY_SYNC, &recovery)) {
|
||||
/*
|
||||
* MD_RECOVERY_CHECK must be paired with
|
||||
* MD_RECOVERY_REQUESTED.
|
||||
*/
|
||||
if (test_bit(MD_RECOVERY_CHECK, &recovery))
|
||||
return ACTION_CHECK;
|
||||
if (test_bit(MD_RECOVERY_REQUESTED, &recovery))
|
||||
return ACTION_REPAIR;
|
||||
return ACTION_RESYNC;
|
||||
}
|
||||
|
||||
/*
|
||||
* MD_RECOVERY_NEEDED or MD_RECOVERY_RUNNING is set, however, no
|
||||
* sync_action is specified.
|
||||
*/
|
||||
return ACTION_IDLE;
|
||||
}
|
||||
|
||||
enum sync_action md_sync_action_by_name(const char *page)
|
||||
{
|
||||
enum sync_action action;
|
||||
|
||||
for (action = 0; action < NR_SYNC_ACTIONS; ++action) {
|
||||
if (cmd_match(page, action_name[action]))
|
||||
return action;
|
||||
}
|
||||
|
||||
return NR_SYNC_ACTIONS;
|
||||
}
|
||||
|
||||
const char *md_sync_action_name(enum sync_action action)
|
||||
{
|
||||
return action_name[action];
|
||||
}
|
||||
|
||||
static ssize_t
|
||||
action_show(struct mddev *mddev, char *page)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -864,6 +864,9 @@ extern void md_unregister_thread(struct mddev *mddev, struct md_thread __rcu **t
|
|||
extern void md_wakeup_thread(struct md_thread __rcu *thread);
|
||||
extern void md_check_recovery(struct mddev *mddev);
|
||||
extern void md_reap_sync_thread(struct mddev *mddev);
|
||||
extern enum sync_action md_sync_action(struct mddev *mddev);
|
||||
extern enum sync_action md_sync_action_by_name(const char *page);
|
||||
extern const char *md_sync_action_name(enum sync_action action);
|
||||
extern void md_write_start(struct mddev *mddev, struct bio *bi);
|
||||
extern void md_write_inc(struct mddev *mddev, struct bio *bi);
|
||||
extern void md_write_end(struct mddev *mddev);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user