Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'block-6.15-20250410' of git://git.kernel.dk/linux

Pull block fixes from Jens Axboe:

- Add a missing ublk selftest script, from test additions added last
week

- Two fixes for ublk error recovery and reissue

- Cleanup of ublk argument passing

* tag 'block-6.15-20250410' of git://git.kernel.dk/linux:
ublk: pass ublksrv_ctrl_cmd * instead of io_uring_cmd *
ublk: don't fail request for recovery & reissue in case of ubq->canceling
ublk: fix handling recovery & reissue in ublk_abort_queue()
selftests: ublk: fix test_stripe_04

+74 -35
+50 -35
drivers/block/ublk_drv.c
··· 1140 1140 __ublk_complete_rq(req); 1141 1141 } 1142 1142 1143 + static void ublk_do_fail_rq(struct request *req) 1144 + { 1145 + struct ublk_queue *ubq = req->mq_hctx->driver_data; 1146 + 1147 + if (ublk_nosrv_should_reissue_outstanding(ubq->dev)) 1148 + blk_mq_requeue_request(req, false); 1149 + else 1150 + __ublk_complete_rq(req); 1151 + } 1152 + 1153 + static void ublk_fail_rq_fn(struct kref *ref) 1154 + { 1155 + struct ublk_rq_data *data = container_of(ref, struct ublk_rq_data, 1156 + ref); 1157 + struct request *req = blk_mq_rq_from_pdu(data); 1158 + 1159 + ublk_do_fail_rq(req); 1160 + } 1161 + 1143 1162 /* 1144 1163 * Since ublk_rq_task_work_cb always fails requests immediately during 1145 1164 * exiting, __ublk_fail_req() is only called from abort context during ··· 1172 1153 { 1173 1154 WARN_ON_ONCE(io->flags & UBLK_IO_FLAG_ACTIVE); 1174 1155 1175 - if (ublk_nosrv_should_reissue_outstanding(ubq->dev)) 1176 - blk_mq_requeue_request(req, false); 1177 - else 1178 - ublk_put_req_ref(ubq, req); 1156 + if (ublk_need_req_ref(ubq)) { 1157 + struct ublk_rq_data *data = blk_mq_rq_to_pdu(req); 1158 + 1159 + kref_put(&data->ref, ublk_fail_rq_fn); 1160 + } else { 1161 + ublk_do_fail_rq(req); 1162 + } 1179 1163 } 1180 1164 1181 1165 static void ubq_complete_io_cmd(struct ublk_io *io, int res, ··· 1371 1349 return BLK_EH_RESET_TIMER; 1372 1350 } 1373 1351 1374 - static blk_status_t ublk_prep_req(struct ublk_queue *ubq, struct request *rq) 1352 + static blk_status_t ublk_prep_req(struct ublk_queue *ubq, struct request *rq, 1353 + bool check_cancel) 1375 1354 { 1376 1355 blk_status_t res; 1377 1356 ··· 1391 1368 if (ublk_nosrv_should_queue_io(ubq) && unlikely(ubq->force_abort)) 1392 1369 return BLK_STS_IOERR; 1393 1370 1394 - if (unlikely(ubq->canceling)) 1371 + if (check_cancel && unlikely(ubq->canceling)) 1395 1372 return BLK_STS_IOERR; 1396 1373 1397 1374 /* fill iod to slot in io cmd buffer */ ··· 1410 1387 struct request *rq = bd->rq; 1411 1388 blk_status_t res; 1412 1389 1413 - res = ublk_prep_req(ubq, rq); 1390 + res = ublk_prep_req(ubq, rq, false); 1414 1391 if (res != BLK_STS_OK) 1415 1392 return res; 1416 1393 ··· 1442 1419 ublk_queue_cmd_list(ubq, &submit_list); 1443 1420 ubq = this_q; 1444 1421 1445 - if (ublk_prep_req(ubq, req) == BLK_STS_OK) 1422 + if (ublk_prep_req(ubq, req, true) == BLK_STS_OK) 1446 1423 rq_list_add_tail(&submit_list, req); 1447 1424 else 1448 1425 rq_list_add_tail(&requeue_list, req); ··· 2436 2413 return ub; 2437 2414 } 2438 2415 2439 - static int ublk_ctrl_start_dev(struct ublk_device *ub, struct io_uring_cmd *cmd) 2416 + static int ublk_ctrl_start_dev(struct ublk_device *ub, 2417 + const struct ublksrv_ctrl_cmd *header) 2440 2418 { 2441 - const struct ublksrv_ctrl_cmd *header = io_uring_sqe_cmd(cmd->sqe); 2442 2419 const struct ublk_param_basic *p = &ub->params.basic; 2443 2420 int ublksrv_pid = (int)header->data[0]; 2444 2421 struct queue_limits lim = { ··· 2557 2534 } 2558 2535 2559 2536 static int ublk_ctrl_get_queue_affinity(struct ublk_device *ub, 2560 - struct io_uring_cmd *cmd) 2537 + const struct ublksrv_ctrl_cmd *header) 2561 2538 { 2562 - const struct ublksrv_ctrl_cmd *header = io_uring_sqe_cmd(cmd->sqe); 2563 2539 void __user *argp = (void __user *)(unsigned long)header->addr; 2564 2540 cpumask_var_t cpumask; 2565 2541 unsigned long queue; ··· 2607 2585 info->nr_hw_queues, info->queue_depth); 2608 2586 } 2609 2587 2610 - static int ublk_ctrl_add_dev(struct io_uring_cmd *cmd) 2588 + static int ublk_ctrl_add_dev(const struct ublksrv_ctrl_cmd *header) 2611 2589 { 2612 - const struct ublksrv_ctrl_cmd *header = io_uring_sqe_cmd(cmd->sqe); 2613 2590 void __user *argp = (void __user *)(unsigned long)header->addr; 2614 2591 struct ublksrv_ctrl_dev_info info; 2615 2592 struct ublk_device *ub; ··· 2833 2812 } 2834 2813 2835 2814 static int ublk_ctrl_get_dev_info(struct ublk_device *ub, 2836 - struct io_uring_cmd *cmd) 2815 + const struct ublksrv_ctrl_cmd *header) 2837 2816 { 2838 - const struct ublksrv_ctrl_cmd *header = io_uring_sqe_cmd(cmd->sqe); 2839 2817 void __user *argp = (void __user *)(unsigned long)header->addr; 2840 2818 2841 2819 if (header->len < sizeof(struct ublksrv_ctrl_dev_info) || !header->addr) ··· 2863 2843 } 2864 2844 2865 2845 static int ublk_ctrl_get_params(struct ublk_device *ub, 2866 - struct io_uring_cmd *cmd) 2846 + const struct ublksrv_ctrl_cmd *header) 2867 2847 { 2868 - const struct ublksrv_ctrl_cmd *header = io_uring_sqe_cmd(cmd->sqe); 2869 2848 void __user *argp = (void __user *)(unsigned long)header->addr; 2870 2849 struct ublk_params_header ph; 2871 2850 int ret; ··· 2893 2874 } 2894 2875 2895 2876 static int ublk_ctrl_set_params(struct ublk_device *ub, 2896 - struct io_uring_cmd *cmd) 2877 + const struct ublksrv_ctrl_cmd *header) 2897 2878 { 2898 - const struct ublksrv_ctrl_cmd *header = io_uring_sqe_cmd(cmd->sqe); 2899 2879 void __user *argp = (void __user *)(unsigned long)header->addr; 2900 2880 struct ublk_params_header ph; 2901 2881 int ret = -EFAULT; ··· 2958 2940 } 2959 2941 2960 2942 static int ublk_ctrl_start_recovery(struct ublk_device *ub, 2961 - struct io_uring_cmd *cmd) 2943 + const struct ublksrv_ctrl_cmd *header) 2962 2944 { 2963 - const struct ublksrv_ctrl_cmd *header = io_uring_sqe_cmd(cmd->sqe); 2964 2945 int ret = -EINVAL; 2965 2946 int i; 2966 2947 ··· 3005 2988 } 3006 2989 3007 2990 static int ublk_ctrl_end_recovery(struct ublk_device *ub, 3008 - struct io_uring_cmd *cmd) 2991 + const struct ublksrv_ctrl_cmd *header) 3009 2992 { 3010 - const struct ublksrv_ctrl_cmd *header = io_uring_sqe_cmd(cmd->sqe); 3011 2993 int ublksrv_pid = (int)header->data[0]; 3012 2994 int ret = -EINVAL; 3013 2995 int i; ··· 3053 3037 return ret; 3054 3038 } 3055 3039 3056 - static int ublk_ctrl_get_features(struct io_uring_cmd *cmd) 3040 + static int ublk_ctrl_get_features(const struct ublksrv_ctrl_cmd *header) 3057 3041 { 3058 - const struct ublksrv_ctrl_cmd *header = io_uring_sqe_cmd(cmd->sqe); 3059 3042 void __user *argp = (void __user *)(unsigned long)header->addr; 3060 3043 u64 features = UBLK_F_ALL; 3061 3044 ··· 3193 3178 goto out; 3194 3179 3195 3180 if (cmd_op == UBLK_U_CMD_GET_FEATURES) { 3196 - ret = ublk_ctrl_get_features(cmd); 3181 + ret = ublk_ctrl_get_features(header); 3197 3182 goto out; 3198 3183 } 3199 3184 ··· 3210 3195 3211 3196 switch (_IOC_NR(cmd_op)) { 3212 3197 case UBLK_CMD_START_DEV: 3213 - ret = ublk_ctrl_start_dev(ub, cmd); 3198 + ret = ublk_ctrl_start_dev(ub, header); 3214 3199 break; 3215 3200 case UBLK_CMD_STOP_DEV: 3216 3201 ret = ublk_ctrl_stop_dev(ub); 3217 3202 break; 3218 3203 case UBLK_CMD_GET_DEV_INFO: 3219 3204 case UBLK_CMD_GET_DEV_INFO2: 3220 - ret = ublk_ctrl_get_dev_info(ub, cmd); 3205 + ret = ublk_ctrl_get_dev_info(ub, header); 3221 3206 break; 3222 3207 case UBLK_CMD_ADD_DEV: 3223 - ret = ublk_ctrl_add_dev(cmd); 3208 + ret = ublk_ctrl_add_dev(header); 3224 3209 break; 3225 3210 case UBLK_CMD_DEL_DEV: 3226 3211 ret = ublk_ctrl_del_dev(&ub, true); ··· 3229 3214 ret = ublk_ctrl_del_dev(&ub, false); 3230 3215 break; 3231 3216 case UBLK_CMD_GET_QUEUE_AFFINITY: 3232 - ret = ublk_ctrl_get_queue_affinity(ub, cmd); 3217 + ret = ublk_ctrl_get_queue_affinity(ub, header); 3233 3218 break; 3234 3219 case UBLK_CMD_GET_PARAMS: 3235 - ret = ublk_ctrl_get_params(ub, cmd); 3220 + ret = ublk_ctrl_get_params(ub, header); 3236 3221 break; 3237 3222 case UBLK_CMD_SET_PARAMS: 3238 - ret = ublk_ctrl_set_params(ub, cmd); 3223 + ret = ublk_ctrl_set_params(ub, header); 3239 3224 break; 3240 3225 case UBLK_CMD_START_USER_RECOVERY: 3241 - ret = ublk_ctrl_start_recovery(ub, cmd); 3226 + ret = ublk_ctrl_start_recovery(ub, header); 3242 3227 break; 3243 3228 case UBLK_CMD_END_USER_RECOVERY: 3244 - ret = ublk_ctrl_end_recovery(ub, cmd); 3229 + ret = ublk_ctrl_end_recovery(ub, header); 3245 3230 break; 3246 3231 default: 3247 3232 ret = -EOPNOTSUPP;
+24
tools/testing/selftests/ublk/test_stripe_04.sh
··· 1 + #!/bin/bash 2 + # SPDX-License-Identifier: GPL-2.0 3 + 4 + . "$(cd "$(dirname "$0")" && pwd)"/test_common.sh 5 + 6 + TID="stripe_04" 7 + ERR_CODE=0 8 + 9 + _prep_test "stripe" "mkfs & mount & umount on zero copy" 10 + 11 + backfile_0=$(_create_backfile 256M) 12 + backfile_1=$(_create_backfile 256M) 13 + dev_id=$(_add_ublk_dev -t stripe -z -q 2 "$backfile_0" "$backfile_1") 14 + _check_add_dev $TID $? "$backfile_0" "$backfile_1" 15 + 16 + _mkfs_mount_test /dev/ublkb"${dev_id}" 17 + ERR_CODE=$? 18 + 19 + _cleanup_test "stripe" 20 + 21 + _remove_backfile "$backfile_0" 22 + _remove_backfile "$backfile_1" 23 + 24 + _show_result $TID $ERR_CODE