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 bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (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 8C43BF99C67 for ; Fri, 17 Apr 2026 20:58:33 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:List-Subscribe:List-Help :List-Post:List-Archive:List-Unsubscribe:List-Id:Content-Transfer-Encoding: MIME-Version:Message-ID:Date:Subject:Cc:To:From:Reply-To:Content-Type: Content-ID:Content-Description:Resent-Date:Resent-From:Resent-Sender: Resent-To:Resent-Cc:Resent-Message-ID:In-Reply-To:References:List-Owner; bh=0MVSGddwfS+lqouJU82lm1dW9XBz7QLMAf3/kqUhZhs=; b=ZxlLBKT/tgl2O9OyXCXZnjA+vn JnCELBc3oOHKZXkFM4szqm5YOop0EqM/bgBPf6b2dMC/wsZeJcQw3WHSG2vynJVpvkl5fRQ6bwwOR RIUkC4M1EBKFrDkOunCCkHBmmGldIPjA/MFENpEIWTkPWBFhH2rKEpko+EngStxu/Tz0zp7yhj8L1 Kz+++RPOyYSX3T6rOYa5wOmzHCcGJqovr+GH0AaePbKA2qjxDFen6rPVlMl+miJ9zsk4uMYc1wVPZ vfPkfbk12CRHz9UikHeBlpNppTWAEpMSuYtqlT6aR7Kh1Z/Ceus+aB08ytMMNUn5gEpfquqhTc2XM A778gKRQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98.2 #2 (Red Hat Linux)) id 1wDqGm-00000004T2d-0A6K; Fri, 17 Apr 2026 20:58:32 +0000 Received: from mail-wm1-x333.google.com ([2a00:1450:4864:20::333]) by bombadil.infradead.org with esmtps (Exim 4.98.2 #2 (Red Hat Linux)) id 1wDqGi-00000004T1y-1GYQ for kexec@lists.infradead.org; Fri, 17 Apr 2026 20:58:29 +0000 Received: by mail-wm1-x333.google.com with SMTP id 5b1f17b1804b1-488ab2db91aso13598255e9.3 for ; Fri, 17 Apr 2026 13:58:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1776459506; x=1777064306; darn=lists.infradead.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=0MVSGddwfS+lqouJU82lm1dW9XBz7QLMAf3/kqUhZhs=; b=ZsGuXyepn/AGgboF5anzp3K1jLIPZ1Fuh7A3L6OrjbMc/J/iA3lJvLf2p2SRrdfuPo zVdLlzUfitF3s5dfKt0fiIhFq2qMMCdfNTPCA4YrEGAXbwu7pruUh/U/8BCXgo3Yqxfp ZbeblBn0GC00mOzCNG168KR5+AwK/0rddrbLTJUOwOK+cFzVHDlLiqI5/mnl4WDPPSPz ADrDZ8pn8jXsB/fwMLWAcI2Ir6V3V/r+xiuIg0BWWyNVNWPBULVCK9Gnx14M524DpMoF vL0LaXLDPxmeeN8YZoU56CnZAzbxQ9H1sNJ0kKtnHFlFme874QX0NxhP6QC4vs2RStZY oJeA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776459506; x=1777064306; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=0MVSGddwfS+lqouJU82lm1dW9XBz7QLMAf3/kqUhZhs=; b=R0JYkII3ET46vebKeHTfGHyTjUCWiIXozwnHwy5Kg7rrq+ajrywlUf4qO5NtnRjb7Y sC/zdvVOAdAMWCA4g0cam3u6aufUHwtnIVM1Iz0I/bfAxg1Fl9188OwDQxY3dvUfelHV jtYk/wrQttEPi3k2NVBlVDPXnPiJ+cnZZtlv8tfuD64x6iHADdi9JfoBuGb9+ZGJFix1 sUiEBfJoZQkLmiWfnBm0OtDE67aTl3PVqNHbgfDYfqIJ3lEtUoBjiCIdxb5m68kQeubj 82sm2fzABhtBwRVRbU0cN6FTPtCzb5hDNZFL6AAMFMcfojw0TaKrT16BUMQiffljdLRw QP0w== X-Gm-Message-State: AOJu0YyTGHj/6KxL4QCfufHaXbb6i0O67kfyGcn8D5d7L3UQcIgGvL67 H4kcA2GaxoAzbXzXB0n8Qz+cIe7dMkbbq7oE5QKQgHnsAraZntzM1QUWcoYI0g== X-Gm-Gg: AeBDietIxSD9X92Edwwg4/QQ01F4FNXVPn+koae2OcPvXwVFZV8tjPKYAImahDsovPJ A/F/jTOxZqf1zFRqlvtI+GF9UX2hhJeoo4lqIA6zBmsXFGljY9Mjc4rPl631WVUY9xlRmP/bABz PS3ytNuLcRD0wPU6aW5Ap5Tr3TqeLMDG8y0e+6UA+dZrxbxqWOhtHOeHeU5ozrjPlyLi9zOAIax VjX2pIvPiPrXtNgYej9R+hxdhCcXsI2HmRJR3slqM8bF4vrcseHbV4tuJemhoPdyctkK/vk+d19 fb7GLnoZms7ynFxnQrr6oFlSoL754sYehdN2cJOwVLfL74aVkgVe/4jxfSGQLokGTvDG4eUnrxW G0gUEZI7gvT6wQsVZjBVMjfnohXLA2Nlmy2V/nxhNWHflC5F2us+SqBBDGyh7362oW+8rbgw5R0 XzvQ5XsgxhCWXtVX8ozVf0e6H/xGcmcIwQAa+LRPg= X-Received: by 2002:a05:600c:64c7:b0:488:a2ac:a334 with SMTP id 5b1f17b1804b1-488fb73aa3bmr65028415e9.3.1776459505901; Fri, 17 Apr 2026 13:58:25 -0700 (PDT) Received: from localhost ([2a01:4b00:d036:ae00:9586:30a1:a0a6:f076]) by smtp.gmail.com with UTF8SMTPSA id 5b1f17b1804b1-488fb7b2634sm25446085e9.28.2026.04.17.13.58.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 17 Apr 2026 13:58:25 -0700 (PDT) From: luca.boccassi@gmail.com To: kexec@lists.infradead.org Cc: linux-mm@kvack.org, graf@amazon.com, rppt@kernel.org, pasha.tatashin@soleen.com, pratyush@kernel.org, brauner@kernel.org, linux-kernel@vger.kernel.org, Luca Boccassi Subject: [PATCH v4 1/2] liveupdate: add LUO_SESSION_MAGIC magic inode type Date: Fri, 17 Apr 2026 21:57:20 +0100 Message-ID: <20260417205810.1831923-1-luca.boccassi@gmail.com> X-Mailer: git-send-email 2.47.3 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20260417_135828_395260_4ED89BF8 X-CRM114-Status: GOOD ( 20.43 ) X-BeenThere: kexec@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "kexec" Errors-To: kexec-bounces+kexec=archiver.kernel.org@lists.infradead.org From: Luca Boccassi In userspace when managing LUO sessions we want to be able to identify a FD as a LUO session, in order to be able to do the special handling that they require in order to function as intended on kexec. Currently this requires scraping procfs and doing string matching on the prefix of the dname, which is not an ideal interface. Add a singleton inode type with a magic value, so that we can programmatically identify a fd as a LUO session via fstat(). Signed-off-by: Luca Boccassi --- This was requested by Lennart and Christian when discussing integration with systemd for LUO management. v2: apply one fix from bot review about cleanup on error path: https://sashiko.dev/#/patchset/20260415184536.1155220-1-luca.boccassi%40gmail.com the other comments are invalid: luo is not a kmod, and the write hooks are not set up v3: add test case to liveupdate selftest v4: split test case in separate follow-up patch include/uapi/linux/magic.h | 1 + kernel/liveupdate/luo_core.c | 10 ++++- kernel/liveupdate/luo_internal.h | 2 + kernel/liveupdate/luo_session.c | 73 +++++++++++++++++++++++++++++--- 4 files changed, 80 insertions(+), 6 deletions(-) diff --git a/include/uapi/linux/magic.h b/include/uapi/linux/magic.h index 4f2da935a76cc..4f51005522ffe 100644 --- a/include/uapi/linux/magic.h +++ b/include/uapi/linux/magic.h @@ -105,5 +105,6 @@ #define PID_FS_MAGIC 0x50494446 /* "PIDF" */ #define GUEST_MEMFD_MAGIC 0x474d454d /* "GMEM" */ #define NULL_FS_MAGIC 0x4E554C4C /* "NULL" */ +#define LUO_SESSION_MAGIC 0x4c554f53 /* "LUOS" */ #endif /* __LINUX_MAGIC_H__ */ diff --git a/kernel/liveupdate/luo_core.c b/kernel/liveupdate/luo_core.c index dda7bb57d421c..f1a63ebe4fa44 100644 --- a/kernel/liveupdate/luo_core.c +++ b/kernel/liveupdate/luo_core.c @@ -197,9 +197,17 @@ static int __init luo_late_startup(void) if (!liveupdate_enabled()) return 0; + err = luo_session_fs_init(); + if (err) { + luo_global.enabled = false; + return err; + } + err = luo_fdt_setup(); - if (err) + if (err) { + luo_session_fs_cleanup(); luo_global.enabled = false; + } return err; } diff --git a/kernel/liveupdate/luo_internal.h b/kernel/liveupdate/luo_internal.h index 8083d8739b093..d4ac7b4c58829 100644 --- a/kernel/liveupdate/luo_internal.h +++ b/kernel/liveupdate/luo_internal.h @@ -79,6 +79,8 @@ struct luo_session { int luo_session_create(const char *name, struct file **filep); int luo_session_retrieve(const char *name, struct file **filep); +int __init luo_session_fs_init(void); +void __init luo_session_fs_cleanup(void); int __init luo_session_setup_outgoing(void *fdt); int __init luo_session_setup_incoming(void *fdt); int luo_session_serialize(void); diff --git a/kernel/liveupdate/luo_session.c b/kernel/liveupdate/luo_session.c index af9e498206d24..f30151c37bd43 100644 --- a/kernel/liveupdate/luo_session.c +++ b/kernel/liveupdate/luo_session.c @@ -50,7 +50,6 @@ #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt -#include #include #include #include @@ -62,7 +61,10 @@ #include #include #include +#include +#include #include +#include #include #include #include @@ -376,18 +378,58 @@ static const struct file_operations luo_session_fops = { .unlocked_ioctl = luo_session_ioctl, }; +static struct vfsmount *luo_session_mnt __ro_after_init; +static struct inode *luo_session_inode __ro_after_init; + +static char *luo_session_dname(struct dentry *dentry, char *buffer, int buflen) +{ + return dynamic_dname(buffer, buflen, "luo_session:%s", + dentry->d_name.name); +} + +static const struct dentry_operations luo_session_dentry_operations = { + .d_dname = luo_session_dname, +}; + +static int luo_session_init_fs_context(struct fs_context *fc) +{ + struct pseudo_fs_context *ctx; + + ctx = init_pseudo(fc, LUO_SESSION_MAGIC); + if (!ctx) + return -ENOMEM; + + fc->s_iflags |= SB_I_NOEXEC; + fc->s_iflags |= SB_I_NODEV; + ctx->dops = &luo_session_dentry_operations; + return 0; +} + +static struct file_system_type luo_session_fs_type = { + .name = "luo_session", + .init_fs_context = luo_session_init_fs_context, + .kill_sb = kill_anon_super, +}; + /* Create a "struct file" for session */ static int luo_session_getfile(struct luo_session *session, struct file **filep) { - char name_buf[128]; + char name_buf[LIVEUPDATE_SESSION_NAME_LENGTH + 1]; struct file *file; lockdep_assert_held(&session->mutex); - snprintf(name_buf, sizeof(name_buf), "[luo_session] %s", session->name); - file = anon_inode_getfile(name_buf, &luo_session_fops, session, O_RDWR); - if (IS_ERR(file)) + + ihold(luo_session_inode); + + snprintf(name_buf, sizeof(name_buf), "%s", session->name); + file = alloc_file_pseudo(luo_session_inode, luo_session_mnt, name_buf, + O_RDWR, &luo_session_fops); + if (IS_ERR(file)) { + iput(luo_session_inode); return PTR_ERR(file); + } + file->private_data = session; *filep = file; return 0; @@ -662,3 +704,24 @@ void luo_session_resume(void) up_write(&luo_session_global.outgoing.rwsem); up_write(&luo_session_global.incoming.rwsem); } + +int __init luo_session_fs_init(void) +{ + luo_session_mnt = kern_mount(&luo_session_fs_type); + if (IS_ERR(luo_session_mnt)) + return PTR_ERR(luo_session_mnt); + + luo_session_inode = alloc_anon_inode(luo_session_mnt->mnt_sb); + if (IS_ERR(luo_session_inode)) { + kern_unmount(luo_session_mnt); + return PTR_ERR(luo_session_inode); + } + + return 0; +} + +void __init luo_session_fs_cleanup(void) +{ + iput(luo_session_inode); + kern_unmount(luo_session_mnt); +} -- 2.47.3