Received: by 2002:ac0:a5b6:0:0:0:0:0 with SMTP id m51-v6csp3469954imm; Tue, 29 May 2018 07:48:20 -0700 (PDT) X-Google-Smtp-Source: ADUXVKLFgvljiK3LR5TiwukiH36tmgoPFod2/5SkSVWw9uF60LD9o5e3a3hEzw3EMndqUFFi7zD/ X-Received: by 2002:a63:7b1e:: with SMTP id w30-v6mr10432447pgc.402.1527605300058; Tue, 29 May 2018 07:48:20 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1527605300; cv=none; d=google.com; s=arc-20160816; b=cyhWP1579aRobIQ2FNcyrRzBHCh22c5ZDlRcNNJGdWBQoPRwMfvBpYuGHYnLVffjwZ /ynMDR7ccYHxvDkr0s+XvXv1fDa8mGlP4u0I7YDunoFArF4N8ThkvmtDbSTBNU+D7EX/ MpwE0ipA/I4fU7jB+i0AzMQEQwazjbvhpmGaa672/cXC09hMx40I6wfV9JFg6FkBPkrZ /y7BiMxN+YcoyTXhjrQ5qGyTARRSAkrvFuTPITzg1snwqRp7TKRuqIFyEceBp+VN0j10 fBmVRObuelN/XCHqhw4qvV9UmVKliJi02SNOhg79atPORvm7dEmDwSHB69/Vi8OwS2BR esvA== 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=012N5M0SWdtwBO8c5/j/puuB27evw5GYpoxUhgnV6XQ=; b=NQy8zX38SFGnlvYB+wyLzCeGTrhUs34XaVeKDzNDoSDLSd/vGfBcR7ssdeSl6yApSG DFiI9iHZKGky4TpZCExcqESd+qQoUIucn/bJFwY7+jRhpQmGOYuprCjgv9GBmm0iRKB0 G6746j0h6wteU7+l1RIZiVCuuCHDkySqkvmCr5AAqqwBKvTXOV4IvY6z7FuJO/tF6Fq6 6UjsktqxeyOy+/ALVpIEqHo8WSYBe5ZvPNPMDYLuCmAdVkmQ35mPwvTfO7h9LuUhL2VA sr96/Shj0Fs0KyZTkf4Gjz0IsF1PRJfrdd3LfbBQvXEv/1IKZbKMZZ6Od6cxnCuAmkCn OfjQ== 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 a97-v6si2689576pla.552.2018.05.29.07.48.05; Tue, 29 May 2018 07:48:20 -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 S936696AbeE2Oqt (ORCPT + 99 others); Tue, 29 May 2018 10:46:49 -0400 Received: from mail-wr0-f171.google.com ([209.85.128.171]:32871 "EHLO mail-wr0-f171.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S936572AbeE2Oq2 (ORCPT ); Tue, 29 May 2018 10:46:28 -0400 Received: by mail-wr0-f171.google.com with SMTP id a15-v6so26012022wrm.0 for ; Tue, 29 May 2018 07:46:27 -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=012N5M0SWdtwBO8c5/j/puuB27evw5GYpoxUhgnV6XQ=; b=PuXQjjzpudA0QcbJq4QWpiEMy2MQkiZk/mHp1ihxSICXSJI9i2MWwQQIDJ/DiRKLTB 9lEpAlh7jUfU+1AjtQSRopmMsvdheDM8gCfwxkfvSbMJRQlg4dUjTizQOsUr0I53/61V /gQB7AeI0CmMizdyxDRrtWFB9OL6p3tqULsFTRcjXbfRabvWLvSgst9mZhats/JS4EkR K+Z5k+s8zgBOOZfvI7JmZIJ6tXF6n+R3/gD7a9eYcY4w5DmKnTy3BBuo5D/sb+i49Y9o 5IY3CVRHL+N4nhWHC/UFAeIMRNy2X35UTTdki8g6r1aFA88QP8+RFsS162GLeP19kgbP 5dqA== X-Gm-Message-State: ALKqPwe8m12ey6LY2ivYcIgAUlLBZIx3xOX8/UnPVZywR1mW39h+9KJ5 Qo1R+msWo/GSOxcVz4rGFx5Mjg== X-Received: by 2002:adf:b583:: with SMTP id c3-v6mr15170645wre.228.1527605187078; Tue, 29 May 2018 07:46:27 -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 n71-v6sm20942227wmi.14.2018.05.29.07.46.26 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Tue, 29 May 2018 07:46:26 -0700 (PDT) From: Miklos Szeredi To: linux-unionfs@vger.kernel.org Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH 10/28] ovl: Copy up meta inode data from lowest data inode Date: Tue, 29 May 2018 16:45:54 +0200 Message-Id: <20180529144612.16675-11-mszeredi@redhat.com> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180529144612.16675-1-mszeredi@redhat.com> References: <20180529144612.16675-1-mszeredi@redhat.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Vivek Goyal So far lower could not be a meta inode. So whenever it was time to copy up data of a meta inode, we could copy it up from top most lower dentry. But now lower itself can be a metacopy inode. That means data copy up needs to take place from a data inode in metacopy inode chain. Find lower data inode in the chain and use that for data copy up. Introduced a helper called ovl_path_lowerdata() to find the lower data inode chain. Signed-off-by: Vivek Goyal Reviewed-by: Amir Goldstein Signed-off-by: Miklos Szeredi --- fs/overlayfs/copy_up.c | 13 +++++++++---- fs/overlayfs/overlayfs.h | 1 + fs/overlayfs/util.c | 12 ++++++++++++ 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/fs/overlayfs/copy_up.c b/fs/overlayfs/copy_up.c index 7d01afd345e9..8c05e9ad9782 100644 --- a/fs/overlayfs/copy_up.c +++ b/fs/overlayfs/copy_up.c @@ -519,13 +519,14 @@ static int ovl_copy_up_inode(struct ovl_copy_up_ctx *c, struct dentry *temp) } if (S_ISREG(c->stat.mode) && !c->metacopy) { - struct path upperpath; + struct path upperpath, datapath; ovl_path_upper(c->dentry, &upperpath); BUG_ON(upperpath.dentry != NULL); upperpath.dentry = temp; - err = ovl_copy_up_data(&c->lowerpath, &upperpath, c->stat.size); + ovl_path_lowerdata(c->dentry, &datapath); + err = ovl_copy_up_data(&datapath, &upperpath, c->stat.size); if (err) return err; } @@ -706,14 +707,18 @@ static bool ovl_need_meta_copy_up(struct dentry *dentry, umode_t mode, /* Copy up data of an inode which was copied up metadata only in the past. */ static int ovl_copy_up_meta_inode_data(struct ovl_copy_up_ctx *c) { - struct path upperpath; + struct path upperpath, datapath; int err; ovl_path_upper(c->dentry, &upperpath); if (WARN_ON(upperpath.dentry == NULL)) return -EIO; - err = ovl_copy_up_data(&c->lowerpath, &upperpath, c->stat.size); + ovl_path_lowerdata(c->dentry, &datapath); + if (WARN_ON(datapath.dentry == NULL)) + return -EIO; + + err = ovl_copy_up_data(&datapath, &upperpath, c->stat.size); if (err) return err; diff --git a/fs/overlayfs/overlayfs.h b/fs/overlayfs/overlayfs.h index b1f6591b9af4..31795c041d61 100644 --- a/fs/overlayfs/overlayfs.h +++ b/fs/overlayfs/overlayfs.h @@ -217,6 +217,7 @@ bool ovl_dentry_weird(struct dentry *dentry); enum ovl_path_type ovl_path_type(struct dentry *dentry); void ovl_path_upper(struct dentry *dentry, struct path *path); void ovl_path_lower(struct dentry *dentry, struct path *path); +void ovl_path_lowerdata(struct dentry *dentry, struct path *path); enum ovl_path_type ovl_path_real(struct dentry *dentry, struct path *path); struct dentry *ovl_dentry_upper(struct dentry *dentry); struct dentry *ovl_dentry_lower(struct dentry *dentry); diff --git a/fs/overlayfs/util.c b/fs/overlayfs/util.c index ab9a8fae0f99..32ff67fa0bfb 100644 --- a/fs/overlayfs/util.c +++ b/fs/overlayfs/util.c @@ -164,6 +164,18 @@ void ovl_path_lower(struct dentry *dentry, struct path *path) } } +void ovl_path_lowerdata(struct dentry *dentry, struct path *path) +{ + struct ovl_entry *oe = dentry->d_fsdata; + + if (oe->numlower) { + path->mnt = oe->lowerstack[oe->numlower - 1].layer->mnt; + path->dentry = oe->lowerstack[oe->numlower - 1].dentry; + } else { + *path = (struct path) { }; + } +} + enum ovl_path_type ovl_path_real(struct dentry *dentry, struct path *path) { enum ovl_path_type type = ovl_path_type(dentry); -- 2.14.3