From patchwork Sun Aug 26 16:25:12 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Amir Goldstein X-Patchwork-Id: 10576293 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 971665A4 for ; Sun, 26 Aug 2018 16:23:37 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 9105C29876 for ; Sun, 26 Aug 2018 16:23:37 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 84B02298B5; Sun, 26 Aug 2018 16:23:37 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 26FE129876 for ; Sun, 26 Aug 2018 16:23:37 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726875AbeHZUGd (ORCPT ); Sun, 26 Aug 2018 16:06:33 -0400 Received: from mail-wr1-f66.google.com ([209.85.221.66]:41936 "EHLO mail-wr1-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726694AbeHZUGd (ORCPT ); Sun, 26 Aug 2018 16:06:33 -0400 Received: by mail-wr1-f66.google.com with SMTP id z96-v6so11411439wrb.8; Sun, 26 Aug 2018 09:23:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=P7dugTAK22NtIrKqBTjGfuAX38LHCGnJT/DHz8lsgnM=; b=FRAkSav5gkZ9nJIEE99mHPxwYhvO/v1kRdUDC54nMNipC2tHm5NN2KFawhS71W4kv0 NZv8RIz7Nu4oIP7Zjv5FzDs7ZxtheL3oaHn/2frOotXiP7K/gWGJBUnY9CHoUdrAjEHi LpbGPRMJPXb6+Ny+TXc4tc94xEecORQ7KTKqFf7HtYrJkxvYh81h4bqJ/DiVqVpI/CPS NHzm80iZ7qRvFEp95KTl9WjAFEMes+R5zQRM0Bifk+sDn+HgHzPwxWMxcrl9MGZR3y81 iC3/qIBhGkjaBwYBCis/g5IYR32KwpvcNV/29EQyRLvfl6dkvPcjwbq0cxP/RUgWpOLp oZ+A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=P7dugTAK22NtIrKqBTjGfuAX38LHCGnJT/DHz8lsgnM=; b=XG1g1LbhgU7HvSTyyWi2nLSa7WVIlvEgSf9K6MNtGf0aPDgyctOolpHbKzuf+7ptCK M5y6fmQtz1pghmSVQFs/erU9qygD65QiZQdd6BvgcCWXe6ffF+O+D4zkSvxkvNgsWLVw p7cPggNFLKpUoh6UFF6DO7dGTRWUzSD3p8+7QH8L5UzU9RQnOudXjW82ajGwRHwhf8dM r1/WMy2S7sS37AitB62egEFI0MglAgADsG7hdZ9XcE4dtjIhOLivygJxjP7BIA1gtONd N/EQxD9s1EDytYqe4e3Ks0ZAjp5R2md2xzEzCsYxJZhb4W4EUr+3L84eRNLCqB9WnH6T eKVg== X-Gm-Message-State: APzg51DmaXwETaEI/7wPJlmbn6sJTS6vWhuXVVefJj11fAm6oIIB3Tat PSG9r7V22eOwgbwZWuiCfkw= X-Google-Smtp-Source: ANB0VdZJ5970Eh5ObWcapT8ndCh8npH42gxhSzjtM/CXYyydBiAEBDu3CvKhdWDubJ3k6yfYHi+/+A== X-Received: by 2002:adf:c5c5:: with SMTP id v5-v6mr6238144wrg.30.1535300612297; Sun, 26 Aug 2018 09:23:32 -0700 (PDT) Received: from localhost.localdomain (bzq-166-168-31-246.red.bezeqint.net. [31.168.166.246]) by smtp.gmail.com with ESMTPSA id o33-v6sm27559238wrf.11.2018.08.26.09.23.31 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Sun, 26 Aug 2018 09:23:31 -0700 (PDT) From: Amir Goldstein To: Miklos Szeredi Cc: Al Viro , Dave Chinner , linux-unionfs@vger.kernel.org, linux-fsdevel@vger.kernel.org Subject: [PATCH v2 1/6] vfs: add helper to get "real" overlayfs file Date: Sun, 26 Aug 2018 19:25:12 +0300 Message-Id: <1535300717-26686-2-git-send-email-amir73il@gmail.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1535300717-26686-1-git-send-email-amir73il@gmail.com> References: <1535300717-26686-1-git-send-email-amir73il@gmail.com> Sender: linux-fsdevel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-fsdevel@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP We recently got rid of most VFS "hacks" that made VFS be aware of overlayfs real underlying dentries. Due to collateral damage of removing these hacks, we now need to make VFS be aware of overlayfs real underlying files. Hopefully, the end result will be fewer places where VFS is aware of overlayfs quirks. Signed-off-by: Amir Goldstein --- fs/overlayfs/file.c | 1 + include/linux/fs.h | 27 +++++++++++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/fs/overlayfs/file.c b/fs/overlayfs/file.c index 32e9282893c9..24c9e0d70c3b 100644 --- a/fs/overlayfs/file.c +++ b/fs/overlayfs/file.c @@ -135,6 +135,7 @@ static int ovl_open(struct inode *inode, struct file *file) file->f_mapping = realfile->f_mapping; file->private_data = realfile; + file->f_mode |= FMODE_STACKED; return 0; } diff --git a/include/linux/fs.h b/include/linux/fs.h index 33322702c910..51c5d167498f 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -161,6 +161,12 @@ typedef int (dio_iodone_t)(struct kiocb *iocb, loff_t offset, /* File does not contribute to nr_files count */ #define FMODE_NOACCOUNT ((__force fmode_t)0x20000000) +/* + * File is stacked over a "real" file that is used for the actual io + * operations. This is set by overlayfs and tested by file_real() in VFS code. + * Not every "stacked" filesystem needs to set this flag. + */ +#define FMODE_STACKED ((__force fmode_t)0x40000000) /* * Flag for rw_copy_check_uvector and compat_rw_copy_check_uvector @@ -2450,6 +2456,27 @@ static inline struct file *file_clone_open(struct file *file) } extern int filp_close(struct file *, fl_owner_t id); +/** + * file_real - Return the real file of a stacked file + * @file: The file to query + * + * If @file is on a union/overlay, then return the underlying, real file. + * Otherwise return @file. + */ +static inline struct file *file_real(struct file *file) +{ + /* + * XXX: Instead of pretending we have a variaty of stacked filesystems + * and implement a f_op->real() operation, just open code the simple + * overlayfs implementation and if we ever need something more fancy, + * we can add the f_op->real() then. + */ + if (unlikely(file->f_mode & FMODE_STACKED)) + return (struct file *)file->private_data; + else + return file; +} + extern struct filename *getname_flags(const char __user *, int, int *); extern struct filename *getname(const char __user *); extern struct filename *getname_kernel(const char *);