Received: by 10.192.165.156 with SMTP id m28csp2088888imm; Thu, 12 Apr 2018 08:25:50 -0700 (PDT) X-Google-Smtp-Source: AIpwx4+FAPshOgPTpeg0VyGtXvWIv0WVNpzdNunlUnVgOxPvrcgTNgngXZI4AzG9VcV4/YaKMGe1 X-Received: by 10.99.159.25 with SMTP id g25mr1042971pge.288.1523546749973; Thu, 12 Apr 2018 08:25:49 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1523546749; cv=none; d=google.com; s=arc-20160816; b=EfX4aaBPV6TVFeGcdCQSazCv2iyNksXlwfxjSsuUKgd1jSWGgVn50YGwdTbjDS6nFg Q+BW6gNxi4euKnKjRQ55EsfIBCFp0MvQSO9kMoy6fBd3yQu1J9p8aie9yTmeG7Tc+NHl aP9z1df01imDoYqG1V92cI3y8+Eouayg6fTyB/ugPNxvSRyD+ls5wnNgbbIDylnRFYFA AdK23rtsH/KzVkdgMzAATclfAQmWd+4p6n0xNwnyq0O4QlQ02P+T3A5U56Z64vRLKh6i 1vvjpfXvzyaY4/3VpTmrj3+1D5LLVpOyAbcW4QkDvL8FPmHaKNGm1ca2mwXo1pzg0WBd vaKw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:arc-authentication-results; bh=QX9p9b26XWRvGkGusKkwnCFXnjl+hsiOj/ebdmMDi9s=; b=iYA0Vs38Q2Z0Lk0Ca7eli2Bn0IA3pbaOw1nOauzJYDSfjCUB0snBCim4MM7DEyAuBp teZeeGF2JjFx0/p1hlSoKSg5Tcg8SSYWVzXxzrxgxJWBdYz6vR4v/xHnKwrC7v/VJTTS b+Mz+grkWgoRCnpbLK/lWfsyqUMa8/FfZ2YV+OgUSKvj9ISpP6lTlenFxE+55AvsQ3f+ etv84WgH69YDivnicj9luKyxiD8agpslXNXBkaqL+UUtDFlTmU4ClE4ZJ5hMvlnryerb utjxDExFYMt6X2EwxkVm8fyU0a1vV3dUwiOWDTE4Q4L5WezcSAarujUFQsgny7Fv8tiZ XpaQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=redhat.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id l12-v6si1233843plk.380.2018.04.12.08.25.12; Thu, 12 Apr 2018 08:25:49 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=redhat.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754046AbeDLPMp (ORCPT + 99 others); Thu, 12 Apr 2018 11:12:45 -0400 Received: from mail-wr0-f196.google.com ([209.85.128.196]:44673 "EHLO mail-wr0-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753654AbeDLPJE (ORCPT ); Thu, 12 Apr 2018 11:09:04 -0400 Received: by mail-wr0-f196.google.com with SMTP id u46so5466471wrc.11 for ; Thu, 12 Apr 2018 08:09:03 -0700 (PDT) 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=QX9p9b26XWRvGkGusKkwnCFXnjl+hsiOj/ebdmMDi9s=; b=cQ8/MCKPyP8QDWCIyV3Ghbnh0KWLLQIGB6n4zXrV7RpF1RQbZMusVnd1cnsnZo1ew1 N0ah/b813T9kH30hwHnrsJad0AUtqiLcoa1jGHavXQqMYZm6xrzl5RwMPcb2ghvotXZs s7fHgOlURbOBqd20D87JkIUHIUQw4K6Ptaq2vgSOOlKl+rMKtpDMVwN4uHE4RPRCkZKc y4kno6495WhvuMXfYZDE31kiB+8so4Q2FI7kW0M61vIFMINXUySQLUsZ8J9SvYmnFN/y rN7W2JbDxY+/TFWq6b0cQGE2Np6b5nMibpdjrehuUzTtzEEz9zZmcNhTbSwacnVNCycw L+Xg== X-Gm-Message-State: ALQs6tDGKhyTWISyDZ4jJKofR1jQOASDcgOXq3Vk9YRKO9iMOs29xi3I xRvSjDIVGZ3/FxLbAwjFJl1SpQ== X-Received: by 10.223.201.146 with SMTP id f18mr1075055wrh.202.1523545743013; Thu, 12 Apr 2018 08:09:03 -0700 (PDT) Received: from veci.piliscsaba.redhat.com (catv-176-63-54-97.catv.broadband.hu. [176.63.54.97]) by smtp.gmail.com with ESMTPSA id p197sm2621783wme.43.2018.04.12.08.09.02 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Thu, 12 Apr 2018 08:09:02 -0700 (PDT) From: Miklos Szeredi To: linux-unionfs@vger.kernel.org Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [RFC PATCH 27/35] Revert "ovl: don't allow writing ioctl on lower layer" Date: Thu, 12 Apr 2018 17:08:18 +0200 Message-Id: <20180412150826.20988-28-mszeredi@redhat.com> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180412150826.20988-1-mszeredi@redhat.com> References: <20180412150826.20988-1-mszeredi@redhat.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This reverts commit 7c6893e3c9abf6a9676e060a1e35e5caca673d57. Overlayfs no longer relies on the vfs for checking writability of files. Signed-off-by: Miklos Szeredi --- fs/internal.h | 2 -- fs/namespace.c | 64 +++------------------------------------------------------- fs/open.c | 4 ++-- fs/xattr.c | 9 ++++----- 4 files changed, 9 insertions(+), 70 deletions(-) diff --git a/fs/internal.h b/fs/internal.h index f0eaa33890d9..d7fdd56bafd3 100644 --- a/fs/internal.h +++ b/fs/internal.h @@ -72,10 +72,8 @@ extern void __init mnt_init(void); extern int __mnt_want_write(struct vfsmount *); extern int __mnt_want_write_file(struct file *); -extern int mnt_want_write_file_path(struct file *); extern void __mnt_drop_write(struct vfsmount *); extern void __mnt_drop_write_file(struct file *); -extern void mnt_drop_write_file_path(struct file *); /* * fs_struct.c diff --git a/fs/namespace.c b/fs/namespace.c index 9ec9bf74116b..e2645ef331f2 100644 --- a/fs/namespace.c +++ b/fs/namespace.c @@ -431,18 +431,13 @@ int __mnt_want_write_file(struct file *file) } /** - * mnt_want_write_file_path - get write access to a file's mount + * mnt_want_write_file - get write access to a file's mount * @file: the file who's mount on which to take a write * * This is like mnt_want_write, but it takes a file and can * do some optimisations if the file is open for write already - * - * Called by the vfs for cases when we have an open file at hand, but will do an - * inode operation on it (important distinction for files opened on overlayfs, - * since the file operations will come from the real underlying file, while - * inode operations come from the overlay). */ -int mnt_want_write_file_path(struct file *file) +int mnt_want_write_file(struct file *file) { int ret; @@ -452,53 +447,6 @@ int mnt_want_write_file_path(struct file *file) sb_end_write(file->f_path.mnt->mnt_sb); return ret; } - -static inline int may_write_real(struct file *file) -{ - struct dentry *dentry = file->f_path.dentry; - struct dentry *upperdentry; - - /* Writable file? */ - if (file->f_mode & FMODE_WRITER) - return 0; - - /* Not overlayfs? */ - if (likely(!(dentry->d_flags & DCACHE_OP_REAL))) - return 0; - - /* File refers to upper, writable layer? */ - upperdentry = d_real(dentry, NULL, 0, D_REAL_UPPER); - if (upperdentry && file_inode(file) == d_inode(upperdentry)) - return 0; - - /* Lower layer: can't write to real file, sorry... */ - return -EPERM; -} - -/** - * mnt_want_write_file - get write access to a file's mount - * @file: the file who's mount on which to take a write - * - * This is like mnt_want_write, but it takes a file and can - * do some optimisations if the file is open for write already - * - * Mostly called by filesystems from their ioctl operation before performing - * modification. On overlayfs this needs to check if the file is on a read-only - * lower layer and deny access in that case. - */ -int mnt_want_write_file(struct file *file) -{ - int ret; - - ret = may_write_real(file); - if (!ret) { - sb_start_write(file_inode(file)->i_sb); - ret = __mnt_want_write_file(file); - if (ret) - sb_end_write(file_inode(file)->i_sb); - } - return ret; -} EXPORT_SYMBOL_GPL(mnt_want_write_file); /** @@ -536,15 +484,9 @@ void __mnt_drop_write_file(struct file *file) __mnt_drop_write(file->f_path.mnt); } -void mnt_drop_write_file_path(struct file *file) -{ - mnt_drop_write(file->f_path.mnt); -} - void mnt_drop_write_file(struct file *file) { - __mnt_drop_write(file->f_path.mnt); - sb_end_write(file_inode(file)->i_sb); + mnt_drop_write(file->f_path.mnt); } EXPORT_SYMBOL(mnt_drop_write_file); diff --git a/fs/open.c b/fs/open.c index 442088ca30f9..00b1f18475ba 100644 --- a/fs/open.c +++ b/fs/open.c @@ -670,12 +670,12 @@ SYSCALL_DEFINE3(fchown, unsigned int, fd, uid_t, user, gid_t, group) if (!f.file) goto out; - error = mnt_want_write_file_path(f.file); + error = mnt_want_write_file(f.file); if (error) goto out_fput; audit_file(f.file); error = chown_common(&f.file->f_path, user, group); - mnt_drop_write_file_path(f.file); + mnt_drop_write_file(f.file); out_fput: fdput(f); out: diff --git a/fs/xattr.c b/fs/xattr.c index 61cd28ba25f3..78eaffbdbee0 100644 --- a/fs/xattr.c +++ b/fs/xattr.c @@ -23,7 +23,6 @@ #include #include -#include "internal.h" static const char * strcmp_prefix(const char *a, const char *a_prefix) @@ -503,10 +502,10 @@ SYSCALL_DEFINE5(fsetxattr, int, fd, const char __user *, name, if (!f.file) return error; audit_file(f.file); - error = mnt_want_write_file_path(f.file); + error = mnt_want_write_file(f.file); if (!error) { error = setxattr(f.file->f_path.dentry, name, value, size, flags); - mnt_drop_write_file_path(f.file); + mnt_drop_write_file(f.file); } fdput(f); return error; @@ -735,10 +734,10 @@ SYSCALL_DEFINE2(fremovexattr, int, fd, const char __user *, name) if (!f.file) return error; audit_file(f.file); - error = mnt_want_write_file_path(f.file); + error = mnt_want_write_file(f.file); if (!error) { error = removexattr(f.file->f_path.dentry, name); - mnt_drop_write_file_path(f.file); + mnt_drop_write_file(f.file); } fdput(f); return error; -- 2.14.3