aboutsummaryrefslogtreecommitdiff
path: root/drivers/md/raid5-cache.c
diff options
context:
space:
mode:
authorJens Axboe <axboe@kernel.dk>2022-07-19 21:03:38 -0600
committerJens Axboe <axboe@kernel.dk>2022-07-19 21:03:38 -0600
commitbd1ebc67722962962b0d568c26f62bfa7bfe786f (patch)
tree77950beea75d50ae28c46af92475c2d18cc7ac3a /drivers/md/raid5-cache.c
parent1e89db9bd676df24bded8da2053fe24ccfb4587a (diff)
parent8c740c6bf12dec03b6f35b19fe6c183929d0b88a (diff)
Merge branch 'for-5.20/drivers' into for-5.20/drivers-post
* for-5.20/drivers: (66 commits) null_blk: fix ida error handling in null_add_dev() null_blk: cleanup null_init_tag_set nvme-multipath: refactor nvme_mpath_add_disk nvme-apple: use nvme core helper to cancel requests in tagset nvme-pci: use nvme core helper to cancel requests in tagset nvme-tcp: use in-capsule data for I/O connect nvme-rdma: remove timeout for getting RDMA-CM established event null_blk: add configfs variables for 2 options null_blk: add module parameters for 4 options block/rnbd-srv: Replace sess_dev_list with index_idr block/rnbd-srv: Set keep_id to true after mutex_trylock nvmet-auth: expire authentication sessions nvmet-auth: Diffie-Hellman key exchange support nvmet: implement basic In-Band Authentication nvmet: parse fabrics commands on io queues nvme-auth: Diffie-Hellman key exchange support nvme: implement In-Band authentication nvme-fabrics: decode 'authentication required' connect error nvme: add definitions for NVMe In-Band authentication lib/base64: RFC4648-compliant base64 encoding ... Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'drivers/md/raid5-cache.c')
-rw-r--r--drivers/md/raid5-cache.c40
1 files changed, 19 insertions, 21 deletions
diff --git a/drivers/md/raid5-cache.c b/drivers/md/raid5-cache.c
index 6f2dd73128b0..f4e1cc1ece43 100644
--- a/drivers/md/raid5-cache.c
+++ b/drivers/md/raid5-cache.c
@@ -1590,18 +1590,13 @@ void r5l_quiesce(struct r5l_log *log, int quiesce)
bool r5l_log_disk_error(struct r5conf *conf)
{
- struct r5l_log *log;
- bool ret;
- /* don't allow write if journal disk is missing */
- rcu_read_lock();
- log = rcu_dereference(conf->log);
+ struct r5l_log *log = conf->log;
+ /* don't allow write if journal disk is missing */
if (!log)
- ret = test_bit(MD_HAS_JOURNAL, &conf->mddev->flags);
+ return test_bit(MD_HAS_JOURNAL, &conf->mddev->flags);
else
- ret = test_bit(Faulty, &log->rdev->flags);
- rcu_read_unlock();
- return ret;
+ return test_bit(Faulty, &log->rdev->flags);
}
#define R5L_RECOVERY_PAGE_POOL_SIZE 256
@@ -2534,12 +2529,13 @@ static ssize_t r5c_journal_mode_show(struct mddev *mddev, char *page)
struct r5conf *conf;
int ret;
- spin_lock(&mddev->lock);
+ ret = mddev_lock(mddev);
+ if (ret)
+ return ret;
+
conf = mddev->private;
- if (!conf || !conf->log) {
- spin_unlock(&mddev->lock);
- return 0;
- }
+ if (!conf || !conf->log)
+ goto out_unlock;
switch (conf->log->r5c_journal_mode) {
case R5C_JOURNAL_MODE_WRITE_THROUGH:
@@ -2557,7 +2553,9 @@ static ssize_t r5c_journal_mode_show(struct mddev *mddev, char *page)
default:
ret = 0;
}
- spin_unlock(&mddev->lock);
+
+out_unlock:
+ mddev_unlock(mddev);
return ret;
}
@@ -2639,7 +2637,7 @@ int r5c_try_caching_write(struct r5conf *conf,
int i;
struct r5dev *dev;
int to_cache = 0;
- void **pslot;
+ void __rcu **pslot;
sector_t tree_index;
int ret;
uintptr_t refcount;
@@ -2806,7 +2804,7 @@ void r5c_finish_stripe_write_out(struct r5conf *conf,
int i;
int do_wakeup = 0;
sector_t tree_index;
- void **pslot;
+ void __rcu **pslot;
uintptr_t refcount;
if (!log || !test_bit(R5_InJournal, &sh->dev[sh->pd_idx].flags))
@@ -3145,7 +3143,7 @@ int r5l_init_log(struct r5conf *conf, struct md_rdev *rdev)
spin_lock_init(&log->stripe_in_journal_lock);
atomic_set(&log->stripe_in_journal_count, 0);
- rcu_assign_pointer(conf->log, log);
+ conf->log = log;
set_bit(MD_HAS_JOURNAL, &conf->mddev->flags);
return 0;
@@ -3167,13 +3165,13 @@ void r5l_exit_log(struct r5conf *conf)
{
struct r5l_log *log = conf->log;
- conf->log = NULL;
- synchronize_rcu();
-
/* Ensure disable_writeback_work wakes up and exits */
wake_up(&conf->mddev->sb_wait);
flush_work(&log->disable_writeback_work);
md_unregister_thread(&log->reclaim_thread);
+
+ conf->log = NULL;
+
mempool_exit(&log->meta_pool);
bioset_exit(&log->bs);
mempool_exit(&log->io_pool);