Received: by 2002:ac0:aa62:0:0:0:0:0 with SMTP id w31-v6csp3200839ima; Tue, 23 Oct 2018 01:54:16 -0700 (PDT) X-Google-Smtp-Source: ACcGV62U9o9i3oK0h4x2Ezu2BK4os4lMVaqnM1UdNgFS3o4fyEjSMftGD3jbGEb7FWYMW9jQ43Y+ X-Received: by 2002:a62:3106:: with SMTP id x6-v6mr39351279pfx.154.1540284856870; Tue, 23 Oct 2018 01:54:16 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1540284856; cv=none; d=google.com; s=arc-20160816; b=fY6cHaXYLhenxZ9q6xvmhX9MOQEW6wzR9BnmRDW1QcGEUusxXAYx2CKmWSBtbfScHg 2MYhSZ6cV7DSDvwB6g+vsmZ/YPEaR7JgJFkhC/qSmNV6XgzOpFloK/V+unkggtHdlvfs KH3PLY5rO1i1euOYX4CodConuc7v61L1H0jZfDkPYMJHC0EYlQZBR7iez4MPOfTx71L+ 8yc1cS2DHknAKQtdp9q808gI6LrP/PjKAaTsuFny3sOcKdOS0joloF3sQLLTuDPgv/gi +TdOpOcRK/bou14usMT3u8WeIXRtooNAje48sMBvFErtWnPV7lg7ZGcb2qdwtLJ42trn TabA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from; bh=PdOXbNqI7ELDVYEvO2Zf5rzO8AOeOXeJBxqz23/q3PE=; b=MRI0WyhGixC/2LUamnYDvUYW3120fXLoLfB3xE9xSFCmnrayMc60XjKGHb8fRhejuh +V3j0L+931pegn9zNvJZojmd0P5cXF5hw5uSU4RgVZwiX+y0fiFHeWtQp4+bLIjxKzxY 27mXQwW0vHDqrKfI0jaCV+CSpUu4gAbIwdHwAfclWjX5lnmLZEou596S3xGT4wXBxqHW OlsKrocLBvvbqm2p5Zhba8rt4wOsiGIJrZCq/sR/uM2NYYcIyc3411uwUecCml/94teJ O4ukp9l9/b5RQ9fYrxraZ8WL1Oelin/JhxgCs+UeujQl2tcjEYB+FFrmGqEFxR6uyVvg /arQ== 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id w20-v6si627468plp.260.2018.10.23.01.54.01; Tue, 23 Oct 2018 01:54:16 -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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728006AbeJWRPm (ORCPT + 99 others); Tue, 23 Oct 2018 13:15:42 -0400 Received: from mx2.suse.de ([195.135.220.15]:33370 "EHLO mx1.suse.de" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1727602AbeJWRPm (ORCPT ); Tue, 23 Oct 2018 13:15:42 -0400 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay2.suse.de (unknown [195.135.220.254]) by mx1.suse.de (Postfix) with ESMTP id AADD1AD1A; Tue, 23 Oct 2018 08:53:15 +0000 (UTC) From: Luis Henriques To: "Yan, Zheng" , Sage Weil , Ilya Dryomov Cc: ceph-devel@vger.kernel.org, linux-kernel@vger.kernel.org, Luis Henriques Subject: [PATCH] ceph: add destination file data sync before doing any remote copy Date: Tue, 23 Oct 2018 09:53:14 +0100 Message-Id: <20181023085314.3561-1-lhenriques@suse.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org If we try to copy into a file that was just written, any data that is remote copied will be overwritten by our buffered writes once they are flushed. When this happens, the call to invalidate_inode_pages2_range will also return a -EBUSY error. This patch fixes this by also sync'ing the destination file before starting any copy. Signed-off-by: Luis Henriques --- fs/ceph/file.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/fs/ceph/file.c b/fs/ceph/file.c index f788496fafcc..b4607baa8969 100644 --- a/fs/ceph/file.c +++ b/fs/ceph/file.c @@ -1932,10 +1932,17 @@ static ssize_t ceph_copy_file_range(struct file *src_file, loff_t src_off, if (!prealloc_cf) return -ENOMEM; - /* Start by sync'ing the source file */ + /* Start by sync'ing the source and destination files */ ret = file_write_and_wait_range(src_file, src_off, (src_off + len)); - if (ret < 0) + if (ret < 0) { + dout("failed to write src file (%zd)\n", ret); + goto out; + } + ret = file_write_and_wait_range(dst_file, dst_off, (dst_off + len)); + if (ret < 0) { + dout("failed to write dst file (%zd)\n", ret); goto out; + } /* * We need FILE_WR caps for dst_ci and FILE_RD for src_ci as other