Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package blktests for openSUSE:Factory checked in at 2026-07-01 16:39:45 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/blktests (Old) and /work/SRC/openSUSE:Factory/.blktests.new.11887 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "blktests" Wed Jul 1 16:39:45 2026 rev:15 rq:1362765 version:0+20260630.3494185 Changes: -------- --- /work/SRC/openSUSE:Factory/blktests/blktests.changes 2026-06-25 17:13:30.217740903 +0200 +++ /work/SRC/openSUSE:Factory/.blktests.new.11887/blktests.changes 2026-07-01 16:39:48.999699354 +0200 @@ -1,0 +2,15 @@ +Wed Jul 01 04:51:55 UTC 2026 - Sebastian Chlad <[email protected]> + +- Update to version 0+20260630.3494185: + * src/Makefile: escape '#' in HAVE_C_DEF + +------------------------------------------------------------------- +Sun Jun 28 11:57:22 UTC 2026 - Sebastian Chlad <[email protected]> + +- Update to version 0+20260628.dbff8ef: + * src/miniublk: fall back to legacy opcodes on older kernels + * src/miniublk: switch to ioctl-encoded ublk commands + * nvme/060: suppress "nvme connect" failure for rdma transport + * nvme/060: suppress state file write error + +------------------------------------------------------------------- Old: ---- blktests-0+20260623.5a62429.tar.xz New: ---- blktests-0+20260630.3494185.tar.xz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ blktests.spec ++++++ --- /var/tmp/diff_new_pack.WebtJ4/_old 2026-07-01 16:39:49.567719124 +0200 +++ /var/tmp/diff_new_pack.WebtJ4/_new 2026-07-01 16:39:49.571719263 +0200 @@ -17,7 +17,7 @@ Name: blktests -Version: 0+20260623.5a62429 +Version: 0+20260630.3494185 Release: 0 Summary: Linux kernel block layer testing framework License: GPL-2.0-or-later ++++++ _servicedata ++++++ --- /var/tmp/diff_new_pack.WebtJ4/_old 2026-07-01 16:39:49.623721074 +0200 +++ /var/tmp/diff_new_pack.WebtJ4/_new 2026-07-01 16:39:49.627721213 +0200 @@ -3,6 +3,6 @@ <param name="url">git://github.com/osandov/blktests</param> <param name="changesrevision">e10add032819db8f3abf0a9d53f160b7b10cfed8</param></service><service name="tar_scm"> <param name="url">https://github.com/osandov/blktests.git</param> - <param name="changesrevision">5a62429536b11c813b5fbbb8165066709bcee002</param></service></servicedata> + <param name="changesrevision">34941855abbfe363b7548559234046f26183f711</param></service></servicedata> (No newline at EOF) ++++++ blktests-0+20260623.5a62429.tar.xz -> blktests-0+20260630.3494185.tar.xz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/blktests-0+20260623.5a62429/src/Makefile new/blktests-0+20260630.3494185/src/Makefile --- old/blktests-0+20260623.5a62429/src/Makefile 2026-06-22 23:29:10.000000000 +0200 +++ new/blktests-0+20260630.3494185/src/Makefile 2026-06-30 06:42:05.000000000 +0200 @@ -8,6 +8,10 @@ $(CC) $(CFLAGS) -E - 2>&1 /dev/null | grep $(2) > /dev/null 2>&1; \ then echo 1;else echo 0; fi) +HAVE_C_DEF = $(shell if echo -e "$(H)include <$(1)>\n$(H)ifdef $(2)\nHAVE_$(2)\n$(H)endif" | \ + $(CC) $(CFLAGS) -E - 2>&1 /dev/null | grep HAVE_$(2) > /dev/null 2>&1; \ + then echo 1;else echo 0; fi) + C_TARGETS := \ dio-offsets \ loblksize \ @@ -27,6 +31,7 @@ HAVE_LIBURING := $(call HAVE_C_MACRO,liburing.h,IORING_OP_URING_CMD) HAVE_UBLK_HEADER := $(call HAVE_C_HEADER,linux/ublk_cmd.h,1) +HAVE_NEW_UBLK_INTF := $(call HAVE_C_DEF,linux/ublk_cmd.h,UBLK_U_CMD_START_DEV) CXX_TARGETS := \ discontiguous-io @@ -37,8 +42,12 @@ TARGETS := $(C_TARGETS) $(CXX_TARGETS) $(SYZKALLER_TARGETS) ifeq ($(HAVE_UBLK_HEADER), 1) +ifeq ($(HAVE_NEW_UBLK_INTF), 1) C_URING_TARGETS += $(C_UBLK_TARGETS) else +$(info Skip $(C_UBLK_TARGETS) build due to missing new ublk interface(v6.4+)) +endif +else $(info Skip $(C_UBLK_TARGETS) build due to missing kernel header(v6.0+)) endif diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/blktests-0+20260623.5a62429/src/miniublk.c new/blktests-0+20260630.3494185/src/miniublk.c --- old/blktests-0+20260623.5a62429/src/miniublk.c 2026-06-22 23:29:10.000000000 +0200 +++ new/blktests-0+20260630.3494185/src/miniublk.c 2026-06-30 06:42:05.000000000 +0200 @@ -112,6 +112,7 @@ int fds[2]; /* fds[0] points to /dev/ublkcN */ int nr_fds; int ctrl_fd; + bool use_ioctl; struct io_uring ring; }; @@ -235,7 +236,7 @@ static inline void ublk_ctrl_init_cmd(struct ublk_dev *dev, struct io_uring_sqe *sqe, - struct ublk_ctrl_cmd_data *data) + struct ublk_ctrl_cmd_data *data, __u32 cmd_op) { struct ublksrv_ctrl_dev_info *info = &dev->dev_info; struct ublksrv_ctrl_cmd *cmd = (struct ublksrv_ctrl_cmd *)ublk_get_sqe_cmd(sqe); @@ -255,25 +256,34 @@ cmd->dev_id = info->dev_id; cmd->queue_id = -1; - ublk_set_sqe_cmd_op(sqe, data->cmd_op); + ublk_set_sqe_cmd_op(sqe, cmd_op); io_uring_sqe_set_data(sqe, cmd); } +static void ublk_update_ioctl_encoding(struct ublk_dev *dev) +{ + dev->use_ioctl = !!(dev->dev_info.flags & UBLK_F_CMD_IOCTL_ENCODE); +} + static int __ublk_ctrl_cmd(struct ublk_dev *dev, struct ublk_ctrl_cmd_data *data) { struct io_uring_sqe *sqe; struct io_uring_cqe *cqe; + __u32 cmd_op = data->cmd_op; int ret = -EINVAL; + if (!dev->use_ioctl) + cmd_op = _IOC_NR(cmd_op); + sqe = io_uring_get_sqe(&dev->ring); if (!sqe) { ublk_err("%s: can't get sqe ret %d\n", __func__, ret); return ret; } - ublk_ctrl_init_cmd(dev, sqe, data); + ublk_ctrl_init_cmd(dev, sqe, data, cmd_op); ret = io_uring_submit(&dev->ring); if (ret < 0) { @@ -294,7 +304,7 @@ int ublk_ctrl_stop_dev(struct ublk_dev *dev) { struct ublk_ctrl_cmd_data data = { - .cmd_op = UBLK_CMD_STOP_DEV, + .cmd_op = UBLK_U_CMD_STOP_DEV, }; return __ublk_ctrl_cmd(dev, &data); @@ -304,7 +314,7 @@ int daemon_pid) { struct ublk_ctrl_cmd_data data = { - .cmd_op = UBLK_CMD_START_DEV, + .cmd_op = UBLK_U_CMD_START_DEV, .flags = CTRL_CMD_HAS_DATA, }; @@ -316,19 +326,30 @@ int ublk_ctrl_add_dev(struct ublk_dev *dev) { struct ublk_ctrl_cmd_data data = { - .cmd_op = UBLK_CMD_ADD_DEV, + .cmd_op = UBLK_U_CMD_ADD_DEV, .flags = CTRL_CMD_HAS_BUF, .addr = (__u64)&dev->dev_info, .len = sizeof(struct ublksrv_ctrl_dev_info), }; + int ret; - return __ublk_ctrl_cmd(dev, &data); + ret = __ublk_ctrl_cmd(dev, &data); + if (ret < 0) { + /* retry with legacy opcode on older kernels */ + dev->use_ioctl = false; + ret = __ublk_ctrl_cmd(dev, &data); + } + + if (ret >= 0) + ublk_update_ioctl_encoding(dev); + + return ret; } int ublk_ctrl_del_dev(struct ublk_dev *dev) { struct ublk_ctrl_cmd_data data = { - .cmd_op = UBLK_CMD_DEL_DEV, + .cmd_op = UBLK_U_CMD_DEL_DEV, .flags = 0, }; @@ -338,20 +359,31 @@ int ublk_ctrl_get_info(struct ublk_dev *dev) { struct ublk_ctrl_cmd_data data = { - .cmd_op = UBLK_CMD_GET_DEV_INFO, + .cmd_op = UBLK_U_CMD_GET_DEV_INFO, .flags = CTRL_CMD_HAS_BUF, .addr = (__u64)&dev->dev_info, .len = sizeof(struct ublksrv_ctrl_dev_info), }; + int ret; - return __ublk_ctrl_cmd(dev, &data); + ret = __ublk_ctrl_cmd(dev, &data); + if (ret < 0 && dev->use_ioctl) { + /* retry with legacy opcode on older kernels */ + dev->use_ioctl = false; + ret = __ublk_ctrl_cmd(dev, &data); + } + + if (ret >= 0) + ublk_update_ioctl_encoding(dev); + + return ret; } int ublk_ctrl_set_params(struct ublk_dev *dev, struct ublk_params *params) { struct ublk_ctrl_cmd_data data = { - .cmd_op = UBLK_CMD_SET_PARAMS, + .cmd_op = UBLK_U_CMD_SET_PARAMS, .flags = CTRL_CMD_HAS_BUF, .addr = (__u64)params, .len = sizeof(*params), @@ -364,7 +396,7 @@ struct ublk_params *params) { struct ublk_ctrl_cmd_data data = { - .cmd_op = UBLK_CMD_GET_PARAMS, + .cmd_op = UBLK_U_CMD_GET_PARAMS, .flags = CTRL_CMD_HAS_BUF, .addr = (__u64)params, .len = sizeof(*params), @@ -378,7 +410,7 @@ static int ublk_ctrl_start_user_recover(struct ublk_dev *dev) { struct ublk_ctrl_cmd_data data = { - .cmd_op = UBLK_CMD_START_USER_RECOVERY, + .cmd_op = UBLK_U_CMD_START_USER_RECOVERY, .flags = 0, }; @@ -389,7 +421,7 @@ int daemon_pid) { struct ublk_ctrl_cmd_data data = { - .cmd_op = UBLK_CMD_END_USER_RECOVERY, + .cmd_op = UBLK_U_CMD_END_USER_RECOVERY, .flags = CTRL_CMD_HAS_DATA, }; @@ -453,6 +485,8 @@ struct ublksrv_ctrl_dev_info *info = &dev->dev_info; int ret; + dev->use_ioctl = true; /* use ioctl opcodes by default */ + dev->ctrl_fd = open(CTRL_DEV, O_RDWR); if (dev->ctrl_fd < 0) { ublk_err("control dev %s can't be opened: %m %d\n", CTRL_DEV, errno); @@ -624,9 +658,12 @@ return 0; if (io->flags & UBLKSRV_NEED_COMMIT_RQ_COMP) - cmd_op = UBLK_IO_COMMIT_AND_FETCH_REQ; + cmd_op = UBLK_U_IO_COMMIT_AND_FETCH_REQ; else if (io->flags & UBLKSRV_NEED_FETCH_RQ) - cmd_op = UBLK_IO_FETCH_REQ; + cmd_op = UBLK_U_IO_FETCH_REQ; + + if (!q->dev->use_ioctl) + cmd_op = _IOC_NR(cmd_op); sqe = io_uring_get_sqe(&q->ring); if (!sqe) { @@ -637,7 +674,7 @@ cmd = (struct ublksrv_io_cmd *)ublk_get_sqe_cmd(sqe); - if (cmd_op == UBLK_IO_COMMIT_AND_FETCH_REQ) + if (io->flags & UBLKSRV_NEED_COMMIT_RQ_COMP) cmd->result = io->result; /* These fields should be written once, never change */ @@ -650,7 +687,7 @@ cmd->addr = (__u64)io->buf_addr; cmd->q_id = q->q_id; - user_data = build_user_data(tag, cmd_op, 0, 0); + user_data = build_user_data(tag, _IOC_NR(cmd_op), 0, 0); io_uring_sqe_set_data64(sqe, user_data); io->flags = 0; @@ -658,7 +695,7 @@ q->cmd_inflight += 1; ublk_dbg(UBLK_DBG_IO_CMD, "%s: (qid %d tag %u cmd_op %u) iof %x stopping %d\n", - __func__, q->q_id, tag, cmd_op, + __func__, q->q_id, tag, _IOC_NR(cmd_op), io->flags, !!(q->state & UBLKSRV_QUEUE_STOPPING)); return 1; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/blktests-0+20260623.5a62429/tests/nvme/060 new/blktests-0+20260630.3494185/tests/nvme/060 --- old/blktests-0+20260623.5a62429/tests/nvme/060 2026-06-22 23:29:10.000000000 +0200 +++ new/blktests-0+20260630.3494185/tests/nvme/060 2026-06-30 06:42:05.000000000 +0200 @@ -19,11 +19,22 @@ _set_nvme_trtype "$@" } +filter_connect_msg() { + if [[ ${nvme_trtype} == rdma ]]; then + grep --invert-match "nvme connect return error code" + fi +} + +filter_state_write_msg() { + grep --invert-match "state: No such file or directory" +} + nvmet_debug_trigger_reset() { local nvmet_subsystem="$1" local dfs_path="${NVMET_DFS}/${nvmet_subsystem}" - find "${dfs_path}" -maxdepth 1 -type d -name 'ctrl*' -exec sh -c 'echo "fatal" > "$1/state"' _ {} \; + find "${dfs_path}" -maxdepth 1 -type d -name 'ctrl*' -exec sh -c \ + 'echo "fatal" > "$1/state" ' _ {} \; |& filter_state_write_msg } nvmet_reset_loop() { @@ -51,7 +62,8 @@ # The target reset is triggered with an even number timeout, while the # host reconnects with an odd number timeout. for ((i = 0; i <= 5; i++)); do - _nvme_connect_subsys --keep-alive-tmo 1 --reconnect-delay 1 --no-wait-ns + _nvme_connect_subsys --keep-alive-tmo 1 --reconnect-delay 1 \ + --no-wait-ns | filter_connect_msg sleep 3 _nvme_disconnect_subsys >> "$FULL" 2>&1 done
