md/raid5: Cleanup prototype of raid5_get_active_stripe()
Drop the three bools in the prototype of raid5_get_active_stripe() and replace them with a flags parameter. At the same time, drop the distinction with __raid5_get_active_stripe(). Suggested-by: Christoph Hellwig <hch@infradead.org> Signed-off-by: Logan Gunthorpe <logang@deltatee.com> Signed-off-by: Song Liu <song@kernel.org>
This commit is contained in:
parent
9892fa993f
commit
2f2d51efd8
|
@ -1923,7 +1923,8 @@ r5c_recovery_alloc_stripe(
|
||||||
{
|
{
|
||||||
struct stripe_head *sh;
|
struct stripe_head *sh;
|
||||||
|
|
||||||
sh = raid5_get_active_stripe(conf, stripe_sect, 0, noblock, 0);
|
sh = raid5_get_active_stripe(conf, NULL, stripe_sect,
|
||||||
|
noblock ? R5_GAS_NOBLOCK : 0);
|
||||||
if (!sh)
|
if (!sh)
|
||||||
return NULL; /* no more stripe available */
|
return NULL; /* no more stripe available */
|
||||||
|
|
||||||
|
|
|
@ -800,19 +800,20 @@ static bool is_inactive_blocked(struct r5conf *conf, int hash)
|
||||||
return active < (conf->max_nr_stripes * 3 / 4);
|
return active < (conf->max_nr_stripes * 3 / 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct stripe_head *__raid5_get_active_stripe(struct r5conf *conf,
|
struct stripe_head *raid5_get_active_stripe(struct r5conf *conf,
|
||||||
struct stripe_request_ctx *ctx, sector_t sector,
|
struct stripe_request_ctx *ctx, sector_t sector,
|
||||||
bool previous, bool noblock, bool noquiesce)
|
unsigned int flags)
|
||||||
{
|
{
|
||||||
struct stripe_head *sh;
|
struct stripe_head *sh;
|
||||||
int hash = stripe_hash_locks_hash(conf, sector);
|
int hash = stripe_hash_locks_hash(conf, sector);
|
||||||
|
int previous = !!(flags & R5_GAS_PREVIOUS);
|
||||||
|
|
||||||
pr_debug("get_stripe, sector %llu\n", (unsigned long long)sector);
|
pr_debug("get_stripe, sector %llu\n", (unsigned long long)sector);
|
||||||
|
|
||||||
spin_lock_irq(conf->hash_locks + hash);
|
spin_lock_irq(conf->hash_locks + hash);
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
if (!noquiesce && conf->quiesce) {
|
if (!(flags & R5_GAS_NOQUIESCE) && conf->quiesce) {
|
||||||
/*
|
/*
|
||||||
* Must release the reference to batch_last before
|
* Must release the reference to batch_last before
|
||||||
* waiting, on quiesce, otherwise the batch_last will
|
* waiting, on quiesce, otherwise the batch_last will
|
||||||
|
@ -848,7 +849,7 @@ static struct stripe_head *__raid5_get_active_stripe(struct r5conf *conf,
|
||||||
set_bit(R5_ALLOC_MORE, &conf->cache_state);
|
set_bit(R5_ALLOC_MORE, &conf->cache_state);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (noblock)
|
if (flags & R5_GAS_NOBLOCK)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
set_bit(R5_INACTIVE_BLOCKED, &conf->cache_state);
|
set_bit(R5_INACTIVE_BLOCKED, &conf->cache_state);
|
||||||
|
@ -863,13 +864,6 @@ static struct stripe_head *__raid5_get_active_stripe(struct r5conf *conf,
|
||||||
return sh;
|
return sh;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct stripe_head *raid5_get_active_stripe(struct r5conf *conf,
|
|
||||||
sector_t sector, bool previous, bool noblock, bool noquiesce)
|
|
||||||
{
|
|
||||||
return __raid5_get_active_stripe(conf, NULL, sector, previous, noblock,
|
|
||||||
noquiesce);
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool is_full_stripe_write(struct stripe_head *sh)
|
static bool is_full_stripe_write(struct stripe_head *sh)
|
||||||
{
|
{
|
||||||
BUG_ON(sh->overwrite_disks > (sh->disks - sh->raid_conf->max_degraded));
|
BUG_ON(sh->overwrite_disks > (sh->disks - sh->raid_conf->max_degraded));
|
||||||
|
@ -4636,7 +4630,8 @@ static void handle_stripe_expansion(struct r5conf *conf, struct stripe_head *sh)
|
||||||
sector_t bn = raid5_compute_blocknr(sh, i, 1);
|
sector_t bn = raid5_compute_blocknr(sh, i, 1);
|
||||||
sector_t s = raid5_compute_sector(conf, bn, 0,
|
sector_t s = raid5_compute_sector(conf, bn, 0,
|
||||||
&dd_idx, NULL);
|
&dd_idx, NULL);
|
||||||
sh2 = raid5_get_active_stripe(conf, s, 0, 1, 1);
|
sh2 = raid5_get_active_stripe(conf, NULL, s,
|
||||||
|
R5_GAS_NOBLOCK | R5_GAS_NOQUIESCE);
|
||||||
if (sh2 == NULL)
|
if (sh2 == NULL)
|
||||||
/* so far only the early blocks of this stripe
|
/* so far only the early blocks of this stripe
|
||||||
* have been requested. When later blocks
|
* have been requested. When later blocks
|
||||||
|
@ -5273,7 +5268,9 @@ static void handle_stripe(struct stripe_head *sh)
|
||||||
/* Finish reconstruct operations initiated by the expansion process */
|
/* Finish reconstruct operations initiated by the expansion process */
|
||||||
if (sh->reconstruct_state == reconstruct_state_result) {
|
if (sh->reconstruct_state == reconstruct_state_result) {
|
||||||
struct stripe_head *sh_src
|
struct stripe_head *sh_src
|
||||||
= raid5_get_active_stripe(conf, sh->sector, 1, 1, 1);
|
= raid5_get_active_stripe(conf, NULL, sh->sector,
|
||||||
|
R5_GAS_PREVIOUS | R5_GAS_NOBLOCK |
|
||||||
|
R5_GAS_NOQUIESCE);
|
||||||
if (sh_src && test_bit(STRIPE_EXPAND_SOURCE, &sh_src->state)) {
|
if (sh_src && test_bit(STRIPE_EXPAND_SOURCE, &sh_src->state)) {
|
||||||
/* sh cannot be written until sh_src has been read.
|
/* sh cannot be written until sh_src has been read.
|
||||||
* so arrange for sh to be delayed a little
|
* so arrange for sh to be delayed a little
|
||||||
|
@ -5823,7 +5820,7 @@ static void make_discard_request(struct mddev *mddev, struct bio *bi)
|
||||||
DEFINE_WAIT(w);
|
DEFINE_WAIT(w);
|
||||||
int d;
|
int d;
|
||||||
again:
|
again:
|
||||||
sh = raid5_get_active_stripe(conf, logical_sector, 0, 0, 0);
|
sh = raid5_get_active_stripe(conf, NULL, logical_sector, 0);
|
||||||
prepare_to_wait(&conf->wait_for_overlap, &w,
|
prepare_to_wait(&conf->wait_for_overlap, &w,
|
||||||
TASK_UNINTERRUPTIBLE);
|
TASK_UNINTERRUPTIBLE);
|
||||||
set_bit(R5_Overlap, &sh->dev[sh->pd_idx].flags);
|
set_bit(R5_Overlap, &sh->dev[sh->pd_idx].flags);
|
||||||
|
@ -5978,7 +5975,7 @@ static enum stripe_result make_stripe_request(struct mddev *mddev,
|
||||||
enum stripe_result ret;
|
enum stripe_result ret;
|
||||||
struct stripe_head *sh;
|
struct stripe_head *sh;
|
||||||
sector_t new_sector;
|
sector_t new_sector;
|
||||||
int previous = 0;
|
int previous = 0, flags = 0;
|
||||||
int seq, dd_idx;
|
int seq, dd_idx;
|
||||||
|
|
||||||
seq = read_seqcount_begin(&conf->gen_lock);
|
seq = read_seqcount_begin(&conf->gen_lock);
|
||||||
|
@ -6012,8 +6009,11 @@ static enum stripe_result make_stripe_request(struct mddev *mddev,
|
||||||
pr_debug("raid456: %s, sector %llu logical %llu\n", __func__,
|
pr_debug("raid456: %s, sector %llu logical %llu\n", __func__,
|
||||||
new_sector, logical_sector);
|
new_sector, logical_sector);
|
||||||
|
|
||||||
sh = __raid5_get_active_stripe(conf, ctx, new_sector, previous,
|
if (previous)
|
||||||
(bi->bi_opf & REQ_RAHEAD), 0);
|
flags |= R5_GAS_PREVIOUS;
|
||||||
|
if (bi->bi_opf & REQ_RAHEAD)
|
||||||
|
flags |= R5_GAS_NOBLOCK;
|
||||||
|
sh = raid5_get_active_stripe(conf, ctx, new_sector, flags);
|
||||||
if (unlikely(!sh)) {
|
if (unlikely(!sh)) {
|
||||||
/* cannot get stripe, just give-up */
|
/* cannot get stripe, just give-up */
|
||||||
bi->bi_status = BLK_STS_IOERR;
|
bi->bi_status = BLK_STS_IOERR;
|
||||||
|
@ -6362,7 +6362,8 @@ static sector_t reshape_request(struct mddev *mddev, sector_t sector_nr, int *sk
|
||||||
for (i = 0; i < reshape_sectors; i += RAID5_STRIPE_SECTORS(conf)) {
|
for (i = 0; i < reshape_sectors; i += RAID5_STRIPE_SECTORS(conf)) {
|
||||||
int j;
|
int j;
|
||||||
int skipped_disk = 0;
|
int skipped_disk = 0;
|
||||||
sh = raid5_get_active_stripe(conf, stripe_addr+i, 0, 0, 1);
|
sh = raid5_get_active_stripe(conf, NULL, stripe_addr+i,
|
||||||
|
R5_GAS_NOQUIESCE);
|
||||||
set_bit(STRIPE_EXPANDING, &sh->state);
|
set_bit(STRIPE_EXPANDING, &sh->state);
|
||||||
atomic_inc(&conf->reshape_stripes);
|
atomic_inc(&conf->reshape_stripes);
|
||||||
/* If any of this stripe is beyond the end of the old
|
/* If any of this stripe is beyond the end of the old
|
||||||
|
@ -6411,7 +6412,8 @@ static sector_t reshape_request(struct mddev *mddev, sector_t sector_nr, int *sk
|
||||||
if (last_sector >= mddev->dev_sectors)
|
if (last_sector >= mddev->dev_sectors)
|
||||||
last_sector = mddev->dev_sectors - 1;
|
last_sector = mddev->dev_sectors - 1;
|
||||||
while (first_sector <= last_sector) {
|
while (first_sector <= last_sector) {
|
||||||
sh = raid5_get_active_stripe(conf, first_sector, 1, 0, 1);
|
sh = raid5_get_active_stripe(conf, NULL, first_sector,
|
||||||
|
R5_GAS_PREVIOUS | R5_GAS_NOQUIESCE);
|
||||||
set_bit(STRIPE_EXPAND_SOURCE, &sh->state);
|
set_bit(STRIPE_EXPAND_SOURCE, &sh->state);
|
||||||
set_bit(STRIPE_HANDLE, &sh->state);
|
set_bit(STRIPE_HANDLE, &sh->state);
|
||||||
raid5_release_stripe(sh);
|
raid5_release_stripe(sh);
|
||||||
|
@ -6531,9 +6533,10 @@ static inline sector_t raid5_sync_request(struct mddev *mddev, sector_t sector_n
|
||||||
|
|
||||||
md_bitmap_cond_end_sync(mddev->bitmap, sector_nr, false);
|
md_bitmap_cond_end_sync(mddev->bitmap, sector_nr, false);
|
||||||
|
|
||||||
sh = raid5_get_active_stripe(conf, sector_nr, 0, 1, 0);
|
sh = raid5_get_active_stripe(conf, NULL, sector_nr,
|
||||||
|
R5_GAS_NOBLOCK);
|
||||||
if (sh == NULL) {
|
if (sh == NULL) {
|
||||||
sh = raid5_get_active_stripe(conf, sector_nr, 0, 0, 0);
|
sh = raid5_get_active_stripe(conf, NULL, sector_nr, 0);
|
||||||
/* make sure we don't swamp the stripe cache if someone else
|
/* make sure we don't swamp the stripe cache if someone else
|
||||||
* is trying to get access
|
* is trying to get access
|
||||||
*/
|
*/
|
||||||
|
@ -6596,8 +6599,8 @@ static int retry_aligned_read(struct r5conf *conf, struct bio *raid_bio,
|
||||||
/* already done this stripe */
|
/* already done this stripe */
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
sh = raid5_get_active_stripe(conf, sector, 0, 1, 1);
|
sh = raid5_get_active_stripe(conf, NULL, sector,
|
||||||
|
R5_GAS_NOBLOCK | R5_GAS_NOQUIESCE);
|
||||||
if (!sh) {
|
if (!sh) {
|
||||||
/* failed to get a stripe - must wait */
|
/* failed to get a stripe - must wait */
|
||||||
conf->retry_read_aligned = raid_bio;
|
conf->retry_read_aligned = raid_bio;
|
||||||
|
|
|
@ -809,8 +809,18 @@ sector_t raid5_compute_blocknr(struct stripe_head *sh, int i, int previous);
|
||||||
void raid5_release_stripe(struct stripe_head *sh);
|
void raid5_release_stripe(struct stripe_head *sh);
|
||||||
sector_t raid5_compute_sector(struct r5conf *conf, sector_t r_sector,
|
sector_t raid5_compute_sector(struct r5conf *conf, sector_t r_sector,
|
||||||
int previous, int *dd_idx, struct stripe_head *sh);
|
int previous, int *dd_idx, struct stripe_head *sh);
|
||||||
|
|
||||||
|
struct stripe_request_ctx;
|
||||||
|
/* get stripe from previous generation (when reshaping) */
|
||||||
|
#define R5_GAS_PREVIOUS (1 << 0)
|
||||||
|
/* do not block waiting for a free stripe */
|
||||||
|
#define R5_GAS_NOBLOCK (1 << 1)
|
||||||
|
/* do not block waiting for quiesce to be released */
|
||||||
|
#define R5_GAS_NOQUIESCE (1 << 2)
|
||||||
struct stripe_head *raid5_get_active_stripe(struct r5conf *conf,
|
struct stripe_head *raid5_get_active_stripe(struct r5conf *conf,
|
||||||
sector_t sector, bool previous, bool noblock, bool noquiesce);
|
struct stripe_request_ctx *ctx, sector_t sector,
|
||||||
|
unsigned int flags);
|
||||||
|
|
||||||
int raid5_calc_degraded(struct r5conf *conf);
|
int raid5_calc_degraded(struct r5conf *conf);
|
||||||
int r5c_journal_mode_set(struct mddev *mddev, int journal_mode);
|
int r5c_journal_mode_set(struct mddev *mddev, int journal_mode);
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue