From patchwork Mon Dec 11 19:30:47 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrei Vagin X-Patchwork-Id: 176899 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:bcd1:0:b0:403:3b70:6f57 with SMTP id r17csp7290401vqy; Mon, 11 Dec 2023 11:31:03 -0800 (PST) X-Google-Smtp-Source: AGHT+IF/KuKA9BtfXJgUq0jlnZScCFLCTDC24R6nRSM20RzpJC46Z1bp8CbSsKCTYgrp8KJK4spn X-Received: by 2002:a05:6a20:12c8:b0:190:a0ed:8058 with SMTP id v8-20020a056a2012c800b00190a0ed8058mr5091065pzg.103.1702323063655; Mon, 11 Dec 2023 11:31:03 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1702323063; cv=none; d=google.com; s=arc-20160816; b=Fqm4XoXWiN0IgfFxLjQkrZU7IvsVwr/mszxGLWfw9GWwKazcDpUr+m7oFq+ZpFS1zv XYZ2GvEKg4BqxL2CMOGkgPqkhu4HWOAOuQjHTt/v2mKbpHwjqL/8/chxj9dIQ+RPVPk2 iDSb8lk48IUxR/F4UExsaDr/0HjvahgQa5JOFHWpY1EnC3du2uReyRYY+s5gp8skQFNR SSxJYBbG9FfriKtQEGYMBWxQFS1uf5PZBXPX8etid9hJA1KqFnfdM7/XGrB64mGTLWkR 85ji6/pAI2jNNbTb2njGY7175E2d8xOLpnlaKY4UwoACHnRrWV3XtxMMSu9UOv6gWZhp o5GQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:cc:to:from:subject:message-id:mime-version:date :dkim-signature; bh=Zg8AR05UHVq8cdvaCLIRoC/0NFp4lFWlQJeIXd72AHI=; fh=k9VKxD0Re/jkv49R7QbtIZFLcKbwxv6/4UblSDbzkbw=; b=SI7mI10IPJ4nDtWkBZ4BeJBqvabRTfl/qNR7VtRp48RZQbi7oMpe4n0wVFRADeDqX0 Vfc+BartIUbdJGBPHCtJrsOXzfutMBx9YT34pq2Xmat6jQaWhBi51Js4fBEGclj93N8U R9HPawz3dPc0XNQfRXaEfqPsgjE7OiHmPfeYR3ngOuP6mbpHddH2M69whmCA0Cok9aYH 3lDlOj+OOcH9Hl8x/S51oPbjb+mk0FZtzBI7FuF59OhMkJFEvHVuHwbbVvOsQuaskwVK e0tL+k9RL798Lip3/t30tYTXop+5aHH5zh//YNipic5OUKES53IUyY1XKQcdmb+ZhsQD F4fg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20230601 header.b=dDsf8FA0; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.36 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: from pete.vger.email (pete.vger.email. [23.128.96.36]) by mx.google.com with ESMTPS id t11-20020a056a0021cb00b006cef51e9ea9si4205037pfj.218.2023.12.11.11.31.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 11 Dec 2023 11:31:03 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.36 as permitted sender) client-ip=23.128.96.36; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20230601 header.b=dDsf8FA0; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.36 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by pete.vger.email (Postfix) with ESMTP id CE95580411AF; Mon, 11 Dec 2023 11:30:58 -0800 (PST) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.11 at pete.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1344776AbjLKTar (ORCPT + 99 others); Mon, 11 Dec 2023 14:30:47 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:54288 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229539AbjLKTaq (ORCPT ); Mon, 11 Dec 2023 14:30:46 -0500 Received: from mail-pl1-x64a.google.com (mail-pl1-x64a.google.com [IPv6:2607:f8b0:4864:20::64a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 9C5D4D5 for ; Mon, 11 Dec 2023 11:30:52 -0800 (PST) Received: by mail-pl1-x64a.google.com with SMTP id d9443c01a7336-1d0544c07c3so22869015ad.3 for ; Mon, 11 Dec 2023 11:30:52 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1702323052; x=1702927852; darn=vger.kernel.org; h=cc:to:from:subject:message-id:mime-version:date:from:to:cc:subject :date:message-id:reply-to; bh=Zg8AR05UHVq8cdvaCLIRoC/0NFp4lFWlQJeIXd72AHI=; b=dDsf8FA0wFzn77vPL6A4/RdEy1AZpMSWVA/FQL3czPbjtuRKRarsadrEci9Nxx1Bzt C5esFW1gRGWiCLAa9EK4m64MwTFk9MS4UykMvI67NnJBcFlbGM/TWXlQ58D1GuRZVEXV riBDCY3Y0I2v0m6zL+rEtvUQFzW10PfIv4+8aKvig3KG1A+GBafwsqaaefx2J93Wj65v Pqypumeu0nSrTvzTdmYcKd889cg7eC4fuRWD0AXHsC4tZ7rqP0N4lg6ucdt+8h+Uhz5v HGljVxjkFJsUzd3RGV03VZ9CRCifKKOwyXhlZvC3AFE9wPVMe2fr4pjf83/Fh3BBR79p 4IJQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1702323052; x=1702927852; h=cc:to:from:subject:message-id:mime-version:date:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=Zg8AR05UHVq8cdvaCLIRoC/0NFp4lFWlQJeIXd72AHI=; b=GLuHvUaszBG22CwJUe03cj98Gg+1Lu5S5LTXOJDGyrpsi0WUg4bN0O2a++EfnZRDky WbCYPXW20I0Ffxx6IZP/G5lJtCwn077i+gCv9IZZJVChhlZOl2CCXdSrrhmwsVUFvDD6 QICy+ulMdnR3KL2J5i3gJyCp9FspqRbjARTtFqXSryX0wKNGdXEHbYW3tJfhVCvYzp4d mgyQhIEs2c8SzWoLbTBxw7DUdF2rIOIMrOn0X8mUUlGAb4GITt3A1xXR3r4FmtHVNPpw gXjgiVW7mdfdYASGa/oSfIRKuGhbTKa9/ANpQoQDGxs6TIQdIehA1B7xARsBRdxMYQ0Q rl6Q== X-Gm-Message-State: AOJu0YzIVwhB72TPL01UvkhqYovMqf016b9V7HQNr/tYPc0lXLc/GZpc vKyNnmFuIjw45s6I/Qje06XixUnt1qY= X-Received: from avagin.kir.corp.google.com ([2620:0:1008:10:dc8d:a8c5:498f:a21c]) (user=avagin job=sendgmr) by 2002:a17:902:e804:b0:1d0:c2be:3d9d with SMTP id u4-20020a170902e80400b001d0c2be3d9dmr39536plg.7.1702323051863; Mon, 11 Dec 2023 11:30:51 -0800 (PST) Date: Mon, 11 Dec 2023 11:30:47 -0800 Mime-Version: 1.0 X-Mailer: git-send-email 2.43.0.472.g3155946c3a-goog Message-ID: <20231211193048.580691-1-avagin@google.com> Subject: [PATCH 1/2] fs/proc: show correct device and inode numbers in /proc/pid/maps From: Andrei Vagin To: Andrew Morton Cc: linux-kernel@vger.kernel.org, Andrei Vagin , Amir Goldstein , Alexander Mikhalitsyn X-Spam-Status: No, score=-8.4 required=5.0 tests=DKIMWL_WL_MED,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,T_SCC_BODY_TEXT_LINE, USER_IN_DEF_DKIM_WL autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on pete.vger.email Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (pete.vger.email [0.0.0.0]); Mon, 11 Dec 2023 11:30:59 -0800 (PST) X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1785015108918397993 X-GMAIL-MSGID: 1785015108918397993 Device and inode numbers in /proc/pid/maps have to match numbers returned by statx for the same files. /proc/pid/maps shows device and inode numbers of vma->vm_file-s. Here is an issue. If a mapped file is on a stackable file system (e.g., overlayfs), vma->vm_file is a backing file whose f_inode is on the underlying filesystem. To show correct numbers, we need to get a user file and shows its numbers. The same trick is used to show file paths in /proc/pid/maps. But it isn't the end of this story. A file system can manipulate inode numbers within the getattr callback (e.g., ovl_getattr), so vfs_getattr must be used to get correct numbers. Cc: Amir Goldstein Cc: Alexander Mikhalitsyn Signed-off-by: Andrei Vagin Reviewed-by: Alexander Mikhalitsyn --- fs/proc/task_mmu.c | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c index 435b61054b5b..abbf96c091ad 100644 --- a/fs/proc/task_mmu.c +++ b/fs/proc/task_mmu.c @@ -273,9 +273,23 @@ show_map_vma(struct seq_file *m, struct vm_area_struct *vma) const char *name = NULL; if (file) { - struct inode *inode = file_inode(vma->vm_file); - dev = inode->i_sb->s_dev; - ino = inode->i_ino; + const struct path *path; + struct kstat stat; + + path = file_user_path(file); + /* + * A file system can manipulate inode numbers within the + * getattr callback (e.g. ovl_getattr). + */ + if (!vfs_getattr_nosec(path, &stat, STATX_INO, AT_STATX_DONT_SYNC)) { + dev = stat.dev; + ino = stat.ino; + } else { + struct inode *inode = d_backing_inode(path->dentry); + + dev = inode->i_sb->s_dev; + ino = inode->i_ino; + } pgoff = ((loff_t)vma->vm_pgoff) << PAGE_SHIFT; } From patchwork Mon Dec 11 19:30:48 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrei Vagin X-Patchwork-Id: 176900 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:bcd1:0:b0:403:3b70:6f57 with SMTP id r17csp7290429vqy; Mon, 11 Dec 2023 11:31:06 -0800 (PST) X-Google-Smtp-Source: AGHT+IFbqelTKDlKPbKjgm/Fq3HpncKebBGrvFOkgGdc//lMZSB2KfEvnIw3Ft0gyajPC0OUSSbO X-Received: by 2002:a17:902:7787:b0:1d0:c986:8ac9 with SMTP id o7-20020a170902778700b001d0c9868ac9mr2113681pll.22.1702323066281; Mon, 11 Dec 2023 11:31:06 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1702323066; cv=none; d=google.com; s=arc-20160816; b=eYD0yGJ7xJWyZkCFOA/XZiBBSD3FBI7oRPqmmU2VVKRb62JLH+ZhiJyTgWEVVm2N7h WBvIX5jsdZGdSCCHj6LtiitIoTj1xUzIGyjWz1/BeoAs0bVrUAdjueGHZ4mqfL/qkRtk QZcb/MhP2+kyNhzLaDhQmDhoc7txqElTO7Nc/pzYcVXH4lDSPiSJYybE19DLof84rh+H Fv+/k+b9TX/f+9AGVE2cIqDuI6yo8DzCvgSaqqZVzZc2lgVKJjvxdD7sDRWvYhJeqJKH bxq5fLdXJi+pWHJKlva+lC7Rrn0pYpot5tfCuZe95bJVOLCQpVQnxB/+4s7o/ULX0S2m ARag== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:cc:to:from:subject:message-id:references :mime-version:in-reply-to:date:dkim-signature; bh=SN2AMMflKSHYDUJpSUv+zVSo3moMo5WS+hI11zyslyY=; fh=k9VKxD0Re/jkv49R7QbtIZFLcKbwxv6/4UblSDbzkbw=; b=ibXwACzWGvVWRyVpbP+OVM9GOeC9NgSl9Moz7LRMLL/Y6/6pefjDnqsxDiHA/RHg0S nqW/RALdGrdHSXAMenmUOxIA3xKvolL+AO/m9T0/WGl2EXgxtLc2Hz0dlF2vsA+7ERj3 bxG5SjpE/cf9kOr1lPnicTfUrndrNWp1mbzMwW/+Af9STMqsP9BrZMHrzrInkehfse1x DunurLKn44l26NC4ihm53lxdTmA7XtZcaOP/Ddq/7H6x0AFcZDdbvqUHEHH7u/vKPrLA 0PHZ7VxLPstYeX42b96mWXnOa9E03KXMKyq/ElUGfBzvvxP/zfpONbgdaJlBLr9i5LZO JA3Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20230601 header.b=kraNx8MN; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:3 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: from lipwig.vger.email (lipwig.vger.email. [2620:137:e000::3:3]) by mx.google.com with ESMTPS id x18-20020a170902b41200b001cfc2c87fbesi6587654plr.534.2023.12.11.11.31.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 11 Dec 2023 11:31:06 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:3 as permitted sender) client-ip=2620:137:e000::3:3; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20230601 header.b=kraNx8MN; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:3 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by lipwig.vger.email (Postfix) with ESMTP id 45F1880545AB; Mon, 11 Dec 2023 11:31:02 -0800 (PST) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.11 at lipwig.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1344785AbjLKTax (ORCPT + 99 others); Mon, 11 Dec 2023 14:30:53 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:54328 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229539AbjLKTat (ORCPT ); Mon, 11 Dec 2023 14:30:49 -0500 Received: from mail-yw1-x1149.google.com (mail-yw1-x1149.google.com [IPv6:2607:f8b0:4864:20::1149]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id ADE23C2 for ; Mon, 11 Dec 2023 11:30:54 -0800 (PST) Received: by mail-yw1-x1149.google.com with SMTP id 00721157ae682-5df5d595287so15038507b3.1 for ; Mon, 11 Dec 2023 11:30:54 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1702323054; x=1702927854; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=SN2AMMflKSHYDUJpSUv+zVSo3moMo5WS+hI11zyslyY=; b=kraNx8MNGD4dohv+a6mGHzY36NileyWpm4NBXrVvHWCHkF30MSwKt/TcEchsh8kuIQ QywqId/xj94MT0taRwmWu1PZeeBqAWMUBR0RQy87N0ugamn3M6vIV3sgghojqQbCQ4Ot hrjw/kLXbLIp4OseMGhm8g3Nsdchlm+x6wZrOgBRkwD6JCqP7j0TX2k+zwvXS7qrZyYA Tt8PYp7RhzpWuShrKzk8COGNhGlQ/Amz84nTBD5lBUkKPH9KwtIgNOCZ5WfJNtn2WduO TfvGyL3BqGJ9MMwoUm7GstxCZOpSkFyAC34QNQmyL870MNEvL+evIws6Y54VhQn12hFM kVqA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1702323054; x=1702927854; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=SN2AMMflKSHYDUJpSUv+zVSo3moMo5WS+hI11zyslyY=; b=vcTsfmm3+kqMuEu8bgikeXaom+x9e71oCUFmpz16BXh2Vi17LSyI+FMYDQUxd2y0Af G5CAxoP3cuWEfclcuUwe9rX6rI6sCloMl3dhwjvnBiUVcMhwMJ6B7V2t7JeMkZwitRVc T+y+P2Swycbhi/w142AigPLRXl7sSaUeHAe+NBpMmioJTV8ahhyatj17e8lolkoqLyag dBtNFNmZfjY7rYygPwAcvli6dS5Th+45sge5eoKgGKt2BGnTn4qYFs8lcMTww4cMbLAi TIjDQg1qbr/4Yx4lIhVQBO5idydABhHsjUbSp4G8x+ILKeVJ8NTWRtZpU6GdHnyuvf4q jNgQ== X-Gm-Message-State: AOJu0Yx5jsfMLMUUmukAvaleN2g8qumsGZhMu2Y2YH57imepb47QQ9we Mdppn0lSD2uemHsEpL+rJjlDR1/bLUM= X-Received: from avagin.kir.corp.google.com ([2620:0:1008:10:dc8d:a8c5:498f:a21c]) (user=avagin job=sendgmr) by 2002:a81:af19:0:b0:5e1:a451:99bf with SMTP id n25-20020a81af19000000b005e1a45199bfmr9607ywh.1.1702323053733; Mon, 11 Dec 2023 11:30:53 -0800 (PST) Date: Mon, 11 Dec 2023 11:30:48 -0800 In-Reply-To: <20231211193048.580691-1-avagin@google.com> Mime-Version: 1.0 References: <20231211193048.580691-1-avagin@google.com> X-Mailer: git-send-email 2.43.0.472.g3155946c3a-goog Message-ID: <20231211193048.580691-2-avagin@google.com> Subject: [PATCH 2/2] selftests/overlayfs: verify device and inode numbers in /proc/pid/maps From: Andrei Vagin To: Andrew Morton Cc: linux-kernel@vger.kernel.org, Andrei Vagin , Amir Goldstein , Alexander Mikhalitsyn X-Spam-Status: No, score=-8.4 required=5.0 tests=DKIMWL_WL_MED,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,T_SCC_BODY_TEXT_LINE, USER_IN_DEF_DKIM_WL autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lipwig.vger.email Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (lipwig.vger.email [0.0.0.0]); Mon, 11 Dec 2023 11:31:02 -0800 (PST) X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1785015111550234376 X-GMAIL-MSGID: 1785015111550234376 When mapping a file on overlayfs, the file stored in ->vm_file is a backing file whose f_inode is on the underlying filesystem. We need to verify that /proc/pid/maps contains numbers of the overlayfs file, but not its backing file. Cc: Amir Goldstein Cc: Alexander Mikhalitsyn Signed-off-by: Andrei Vagin Reviewed-by: Alexander Mikhalitsyn Reviewed-by: Amir Goldstein --- tools/testing/selftests/Makefile | 1 + .../filesystems/overlayfs/.gitignore | 2 + .../selftests/filesystems/overlayfs/Makefile | 7 + .../filesystems/overlayfs/dev_in_maps.c | 182 ++++++++++++++++++ .../selftests/filesystems/overlayfs/log.h | 26 +++ 5 files changed, 218 insertions(+) create mode 100644 tools/testing/selftests/filesystems/overlayfs/.gitignore create mode 100644 tools/testing/selftests/filesystems/overlayfs/Makefile create mode 100644 tools/testing/selftests/filesystems/overlayfs/dev_in_maps.c create mode 100644 tools/testing/selftests/filesystems/overlayfs/log.h diff --git a/tools/testing/selftests/Makefile b/tools/testing/selftests/Makefile index 3b2061d1c1a5..0939a40abb28 100644 --- a/tools/testing/selftests/Makefile +++ b/tools/testing/selftests/Makefile @@ -26,6 +26,7 @@ TARGETS += filesystems TARGETS += filesystems/binderfs TARGETS += filesystems/epoll TARGETS += filesystems/fat +TARGETS += filesystems/overlayfs TARGETS += firmware TARGETS += fpu TARGETS += ftrace diff --git a/tools/testing/selftests/filesystems/overlayfs/.gitignore b/tools/testing/selftests/filesystems/overlayfs/.gitignore new file mode 100644 index 000000000000..52ae618fdd98 --- /dev/null +++ b/tools/testing/selftests/filesystems/overlayfs/.gitignore @@ -0,0 +1,2 @@ +# SPDX-License-Identifier: GPL-2.0-only +dev_in_maps diff --git a/tools/testing/selftests/filesystems/overlayfs/Makefile b/tools/testing/selftests/filesystems/overlayfs/Makefile new file mode 100644 index 000000000000..56b2b48a765b --- /dev/null +++ b/tools/testing/selftests/filesystems/overlayfs/Makefile @@ -0,0 +1,7 @@ +# SPDX-License-Identifier: GPL-2.0 + +TEST_GEN_PROGS := dev_in_maps + +CFLAGS := -Wall -Werror + +include ../../lib.mk diff --git a/tools/testing/selftests/filesystems/overlayfs/dev_in_maps.c b/tools/testing/selftests/filesystems/overlayfs/dev_in_maps.c new file mode 100644 index 000000000000..08497c2e10a3 --- /dev/null +++ b/tools/testing/selftests/filesystems/overlayfs/dev_in_maps.c @@ -0,0 +1,182 @@ +// SPDX-License-Identifier: GPL-2.0 +#define _GNU_SOURCE + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "../../kselftest.h" +#include "log.h" + +static int sys_fsopen(const char *fsname, unsigned int flags) +{ + return syscall(__NR_fsopen, fsname, flags); +} + +static int sys_fsconfig(int fd, unsigned int cmd, const char *key, const char *value, int aux) +{ + return syscall(__NR_fsconfig, fd, cmd, key, value, aux); +} + +static int sys_fsmount(int fd, unsigned int flags, unsigned int attr_flags) +{ + return syscall(__NR_fsmount, fd, flags, attr_flags); +} + +static int sys_move_mount(int from_dfd, const char *from_pathname, + int to_dfd, const char *to_pathname, + unsigned int flags) +{ + return syscall(__NR_move_mount, from_dfd, from_pathname, to_dfd, to_pathname, flags); +} + +static long get_file_dev_and_inode(void *addr, struct statx *stx) +{ + char buf[4096]; + FILE *mapf; + + mapf = fopen("/proc/self/maps", "r"); + if (mapf == NULL) + return pr_perror("fopen(/proc/self/maps)"); + + while (fgets(buf, sizeof(buf), mapf)) { + unsigned long start, end; + uint32_t maj, min; + __u64 ino; + + if (sscanf(buf, "%lx-%lx %*s %*s %x:%x %llx", + &start, &end, &maj, &min, &ino) != 5) + return pr_perror("unable to parse: %s", buf); + if (start == (unsigned long)addr) { + stx->stx_dev_major = maj; + stx->stx_dev_minor = min; + stx->stx_ino = ino; + return 0; + } + } + + return pr_err("unable to find the mapping"); +} + +static int ovl_mount(void) +{ + int tmpfs, fsfd, ovl; + + fsfd = sys_fsopen("tmpfs", 0); + if (fsfd == -1) + return pr_perror("fsopen(tmpfs)"); + + if (sys_fsconfig(fsfd, FSCONFIG_CMD_CREATE, NULL, NULL, 0) == -1) + return pr_perror("FSCONFIG_CMD_CREATE"); + + tmpfs = sys_fsmount(fsfd, 0, 0); + if (tmpfs == -1) + return pr_perror("fsmount"); + + close(fsfd); + + /* overlayfs can't be constructed on top of a detached mount. */ + if (sys_move_mount(tmpfs, "", AT_FDCWD, "/tmp", MOVE_MOUNT_F_EMPTY_PATH)) + return pr_perror("move_mount"); + close(tmpfs); + + if (mkdir("/tmp/w", 0755) == -1 || + mkdir("/tmp/u", 0755) == -1 || + mkdir("/tmp/l", 0755) == -1) + return pr_perror("mkdir"); + + fsfd = sys_fsopen("overlay", 0); + if (fsfd == -1) + return pr_perror("fsopen(overlay)"); + if (sys_fsconfig(fsfd, FSCONFIG_SET_STRING, "source", "test", 0) == -1 || + sys_fsconfig(fsfd, FSCONFIG_SET_STRING, "lowerdir", "/tmp/l", 0) == -1 || + sys_fsconfig(fsfd, FSCONFIG_SET_STRING, "upperdir", "/tmp/u", 0) == -1 || + sys_fsconfig(fsfd, FSCONFIG_SET_STRING, "workdir", "/tmp/w", 0) == -1) + return pr_perror("fsconfig"); + if (sys_fsconfig(fsfd, FSCONFIG_CMD_CREATE, NULL, NULL, 0) == -1) + return pr_perror("fsconfig"); + ovl = sys_fsmount(fsfd, 0, 0); + if (ovl == -1) + return pr_perror("fsmount"); + + return ovl; +} + +/* + * Check that the file device and inode shown in /proc/pid/maps match values + * returned by stat(2). + */ +static int test(void) +{ + struct statx stx, mstx; + int ovl, fd; + void *addr; + + ovl = ovl_mount(); + if (ovl == -1) + return -1; + + fd = openat(ovl, "test", O_RDWR | O_CREAT, 0644); + if (fd == -1) + return pr_perror("openat"); + + addr = mmap(NULL, 4096, PROT_READ | PROT_WRITE, MAP_FILE | MAP_SHARED, fd, 0); + if (addr == MAP_FAILED) + return pr_perror("mmap"); + + if (get_file_dev_and_inode(addr, &mstx)) + return -1; + if (statx(fd, "", AT_EMPTY_PATH | AT_STATX_SYNC_AS_STAT, STATX_INO, &stx)) + return pr_perror("statx"); + + if (stx.stx_dev_major != mstx.stx_dev_major || + stx.stx_dev_minor != mstx.stx_dev_minor || + stx.stx_ino != mstx.stx_ino) + return pr_fail("unmatched dev:ino %x:%x:%llx (expected %x:%x:%llx)\n", + mstx.stx_dev_major, mstx.stx_dev_minor, mstx.stx_ino, + stx.stx_dev_major, stx.stx_dev_minor, stx.stx_ino); + + ksft_test_result_pass("devices are matched\n"); + return 0; +} + +int main(int argc, char **argv) +{ + int fsfd; + + fsfd = sys_fsopen("overlay", 0); + if (fsfd == -1) { + ksft_test_result_skip("unable to create overlay mount\n"); + return 1; + } + close(fsfd); + + /* Create a new mount namespace to not care about cleaning test mounts. */ + if (unshare(CLONE_NEWNS) == -1) { + ksft_test_result_skip("unable to create a new mount namespace\n"); + return 1; + } + + if (mount(NULL, "/", NULL, MS_SLAVE | MS_REC, NULL) == -1) { + pr_perror("mount"); + return 1; + } + + ksft_set_plan(1); + + if (test()) + return 1; + + ksft_exit_pass(); + return 0; +} diff --git a/tools/testing/selftests/filesystems/overlayfs/log.h b/tools/testing/selftests/filesystems/overlayfs/log.h new file mode 100644 index 000000000000..db64df2a8483 --- /dev/null +++ b/tools/testing/selftests/filesystems/overlayfs/log.h @@ -0,0 +1,26 @@ +/* SPDX-License-Identifier: GPL-2.0 */ + +#ifndef __SELFTEST_TIMENS_LOG_H__ +#define __SELFTEST_TIMENS_LOG_H__ + +#define pr_msg(fmt, lvl, ...) \ + ksft_print_msg("[%s] (%s:%d)\t" fmt "\n", \ + lvl, __FILE__, __LINE__, ##__VA_ARGS__) + +#define pr_p(func, fmt, ...) func(fmt ": %m", ##__VA_ARGS__) + +#define pr_err(fmt, ...) \ + ({ \ + ksft_test_result_error(fmt "\n", ##__VA_ARGS__); \ + -1; \ + }) + +#define pr_fail(fmt, ...) \ + ({ \ + ksft_test_result_fail(fmt, ##__VA_ARGS__); \ + -1; \ + }) + +#define pr_perror(fmt, ...) pr_p(pr_err, fmt, ##__VA_ARGS__) + +#endif