From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.ozlabs.org (lists.ozlabs.org [112.213.38.117]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 46C07CDB46B for ; Mon, 22 Jun 2026 07:29:08 +0000 (UTC) Received: from boromir.ozlabs.org (localhost [127.0.0.1]) by lists.ozlabs.org (Postfix) with ESMTP id 4gkKZV2nj0z2xyh; Mon, 22 Jun 2026 17:29:06 +1000 (AEST) Authentication-Results: lists.ozlabs.org; arc=none smtp.remote-ip=115.124.30.130 ARC-Seal: i=1; a=rsa-sha256; d=lists.ozlabs.org; s=201707; t=1782113346; cv=none; b=UCMEB4ncdXs9I+yZWc/HP45c6ArG1JN90UlIEgsThuccHr7f42SulUOHqnFKVhS3GMjgsqn/Lkdmi15jr/CDFFpJJLsuZYKVKNhyMuH7j2u6mn+GTx7zP0QoJCi2hIEakTe7KSUezAlz68iYgPuG4X3L6TQZ2BFrbvEFYysjnILU53+sMKYTJyCZ963akeWG7ZY4ifO8P6ynjxjYYXMShhR+JqPEcH8snhtDm0qu1cfu6I9yaL9DK9Y90YczzH5GxOyQPAKzgohFrqdCTPpA6Oos6TDwnEwjxxIY6gKLhhEVX077VgiccFLs8tlg7LpG74uUYokp5CfG3oOGy3Ik6w== ARC-Message-Signature: i=1; a=rsa-sha256; d=lists.ozlabs.org; s=201707; t=1782113346; c=relaxed/relaxed; bh=Y/W7rSUjnKgG0WzmclmvOeTXnTTDaaWYvYZ2/M3Zw3U=; h=Message-ID:Date:MIME-Version:Subject:To:Cc:References:From: In-Reply-To:Content-Type; b=CVw0zxTDYZo6hZQJGwo6VNIxNEBmrK8zydpDMHHxQu7AK4kkpfYJesvznL/4DDiscK3MKHAgxnwvRHWKa8ZHqkxhgR3IoBq94c/NcxVVsK4iuQQtsQM/kviIqyCSY2rsb83FPdbBvB8C1M6rxILnr9gi9VpWcxcVRDrKmGxrpdI9KVT3e3fC8WLVwK14KxODk2KJczYss0MC9/7645CCJMht6rEeeygipp13nLRu3Vt17XdT7d9UapD5Bn4LAj7/fMLvTw0PbDS5HD/vc7X/97vKA5e1uIvOm2NPciW92D9SDSEnWfiHK9pr9Bbw6RdbcJJj0XXjS0EaNnhZJoJcFA== ARC-Authentication-Results: i=1; lists.ozlabs.org; dmarc=pass (p=none dis=none) header.from=linux.alibaba.com; dkim=pass (1024-bit key; unprotected) header.d=linux.alibaba.com header.i=@linux.alibaba.com header.a=rsa-sha256 header.s=default header.b=WypENWiN; dkim-atps=neutral; spf=pass (client-ip=115.124.30.130; helo=out30-130.freemail.mail.aliyun.com; envelope-from=hsiangkao@linux.alibaba.com; receiver=lists.ozlabs.org) smtp.mailfrom=linux.alibaba.com Authentication-Results: lists.ozlabs.org; dmarc=pass (p=none dis=none) header.from=linux.alibaba.com Authentication-Results: lists.ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=linux.alibaba.com header.i=@linux.alibaba.com header.a=rsa-sha256 header.s=default header.b=WypENWiN; dkim-atps=neutral Authentication-Results: lists.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=linux.alibaba.com (client-ip=115.124.30.130; helo=out30-130.freemail.mail.aliyun.com; envelope-from=hsiangkao@linux.alibaba.com; receiver=lists.ozlabs.org) Received: from out30-130.freemail.mail.aliyun.com (out30-130.freemail.mail.aliyun.com [115.124.30.130]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 4gkKZS1C7Kz2xSN for ; Mon, 22 Jun 2026 17:29:02 +1000 (AEST) DKIM-Signature:v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.alibaba.com; s=default; t=1782113338; h=Message-ID:Date:MIME-Version:Subject:To:From:Content-Type; bh=Y/W7rSUjnKgG0WzmclmvOeTXnTTDaaWYvYZ2/M3Zw3U=; b=WypENWiN+k6nInh1niAOO9OpRSl05Ybqxmd7HWFDLNWyl3gv4TvRjmkULuogk/G1xmphmd+VdTKdnUUmLnPx4eRJnCDLz+37mwp71U6ANNOdDWQcJgFpXc6zmC1wbhgSVEzx2SYOuKliz1++hjOzEizQXhESBGvFTm/ONFpBHj4= X-Alimail-AntiSpam:AC=PASS;BC=-1|-1;BR=01201311R251e4;CH=green;DM=||false|;DS=||;FP=0|-1|-1|-1|0|-1|-1|-1;HT=maildocker-contentspam033032089153;MF=hsiangkao@linux.alibaba.com;NM=1;PH=DS;RN=3;SR=0;TI=SMTPD_---0X5JQKay_1782113336; Received: from 30.221.130.114(mailfrom:hsiangkao@linux.alibaba.com fp:SMTPD_---0X5JQKay_1782113336 cluster:ay36) by smtp.aliyun-inc.com; Mon, 22 Jun 2026 15:28:57 +0800 Message-ID: <1e4cb452-3066-4c61-a896-c2f814352ba7@linux.alibaba.com> Date: Mon, 22 Jun 2026 15:28:55 +0800 X-Mailing-List: linux-erofs@lists.ozlabs.org List-Id: List-Help: List-Owner: List-Post: List-Subscribe: , , List-Unsubscribe: Precedence: list MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH 1/2] ublk: support ublk recovery To: Chengyu , linux-erofs@lists.ozlabs.org Cc: Chengyu Zhu References: <20260619041922.64521-1-hudson@cyzhu.com> <20260619041922.64521-2-hudson@cyzhu.com> From: Gao Xiang In-Reply-To: <20260619041922.64521-2-hudson@cyzhu.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Hi Chengyu, On 2026/6/19 12:19, Chengyu wrote: > From: Chengyu Zhu > > Enable ublk user recovery so erofsmount can reattach a daemon to a > recoverable ublk device after the previous userspace server exits. > > Store the recovery source information in a ublk-specific runtime record, > create ublk devices with user recovery enabled, and add the mount-side > reattach path for existing recoverable ublk devices. > > Also encode ublk IO uring command opcodes explicitly for non-legacy kernels, > and initialize the control ring before querying whether a ublk device is > recoverable. > > Signed-off-by: Chengyu Zhu > --- > lib/backends/ublk.c | 23 ++++++--- > mount/main.c | 115 ++++++++++++++++++++++++++++++++++++++++---- > 2 files changed, 122 insertions(+), 16 deletions(-) > > diff --git a/lib/backends/ublk.c b/lib/backends/ublk.c > index a8ecad9..49191de 100644 > --- a/lib/backends/ublk.c > +++ b/lib/backends/ublk.c > @@ -258,7 +258,16 @@ static unsigned int erofsublk_formalize_cmd_op(unsigned int op) > DBG_BUGON(_IOC_DIR(op) != 0); > DBG_BUGON(_IOC_SIZE(op) != 0); > > - if (op < ARRAY_SIZE(ctrl_cmd_op) && !erofs_ublk_use_legacy_cmds) > + if (erofs_ublk_use_legacy_cmds) > + return op; > + > + /* IO opcodes live above the ctrl table and need explicit encoding */ > + if (op == UBLK_IO_FETCH_REQ) > + return UBLK_U_IO_FETCH_REQ; > + if (op == UBLK_IO_COMMIT_AND_FETCH_REQ) > + return UBLK_U_IO_COMMIT_AND_FETCH_REQ; > + > + if (op < ARRAY_SIZE(ctrl_cmd_op)) > return ctrl_cmd_op[op]; > return op; if (!erofs_ublk_use_legacy_cmds) { if (op == UBLK_IO_FETCH_REQ) return UBLK_U_IO_FETCH_REQ; if (op == UBLK_IO_COMMIT_AND_FETCH_REQ) return UBLK_U_IO_COMMIT_AND_FETCH_REQ; if (op < ARRAY_SIZE(ctrl_cmd_op)) return ctrl_cmd_op[op]; } return op; ? > } > @@ -528,11 +537,6 @@ static inline unsigned int user_data_to_tag(u64 user_data) > return user_data & 0xffff; > } .. > > +static int ublk_dev_id_from_path(const char *path); Can we avoid forward declaration? > + > +static int erofsmount_ublk_reattach(int dev_id) > +{ > + struct erofsmount_nbd_ctx ctx = { .vd = &ctx._vd }; > + char *recp; > + FILE *f; > + int err; > + > + if (!erofs_ublk_is_recoverable(dev_id)) > + return -EINVAL; > + > + if (asprintf(&recp, EROFSMOUNT_UBLK_REC_FMT, dev_id) <= 0) > + return -ENOMEM; > + > + f = fopen(recp, "r"); > + if (!f) { > + err = -errno; > + free(recp); > + return err; > + } > + > + err = erofsmount_open_recovery_source(&ctx, f); > + if (err) { > + free(recp); > + return err; > + } > + > + if (fork() == 0) { > + err = erofs_ublk_recover_dev(dev_id, erofsmount_ublk_handler, > + ctx.vd); > + if (err) { > + erofs_err("ublk recover dev %d failed: %s", > + dev_id, strerror(-err)); > + erofs_io_close(ctx.vd); > + exit(EXIT_FAILURE); > + } > + err = erofs_ublk_start(dev_id, -1); > + erofs_ublk_destroy(dev_id); > + erofs_io_close(ctx.vd); > + (void)unlink(recp); > + exit(err ? EXIT_FAILURE : EXIT_SUCCESS); > + } > + > + erofs_io_close(ctx.vd); > + free(recp); > + return 0; > +} > + > static int erofsmount_reattach(const char *target) > { > struct erofsmount_nbd_ctx ctx = { .vd = &ctx._vd }; > @@ -1450,6 +1528,10 @@ static int erofsmount_reattach(const char *target) > if (err < 0) > return -errno; > > + nbdnum = ublk_dev_id_from_path(target); > + if (S_ISBLK(st.st_mode) && nbdnum >= 0) > + return erofsmount_ublk_reattach(nbdnum); > + > if (!S_ISBLK(st.st_mode) || major(st.st_rdev) != EROFS_NBD_MAJOR) > return -ENOTBLK; if (!S_ISBLK(st.st_mode)) return -ENOTBLK; nbdnum = ublk_dev_id_from_path(target); if (nbdnum >= 0) return erofsmount_ublk_reattach(nbdnum); if (major(st.st_rdev) != EROFS_NBD_MAJOR) return -ENOTBLK; ? Thanks, Gao Xiang