diff options
author | Jens Axboe <axboe@kernel.dk> | 2022-07-19 21:03:38 -0600 |
---|---|---|
committer | Jens Axboe <axboe@kernel.dk> | 2022-07-19 21:03:38 -0600 |
commit | bd1ebc67722962962b0d568c26f62bfa7bfe786f (patch) | |
tree | 77950beea75d50ae28c46af92475c2d18cc7ac3a /drivers/md/raid5-cache.c | |
parent | 1e89db9bd676df24bded8da2053fe24ccfb4587a (diff) | |
parent | 8c740c6bf12dec03b6f35b19fe6c183929d0b88a (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.c | 40 |
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); |