From patchwork Thu Dec 14 06:44:38 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrei Vagin X-Patchwork-Id: 178506 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:7300:3b04:b0:fb:cd0c:d3e with SMTP id c4csp8356862dys; Wed, 13 Dec 2023 22:44:51 -0800 (PST) X-Google-Smtp-Source: AGHT+IFMxAjpynF5lQZ2vp1sgnv55Pc7SHmQoRcTcY3S8XiZi8t4vk1uQTIDtcS9pJRl2rsZ10zU X-Received: by 2002:a9d:7981:0:b0:6d8:5693:4dbb with SMTP id h1-20020a9d7981000000b006d856934dbbmr8502161otm.38.1702536290929; Wed, 13 Dec 2023 22:44:50 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1702536290; cv=none; d=google.com; s=arc-20160816; b=ng+EQMMQ9KF4qDkb2yr/LKmaP6tX92us6mJ/HZ60UZGWQsG16bceWRUO/uYPZk3xcm vvNDwd7vUTS0PMNXE8F0ZEL7gjK5AdHkIDFaIqBcX8YU6+Tk2Hrk8x+p75ng6wBJVy9H r/ddrBy5EY9xx+XFp8SJWkOocjeiN0+EvXEO6JJMtDcgC2/mshJihNFgjgVKKzBx2WJY StEg6mGrQzVQUppPUiKn8nQV71NFn31RYnx4BpHb2evGBKE+zxIokvIrNP0UrUy6c8bt d41VZfWuQzLY6Yzf2by27n10J7kqFI5JImzLxZ1//N8A0poFdpk78ekN1gOAu53oxXfo 6YHw== 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=Iko8D140eCOFohGA7VQkAes9lkzKAM1WQZ+wO/F/i90=; fh=TSdoqwQqcrmvAEoS85l302O8l0xhikz8mG620Q80Q8A=; b=cPPBw3sDjfJYEABrU34w1jOgxJaFyyqkOU6s39ACph/QZYOuHrA6VI6p36Iqq9IBDA dDsV1KBhal6FYLNMit/T8tFotuyEIw1PfzhmLtTbOGfRMxbW11k6xdexhOxk234/bpgZ 2q5P1d/yKIfYFww05riyRvtme8xhDwOZmAfaGgs4uR0mhhH6Ai89olJsK5XwtZUFYPDy 16T9uxjka+7d4C+0nKlBXf5hlSHfPSYbHnjtZvK4RvyvmHWE0vj/lHgeBfU36S7J1zX4 LGtOQUchVxJhYHT7G7fNnVZc/rG3wJuqJoc7sAlc3DGavIT95bnljmgTSHaKh7Qsft5Z r2jg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20230601 header.b="onHZnr5/"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:7 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 snail.vger.email (snail.vger.email. [2620:137:e000::3:7]) by mx.google.com with ESMTPS id 189-20020a6300c6000000b005c615702198si10634516pga.703.2023.12.13.22.44.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 13 Dec 2023 22:44:50 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:7 as permitted sender) client-ip=2620:137:e000::3:7; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20230601 header.b="onHZnr5/"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:7 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 snail.vger.email (Postfix) with ESMTP id C9689802A238; Wed, 13 Dec 2023 22:44:49 -0800 (PST) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.11 at snail.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234275AbjLNGol (ORCPT + 99 others); Thu, 14 Dec 2023 01:44:41 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:40282 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229629AbjLNGok (ORCPT ); Thu, 14 Dec 2023 01:44:40 -0500 Received: from mail-yb1-xb49.google.com (mail-yb1-xb49.google.com [IPv6:2607:f8b0:4864:20::b49]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id ED107B7 for ; Wed, 13 Dec 2023 22:44:45 -0800 (PST) Received: by mail-yb1-xb49.google.com with SMTP id 3f1490d57ef6-dbcb5eb96f7so3344672276.3 for ; Wed, 13 Dec 2023 22:44:45 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1702536285; x=1703141085; darn=vger.kernel.org; h=cc:to:from:subject:message-id:mime-version:date:from:to:cc:subject :date:message-id:reply-to; bh=Iko8D140eCOFohGA7VQkAes9lkzKAM1WQZ+wO/F/i90=; b=onHZnr5/C76u4WAUhTwmVougnLzUmAv+9rDMgFylCd+MXirdjLsJk5w4yOzvVXOhvZ /g4AgkKjfdC4HOcRAfYmhcxNmGi3z1q/mYVKugEQoEdI+7cnCh7BmqUhiWcm8wpQTLcF GDT2D35fDRC7k+3WdpAsL9WLmtbgEHqanb6JgPQZ0sZ8+55pWZS6XUdLfH6ROB7cQfyd w0u++OgNvwHPTjjoX1OQjlA4bDe4H0Zmmhzgk29gtNea1O5l1h5dYZ1fvhwCxdBxmqn3 JjXg/r5fGVlmG2oXfsz1jwtMFdIAoJmAPCXVcBS8d18RwzjpOgr8RybW6a+nAXArzaXU kgRw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1702536285; x=1703141085; h=cc:to:from:subject:message-id:mime-version:date:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=Iko8D140eCOFohGA7VQkAes9lkzKAM1WQZ+wO/F/i90=; b=PSjI3iPWS5HV351SWicok4DB1QxY3wtBPy+w7Xta8y3KQmfOb1LTl0llZPckksSUVM o2IV9b1IPJZ0XcbLbInElH1XQJ44wxMA/8EqEkJB/x/h0V8VIqykTztdBCwz0+kBpj1f 1djSGneQ+2AUz7CptT1wEHBBcFksI+UgKb4y4Hg38kNl0Ds/IAeO0XfuzjnoOQ/pYmns uqbSVwLh8hlSKZy63dMULNJbo3G4Hh4vKa7vCPmZTqF8fNVx4ieBJoOX2JJDJI9ZliUs nJZ+lYc3vnPaB6x96AH3tkfffNVBFcoIOei97TVCtJ485s2lXm5VwC9hDHabNfk1RRER AFNA== X-Gm-Message-State: AOJu0YyUozgcOI2kVYmOT5zNJCz+CU3LRFEbvnI8EyQf2yDguZh3WOSz 1Fr7tN16NWlUGzyD55TdULpzOHkzyhk= X-Received: from avagin.kir.corp.google.com ([2620:0:1008:10:e986:a7c7:2814:c9a8]) (user=avagin job=sendgmr) by 2002:a25:2d2:0:b0:dbc:ca4d:4c1 with SMTP id 201-20020a2502d2000000b00dbcca4d04c1mr32671ybc.11.1702536285111; Wed, 13 Dec 2023 22:44:45 -0800 (PST) Date: Wed, 13 Dec 2023 22:44:38 -0800 Mime-Version: 1.0 X-Mailer: git-send-email 2.43.0.472.g3155946c3a-goog Message-ID: <20231214064439.1023011-1-avagin@google.com> Subject: [PATCH 1/2 v2] fs/proc: show correct device and inode numbers in /proc/pid/maps From: Andrei Vagin To: Andrew Morton , Amir Goldstein Cc: linux-kernel@vger.kernel.org, Alexander Mikhalitsyn , Christian Brauner , Alexander Viro , linux-fsdevel@vger.kernel.org, overlayfs , Miklos Szeredi , Andrei Vagin X-Spam-Status: No, score=-9.6 required=5.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE, SPF_HELO_NONE,SPF_PASS,T_SCC_BODY_TEXT_LINE,USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net 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 (snail.vger.email [0.0.0.0]); Wed, 13 Dec 2023 22:44:49 -0800 (PST) X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1785238693818265050 X-GMAIL-MSGID: 1785238693818265050 /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. Cc: Alexander Mikhalitsyn Suggested-by: Amir Goldstein Signed-off-by: Andrei Vagin Reviewed-by: Amir Goldstein --- v2: Amir explained that vfs_getattr isn't needed, because file_user_inode(vma->vm_file).i_ino always matches an inode number returned by statx. fs/proc/task_mmu.c | 3 ++- include/linux/fs.h | 18 +++++++++++++----- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c index 435b61054b5b..1801e409a061 100644 --- a/fs/proc/task_mmu.c +++ b/fs/proc/task_mmu.c @@ -273,7 +273,8 @@ 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); + const struct inode *inode = file_user_inode(vma->vm_file); + dev = inode->i_sb->s_dev; ino = inode->i_ino; pgoff = ((loff_t)vma->vm_pgoff) << PAGE_SHIFT; diff --git a/include/linux/fs.h b/include/linux/fs.h index 98b7a7a8c42e..838ccfc63323 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -2523,20 +2523,28 @@ struct file *backing_file_open(const struct path *user_path, int flags, struct path *backing_file_user_path(struct file *f); /* - * file_user_path - get the path to display for memory mapped file - * * When mmapping a file on a stackable filesystem (e.g., overlayfs), the file * stored in ->vm_file is a backing file whose f_inode is on the underlying - * filesystem. When the mapped file path is displayed to user (e.g. via - * /proc//maps), this helper should be used to get the path to display - * to the user, which is the path of the fd that user has requested to map. + * filesystem. When the mapped file path and inode number are displayed to + * user (e.g. via /proc//maps), these helpers should be used to get the + * path and inode number to display to the user, which is the path of the fd + * that user has requested to map and the inode number that would be returned + * by fstat() on that same fd. */ +/* Get the path to display in /proc//maps */ static inline const struct path *file_user_path(struct file *f) { if (unlikely(f->f_mode & FMODE_BACKING)) return backing_file_user_path(f); return &f->f_path; } +/* Get the inode whose inode number to display in /proc//maps */ +static inline const struct inode *file_user_inode(struct file *f) +{ + if (unlikely(f->f_mode & FMODE_BACKING)) + return d_inode(backing_file_user_path(f)->dentry); + return file_inode(f); +} static inline struct file *file_clone_open(struct file *file) { From patchwork Thu Dec 14 06:44:39 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrei Vagin X-Patchwork-Id: 178507 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:7300:3b04:b0:fb:cd0c:d3e with SMTP id c4csp8356944dys; Wed, 13 Dec 2023 22:45:10 -0800 (PST) X-Google-Smtp-Source: AGHT+IGLqbqWG+xUXVwKHauf4qzXY1IATqcCEF2IqikMhKNh3Y/fWX6vOfSvWZF4v9Kg7G7DwmVb X-Received: by 2002:a05:6871:6a6:b0:203:3a82:5d6c with SMTP id l38-20020a05687106a600b002033a825d6cmr1590433oao.16.1702536309691; Wed, 13 Dec 2023 22:45:09 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1702536309; cv=none; d=google.com; s=arc-20160816; b=KrD8YXsLBjndI/2o5EAAHRumZYRQY1zbXgX03aaYy3nqJf4gH+9laYxUDeGSye4fAE bhcYrldOD7/H3FI67Hc8Cpz8X5AN68TNEK3eu+vCJ0K5Ggx3bHLSerp0xlzas5nTjfZm rodXmo440xxoRrqOl2CSAnWxjwkFLgQJaG3gPz2uEv77dL9mW2ZCxSUK5BBlmgwV5X0x Z1NsJZkw/iHEi3V67n/oV8I7Mz9fznr57S5EvNf39hib9LvMMeqW+p4xB8lLvXKkPUES 2foq0vumi3B/D0gqE56igQ0xdmkuC0c8Zf0AxdT/DZ/LooGcNkLtvESzY9jmnfxxWA5X ViTg== 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=Pi0n1hV1ncb/RNwMZFnyh9hgwMGCToBH7DtU0L8OSxs=; fh=TSdoqwQqcrmvAEoS85l302O8l0xhikz8mG620Q80Q8A=; b=CbABuKYGel//5iefIIN8tgwZ1aOpM9pfWZWxlhz4oV2L4B4tOKQQHZbI28CSCNMGT3 KELgU2gExdcgCQnyzFLVLpZiOWp2umUH3rAgv2pZYIsjjnpNA/aXMDazWCzVErPrrh0o Isg8v0SYK+mRJQS2Kcxint7515z72slA6RcIxpIE4kv9UWp/VFz9WLRlAGbHMWPYYQK1 broWwmdYLlyQJAHVC3qr4utaY8b6fRJl8KeKGE/gKZc5lbEw+FKU8AaARMF4RZY7VZhn 86XsyrFHJZSJIActQQ209W+gO0V5ZubRdDRyZUVESdFDlJJYt3iTK+G1A4O+aC+7ASsQ h6eA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20230601 header.b=Fpi9gaNf; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.32 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 agentk.vger.email (agentk.vger.email. [23.128.96.32]) by mx.google.com with ESMTPS id by4-20020a056a02058400b005c6be9a9841si11235565pgb.469.2023.12.13.22.45.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 13 Dec 2023 22:45:09 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.32 as permitted sender) client-ip=23.128.96.32; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20230601 header.b=Fpi9gaNf; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.32 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 agentk.vger.email (Postfix) with ESMTP id BB241802F234; Wed, 13 Dec 2023 22:45:02 -0800 (PST) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.11 at agentk.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234331AbjLNGor (ORCPT + 99 others); Thu, 14 Dec 2023 01:44:47 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:53724 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234318AbjLNGom (ORCPT ); Thu, 14 Dec 2023 01:44:42 -0500 Received: from mail-yw1-x114a.google.com (mail-yw1-x114a.google.com [IPv6:2607:f8b0:4864:20::114a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E4577111 for ; Wed, 13 Dec 2023 22:44:47 -0800 (PST) Received: by mail-yw1-x114a.google.com with SMTP id 00721157ae682-5e03f0ede64so53422807b3.0 for ; Wed, 13 Dec 2023 22:44:47 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1702536287; x=1703141087; 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=Pi0n1hV1ncb/RNwMZFnyh9hgwMGCToBH7DtU0L8OSxs=; b=Fpi9gaNfboAVvku+rZdlb6aNhnJC1QklaxRwMgYroM8zyOeRa4oVbquxJ9+D9Jd75Y 5zkH9BQSc1Pa7nJvouWG15HZZ0bPzIfYvNQLlgppVgDr1wNqpk8JhFjN7NwD3oD7qrjq JTTqXpR1LYvTXl3HzychB1GMrxm7g5FosJtfWM1Y8v68G/u5a6VcMqVQ9tV3CHNm/R0/ /SNgBosZt/tKLbF7T9Jg+ACMiP1gUM0vVttUzkvyY2WjuzBcY5Rj/SgVbgPOVG1nySli Z85whCyXr3Spp+eASR8pzL97psnN2ssvEv7iOnnjOrN8lGTzJzoidKHJOHd2ndAQUGCi 46zQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1702536287; x=1703141087; 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=Pi0n1hV1ncb/RNwMZFnyh9hgwMGCToBH7DtU0L8OSxs=; b=un+ZOa3RdMjYG5rNwU8RI12r5PG9taGIljwS9eJKL+tqvX1a9AGJN7o+3ELhhpK/NV jCzHnQaO0T6+iQekm0SvvPqUQ5sIoTVQXenW55Ce9MW+3n5+sIKCFopsRKAtnLUmKfJX bpgwgp04xLw/vYpONx7bi1/I17hK/Y8wQGUZ1iZl+/nabSsn8A4a6AufayGY8WDegRGV VfUK8h6hcdiJg1OY3b6/orndEBBWcOfPMa8Opn2hvt6Y4IvoTkPiRfw8aISnvuL16EUJ bmh3JtmZsAWpu+dfcc3CHd1N/IQxaL0LOw9sBuw1cbijaDX1EufqVsYdiudGyZ7ZYKjy bH7A== X-Gm-Message-State: AOJu0Yztt1f/MZseOOH9rntdruNUZjBZ/zfP3Zy+mtNBa7hS9mv5sq0n 0LwwtisYqTzjEWetuK/XWS0Zv9OwVXY= X-Received: from avagin.kir.corp.google.com ([2620:0:1008:10:e986:a7c7:2814:c9a8]) (user=avagin job=sendgmr) by 2002:a05:6902:343:b0:db5:f536:17d4 with SMTP id e3-20020a056902034300b00db5f53617d4mr76906ybs.11.1702536287106; Wed, 13 Dec 2023 22:44:47 -0800 (PST) Date: Wed, 13 Dec 2023 22:44:39 -0800 In-Reply-To: <20231214064439.1023011-1-avagin@google.com> Mime-Version: 1.0 References: <20231214064439.1023011-1-avagin@google.com> X-Mailer: git-send-email 2.43.0.472.g3155946c3a-goog Message-ID: <20231214064439.1023011-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 , Amir Goldstein Cc: linux-kernel@vger.kernel.org, Alexander Mikhalitsyn , Christian Brauner , Alexander Viro , linux-fsdevel@vger.kernel.org, overlayfs , Miklos Szeredi , Andrei Vagin 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 agentk.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 (agentk.vger.email [0.0.0.0]); Wed, 13 Dec 2023 22:45:02 -0800 (PST) X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1785238713330679422 X-GMAIL-MSGID: 1785238713330679422 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: 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..e19ab0e85709 --- /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 %llu", + &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