Skip to content

Commit 7d080fa

Browse files
committed
Merge tag 'for-6.11/block-20240722' of git://git.kernel.dk/linux
Pull more block updates from Jens Axboe: - MD fixes via Song: - md-cluster fixes (Heming Zhao) - raid1 fix (Mateusz Jończyk) - s390/dasd module description (Jeff) - Series cleaning up and hardening the blk-mq debugfs flag handling (John, Christoph) - blk-cgroup cleanup (Xiu) - Error polled IO attempts if backend doesn't support it (hexue) - Fix for an sbitmap hang (Yang) * tag 'for-6.11/block-20240722' of git://git.kernel.dk/linux: (23 commits) blk-cgroup: move congestion_count to struct blkcg sbitmap: fix io hung due to race on sbitmap_word::cleared block: avoid polling configuration errors block: Catch possible entries missing from rqf_name[] block: Simplify definition of RQF_NAME() block: Use enum to define RQF_x bit indexes block: Catch possible entries missing from cmd_flag_name[] block: Catch possible entries missing from alloc_policy_name[] block: Catch possible entries missing from hctx_flag_name[] block: Catch possible entries missing from hctx_state_name[] block: Catch possible entries missing from blk_queue_flag_name[] block: Make QUEUE_FLAG_x as an enum block: Relocate BLK_MQ_MAX_DEPTH block: Relocate BLK_MQ_CPU_WORK_BATCH block: remove QUEUE_FLAG_STOPPED block: Add missing entry to hctx_flag_name[] block: Add zone write plugging entry to rqf_name[] block: Add missing entries from cmd_flag_name[] s390/dasd: fix error checks in dasd_copy_pair_store() s390/dasd: add missing MODULE_DESCRIPTION() macros ...
2 parents 0256994 + 89ed6c9 commit 7d080fa

File tree

19 files changed

+233
-102
lines changed

19 files changed

+233
-102
lines changed

block/blk-cgroup.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2182,12 +2182,13 @@ void blk_cgroup_bio_start(struct bio *bio)
21822182

21832183
bool blk_cgroup_congested(void)
21842184
{
2185-
struct cgroup_subsys_state *css;
2185+
struct blkcg *blkcg;
21862186
bool ret = false;
21872187

21882188
rcu_read_lock();
2189-
for (css = blkcg_css(); css; css = css->parent) {
2190-
if (atomic_read(&css->cgroup->congestion_count)) {
2189+
for (blkcg = css_to_blkcg(blkcg_css()); blkcg;
2190+
blkcg = blkcg_parent(blkcg)) {
2191+
if (atomic_read(&blkcg->congestion_count)) {
21912192
ret = true;
21922193
break;
21932194
}

block/blk-cgroup.h

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,8 @@ struct blkcg {
9595
struct cgroup_subsys_state css;
9696
spinlock_t lock;
9797
refcount_t online_pin;
98+
/* If there is block congestion on this cgroup. */
99+
atomic_t congestion_count;
98100

99101
struct radix_tree_root blkg_tree;
100102
struct blkcg_gq __rcu *blkg_hint;
@@ -374,7 +376,7 @@ static inline void blkcg_use_delay(struct blkcg_gq *blkg)
374376
if (WARN_ON_ONCE(atomic_read(&blkg->use_delay) < 0))
375377
return;
376378
if (atomic_add_return(1, &blkg->use_delay) == 1)
377-
atomic_inc(&blkg->blkcg->css.cgroup->congestion_count);
379+
atomic_inc(&blkg->blkcg->congestion_count);
378380
}
379381

380382
static inline int blkcg_unuse_delay(struct blkcg_gq *blkg)
@@ -399,7 +401,7 @@ static inline int blkcg_unuse_delay(struct blkcg_gq *blkg)
399401
if (old == 0)
400402
return 0;
401403
if (old == 1)
402-
atomic_dec(&blkg->blkcg->css.cgroup->congestion_count);
404+
atomic_dec(&blkg->blkcg->congestion_count);
403405
return 1;
404406
}
405407

@@ -418,7 +420,7 @@ static inline void blkcg_set_delay(struct blkcg_gq *blkg, u64 delay)
418420

419421
/* We only want 1 person setting the congestion count for this blkg. */
420422
if (!old && atomic_try_cmpxchg(&blkg->use_delay, &old, -1))
421-
atomic_inc(&blkg->blkcg->css.cgroup->congestion_count);
423+
atomic_inc(&blkg->blkcg->congestion_count);
422424

423425
atomic64_set(&blkg->delay_nsec, delay);
424426
}
@@ -435,7 +437,7 @@ static inline void blkcg_clear_delay(struct blkcg_gq *blkg)
435437

436438
/* We only want 1 person clearing the congestion count for this blkg. */
437439
if (old && atomic_try_cmpxchg(&blkg->use_delay, &old, 0))
438-
atomic_dec(&blkg->blkcg->css.cgroup->congestion_count);
440+
atomic_dec(&blkg->blkcg->congestion_count);
439441
}
440442

441443
/**

block/blk-core.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -791,8 +791,11 @@ void submit_bio_noacct(struct bio *bio)
791791
}
792792
}
793793

794-
if (!(q->limits.features & BLK_FEAT_POLL))
794+
if (!(q->limits.features & BLK_FEAT_POLL) &&
795+
(bio->bi_opf & REQ_POLLED)) {
795796
bio_clear_polled(bio);
797+
goto not_supported;
798+
}
796799

797800
switch (bio_op(bio)) {
798801
case REQ_OP_READ:

block/blk-mq-debugfs.c

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
#include <linux/kernel.h>
77
#include <linux/blkdev.h>
8+
#include <linux/build_bug.h>
89
#include <linux/debugfs.h>
910

1011
#include "blk.h"
@@ -79,7 +80,6 @@ static int queue_pm_only_show(void *data, struct seq_file *m)
7980

8081
#define QUEUE_FLAG_NAME(name) [QUEUE_FLAG_##name] = #name
8182
static const char *const blk_queue_flag_name[] = {
82-
QUEUE_FLAG_NAME(STOPPED),
8383
QUEUE_FLAG_NAME(DYING),
8484
QUEUE_FLAG_NAME(NOMERGES),
8585
QUEUE_FLAG_NAME(SAME_COMP),
@@ -100,6 +100,7 @@ static int queue_state_show(void *data, struct seq_file *m)
100100
{
101101
struct request_queue *q = data;
102102

103+
BUILD_BUG_ON(ARRAY_SIZE(blk_queue_flag_name) != QUEUE_FLAG_MAX);
103104
blk_flags_show(m, q->queue_flags, blk_queue_flag_name,
104105
ARRAY_SIZE(blk_queue_flag_name));
105106
seq_puts(m, "\n");
@@ -164,6 +165,7 @@ static int hctx_state_show(void *data, struct seq_file *m)
164165
{
165166
struct blk_mq_hw_ctx *hctx = data;
166167

168+
BUILD_BUG_ON(ARRAY_SIZE(hctx_state_name) != BLK_MQ_S_MAX);
167169
blk_flags_show(m, hctx->state, hctx_state_name,
168170
ARRAY_SIZE(hctx_state_name));
169171
seq_puts(m, "\n");
@@ -181,10 +183,11 @@ static const char *const alloc_policy_name[] = {
181183
static const char *const hctx_flag_name[] = {
182184
HCTX_FLAG_NAME(SHOULD_MERGE),
183185
HCTX_FLAG_NAME(TAG_QUEUE_SHARED),
184-
HCTX_FLAG_NAME(BLOCKING),
185-
HCTX_FLAG_NAME(NO_SCHED),
186186
HCTX_FLAG_NAME(STACKING),
187187
HCTX_FLAG_NAME(TAG_HCTX_SHARED),
188+
HCTX_FLAG_NAME(BLOCKING),
189+
HCTX_FLAG_NAME(NO_SCHED),
190+
HCTX_FLAG_NAME(NO_SCHED_BY_DEFAULT),
188191
};
189192
#undef HCTX_FLAG_NAME
190193

@@ -193,6 +196,10 @@ static int hctx_flags_show(void *data, struct seq_file *m)
193196
struct blk_mq_hw_ctx *hctx = data;
194197
const int alloc_policy = BLK_MQ_FLAG_TO_ALLOC_POLICY(hctx->flags);
195198

199+
BUILD_BUG_ON(ARRAY_SIZE(hctx_flag_name) !=
200+
BLK_MQ_F_ALLOC_POLICY_START_BIT);
201+
BUILD_BUG_ON(ARRAY_SIZE(alloc_policy_name) != BLK_TAG_ALLOC_MAX);
202+
196203
seq_puts(m, "alloc_policy=");
197204
if (alloc_policy < ARRAY_SIZE(alloc_policy_name) &&
198205
alloc_policy_name[alloc_policy])
@@ -223,12 +230,17 @@ static const char *const cmd_flag_name[] = {
223230
CMD_FLAG_NAME(RAHEAD),
224231
CMD_FLAG_NAME(BACKGROUND),
225232
CMD_FLAG_NAME(NOWAIT),
226-
CMD_FLAG_NAME(NOUNMAP),
227233
CMD_FLAG_NAME(POLLED),
234+
CMD_FLAG_NAME(ALLOC_CACHE),
235+
CMD_FLAG_NAME(SWAP),
236+
CMD_FLAG_NAME(DRV),
237+
CMD_FLAG_NAME(FS_PRIVATE),
238+
CMD_FLAG_NAME(ATOMIC),
239+
CMD_FLAG_NAME(NOUNMAP),
228240
};
229241
#undef CMD_FLAG_NAME
230242

231-
#define RQF_NAME(name) [ilog2((__force u32)RQF_##name)] = #name
243+
#define RQF_NAME(name) [__RQF_##name] = #name
232244
static const char *const rqf_name[] = {
233245
RQF_NAME(STARTED),
234246
RQF_NAME(FLUSH_SEQ),
@@ -243,6 +255,7 @@ static const char *const rqf_name[] = {
243255
RQF_NAME(HASHED),
244256
RQF_NAME(STATS),
245257
RQF_NAME(SPECIAL_PAYLOAD),
258+
RQF_NAME(ZONE_WRITE_PLUGGING),
246259
RQF_NAME(TIMED_OUT),
247260
RQF_NAME(RESV),
248261
};
@@ -268,6 +281,9 @@ int __blk_mq_debugfs_rq_show(struct seq_file *m, struct request *rq)
268281
const enum req_op op = req_op(rq);
269282
const char *op_str = blk_op_str(op);
270283

284+
BUILD_BUG_ON(ARRAY_SIZE(cmd_flag_name) != __REQ_NR_BITS);
285+
BUILD_BUG_ON(ARRAY_SIZE(rqf_name) != __RQF_BITS);
286+
271287
seq_printf(m, "%p {.op=", rq);
272288
if (strcmp(op_str, "UNKNOWN") == 0)
273289
seq_printf(m, "%u", op);

block/blk-mq.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ enum {
3636
BLK_MQ_TAG_MAX = BLK_MQ_NO_TAG - 1,
3737
};
3838

39+
#define BLK_MQ_CPU_WORK_BATCH (8)
40+
3941
typedef unsigned int __bitwise blk_insert_t;
4042
#define BLK_MQ_INSERT_AT_HEAD ((__force blk_insert_t)0x01)
4143

drivers/md/md-cluster.c

Lines changed: 39 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515

1616
#define LVB_SIZE 64
1717
#define NEW_DEV_TIMEOUT 5000
18+
#define WAIT_DLM_LOCK_TIMEOUT (30 * HZ)
1819

1920
struct dlm_lock_resource {
2021
dlm_lockspace_t *ls;
@@ -56,6 +57,7 @@ struct resync_info {
5657
#define MD_CLUSTER_ALREADY_IN_CLUSTER 6
5758
#define MD_CLUSTER_PENDING_RECV_EVENT 7
5859
#define MD_CLUSTER_HOLDING_MUTEX_FOR_RECVD 8
60+
#define MD_CLUSTER_WAITING_FOR_SYNC 9
5961

6062
struct md_cluster_info {
6163
struct mddev *mddev; /* the md device which md_cluster_info belongs to */
@@ -91,6 +93,7 @@ struct md_cluster_info {
9193
sector_t sync_hi;
9294
};
9395

96+
/* For compatibility, add the new msg_type at the end. */
9497
enum msg_type {
9598
METADATA_UPDATED = 0,
9699
RESYNCING,
@@ -100,6 +103,7 @@ enum msg_type {
100103
BITMAP_NEEDS_SYNC,
101104
CHANGE_CAPACITY,
102105
BITMAP_RESIZE,
106+
RESYNCING_START,
103107
};
104108

105109
struct cluster_msg {
@@ -130,8 +134,13 @@ static int dlm_lock_sync(struct dlm_lock_resource *res, int mode)
130134
0, sync_ast, res, res->bast);
131135
if (ret)
132136
return ret;
133-
wait_event(res->sync_locking, res->sync_locking_done);
137+
ret = wait_event_timeout(res->sync_locking, res->sync_locking_done,
138+
WAIT_DLM_LOCK_TIMEOUT);
134139
res->sync_locking_done = false;
140+
if (!ret) {
141+
pr_err("locking DLM '%s' timeout!\n", res->name);
142+
return -EBUSY;
143+
}
135144
if (res->lksb.sb_status == 0)
136145
res->mode = mode;
137146
return res->lksb.sb_status;
@@ -455,6 +464,7 @@ static void process_suspend_info(struct mddev *mddev,
455464
clear_bit(MD_RESYNCING_REMOTE, &mddev->recovery);
456465
remove_suspend_info(mddev, slot);
457466
set_bit(MD_RECOVERY_NEEDED, &mddev->recovery);
467+
clear_bit(MD_CLUSTER_WAITING_FOR_SYNC, &cinfo->state);
458468
md_wakeup_thread(mddev->thread);
459469
return;
460470
}
@@ -525,6 +535,7 @@ static int process_add_new_disk(struct mddev *mddev, struct cluster_msg *cmsg)
525535
res = -1;
526536
}
527537
clear_bit(MD_CLUSTER_WAITING_FOR_NEWDISK, &cinfo->state);
538+
set_bit(MD_CLUSTER_WAITING_FOR_SYNC, &cinfo->state);
528539
return res;
529540
}
530541

@@ -593,6 +604,9 @@ static int process_recvd_msg(struct mddev *mddev, struct cluster_msg *msg)
593604
case CHANGE_CAPACITY:
594605
set_capacity_and_notify(mddev->gendisk, mddev->array_sectors);
595606
break;
607+
case RESYNCING_START:
608+
clear_bit(MD_CLUSTER_WAITING_FOR_SYNC, &mddev->cluster_info->state);
609+
break;
596610
case RESYNCING:
597611
set_bit(MD_RESYNCING_REMOTE, &mddev->recovery);
598612
process_suspend_info(mddev, le32_to_cpu(msg->slot),
@@ -743,15 +757,15 @@ static void unlock_comm(struct md_cluster_info *cinfo)
743757
*/
744758
static int __sendmsg(struct md_cluster_info *cinfo, struct cluster_msg *cmsg)
745759
{
746-
int error;
760+
int error, unlock_error;
747761
int slot = cinfo->slot_number - 1;
748762

749763
cmsg->slot = cpu_to_le32(slot);
750764
/*get EX on Message*/
751765
error = dlm_lock_sync(cinfo->message_lockres, DLM_LOCK_EX);
752766
if (error) {
753767
pr_err("md-cluster: failed to get EX on MESSAGE (%d)\n", error);
754-
goto failed_message;
768+
return error;
755769
}
756770

757771
memcpy(cinfo->message_lockres->lksb.sb_lvbptr, (void *)cmsg,
@@ -781,14 +795,10 @@ static int __sendmsg(struct md_cluster_info *cinfo, struct cluster_msg *cmsg)
781795
}
782796

783797
failed_ack:
784-
error = dlm_unlock_sync(cinfo->message_lockres);
785-
if (unlikely(error != 0)) {
798+
while ((unlock_error = dlm_unlock_sync(cinfo->message_lockres)))
786799
pr_err("md-cluster: failed convert to NL on MESSAGE(%d)\n",
787-
error);
788-
/* in case the message can't be released due to some reason */
789-
goto failed_ack;
790-
}
791-
failed_message:
800+
unlock_error);
801+
792802
return error;
793803
}
794804

@@ -1343,6 +1353,23 @@ static void resync_info_get(struct mddev *mddev, sector_t *lo, sector_t *hi)
13431353
spin_unlock_irq(&cinfo->suspend_lock);
13441354
}
13451355

1356+
static int resync_status_get(struct mddev *mddev)
1357+
{
1358+
struct md_cluster_info *cinfo = mddev->cluster_info;
1359+
1360+
return test_bit(MD_CLUSTER_WAITING_FOR_SYNC, &cinfo->state);
1361+
}
1362+
1363+
static int resync_start_notify(struct mddev *mddev)
1364+
{
1365+
struct md_cluster_info *cinfo = mddev->cluster_info;
1366+
struct cluster_msg cmsg = {0};
1367+
1368+
cmsg.type = cpu_to_le32(RESYNCING_START);
1369+
1370+
return sendmsg(cinfo, &cmsg, 0);
1371+
}
1372+
13461373
static int resync_info_update(struct mddev *mddev, sector_t lo, sector_t hi)
13471374
{
13481375
struct md_cluster_info *cinfo = mddev->cluster_info;
@@ -1577,6 +1604,8 @@ static const struct md_cluster_operations cluster_ops = {
15771604
.resync_start = resync_start,
15781605
.resync_finish = resync_finish,
15791606
.resync_info_update = resync_info_update,
1607+
.resync_start_notify = resync_start_notify,
1608+
.resync_status_get = resync_status_get,
15801609
.resync_info_get = resync_info_get,
15811610
.metadata_update_start = metadata_update_start,
15821611
.metadata_update_finish = metadata_update_finish,

drivers/md/md-cluster.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ struct md_cluster_operations {
1414
int (*leave)(struct mddev *mddev);
1515
int (*slot_number)(struct mddev *mddev);
1616
int (*resync_info_update)(struct mddev *mddev, sector_t lo, sector_t hi);
17+
int (*resync_start_notify)(struct mddev *mddev);
18+
int (*resync_status_get)(struct mddev *mddev);
1719
void (*resync_info_get)(struct mddev *mddev, sector_t *lo, sector_t *hi);
1820
int (*metadata_update_start)(struct mddev *mddev);
1921
int (*metadata_update_finish)(struct mddev *mddev);

drivers/md/md.c

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8978,7 +8978,8 @@ void md_do_sync(struct md_thread *thread)
89788978
* This will mean we have to start checking from the beginning again.
89798979
*
89808980
*/
8981-
8981+
if (mddev_is_clustered(mddev))
8982+
md_cluster_ops->resync_start_notify(mddev);
89828983
do {
89838984
int mddev2_minor = -1;
89848985
mddev->curr_resync = MD_RESYNC_DELAYED;
@@ -9992,8 +9993,18 @@ static void check_sb_changes(struct mddev *mddev, struct md_rdev *rdev)
99929993
*/
99939994
if (rdev2->raid_disk == -1 && role != MD_DISK_ROLE_SPARE &&
99949995
!(le32_to_cpu(sb->feature_map) &
9995-
MD_FEATURE_RESHAPE_ACTIVE)) {
9996-
rdev2->saved_raid_disk = role;
9996+
MD_FEATURE_RESHAPE_ACTIVE) &&
9997+
!md_cluster_ops->resync_status_get(mddev)) {
9998+
/*
9999+
* -1 to make raid1_add_disk() set conf->fullsync
10000+
* to 1. This could avoid skipping sync when the
10001+
* remote node is down during resyncing.
10002+
*/
10003+
if ((le32_to_cpu(sb->feature_map)
10004+
& MD_FEATURE_RECOVERY_OFFSET))
10005+
rdev2->saved_raid_disk = -1;
10006+
else
10007+
rdev2->saved_raid_disk = role;
999710008
ret = remove_and_add_spares(mddev, rdev2);
999810009
pr_info("Activated spare: %pg\n",
999910010
rdev2->bdev);

drivers/md/raid1.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -680,6 +680,7 @@ static int choose_slow_rdev(struct r1conf *conf, struct r1bio *r1_bio,
680680
len = r1_bio->sectors;
681681
read_len = raid1_check_read_range(rdev, this_sector, &len);
682682
if (read_len == r1_bio->sectors) {
683+
*max_sectors = read_len;
683684
update_read_sectors(conf, disk, this_sector, read_len);
684685
return disk;
685686
}

drivers/s390/block/dasd_devmap.c

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2248,13 +2248,19 @@ static ssize_t dasd_copy_pair_store(struct device *dev,
22482248

22492249
/* allocate primary devmap if needed */
22502250
prim_devmap = dasd_find_busid(prim_busid);
2251-
if (IS_ERR(prim_devmap))
2251+
if (IS_ERR(prim_devmap)) {
22522252
prim_devmap = dasd_add_busid(prim_busid, DASD_FEATURE_DEFAULT);
2253+
if (IS_ERR(prim_devmap))
2254+
return PTR_ERR(prim_devmap);
2255+
}
22532256

22542257
/* allocate secondary devmap if needed */
22552258
sec_devmap = dasd_find_busid(sec_busid);
2256-
if (IS_ERR(sec_devmap))
2259+
if (IS_ERR(sec_devmap)) {
22572260
sec_devmap = dasd_add_busid(sec_busid, DASD_FEATURE_DEFAULT);
2261+
if (IS_ERR(sec_devmap))
2262+
return PTR_ERR(sec_devmap);
2263+
}
22582264

22592265
/* setting copy relation is only allowed for offline secondary */
22602266
if (sec_devmap->device)

0 commit comments

Comments
 (0)