Received: by 2002:a25:1506:0:0:0:0:0 with SMTP id 6csp1412008ybv; Thu, 6 Feb 2020 03:39:14 -0800 (PST) X-Google-Smtp-Source: APXvYqxOUCgHPqFGXSPFp8cw8WZFvgONH+fg2hRPArIAWmbKyb0O3FfZzXrO9qnpBfn9N2Ds5tmn X-Received: by 2002:aca:6543:: with SMTP id j3mr6460135oiw.150.1580989153915; Thu, 06 Feb 2020 03:39:13 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1580989153; cv=none; d=google.com; s=arc-20160816; b=ekMGnwVqXERwg2Au/CNWX4hglcGQ+SNhnjIWo5fbr8PLRnNdtANS/Qkm1f7k9cd1eF 3ePkFxDBhYeaslXrHAlOC46rA2GK+Sp7hZ2Zp6jRTnvYGIkEVJBeDycbageXAd4lOYqV uvQC2v2XrfUa3peQ1R8IR40xbu68CyJS7a96Vjjoee4m4Om5tpe/jOnyn6hd1IIJySB2 Ig0tpKdPgnTzX+af7LOvA1PJ1nno7eQHj6JLPD1QrqwUJByZxxpCs5PSyodbYiRstvRu Jv/kDv0jnY3wRt3ASCEeDNJ3erKVct2/pomCHPOG/mdVlakYuawgw3HIDI8zpa/qvyFJ Hu8w== 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 :references:in-reply-to:message-id:date:subject:cc:to:from; bh=8/BzYmwEWW2SmRBdNU5kddiPxNT0kMQS5yFKt7kgwh8=; b=IqjKt2qhxGJIy2o7GeoRbtRW+w09yLJ+W4FniX7aJbAvdpRhPHcIZoMagcBnPtFZWB YJAAXcZPwqMvie9fSA4buHK5+rdIHsZNnz6JOcPR5IPP7xkxeyaIF8dSPei1TSMrV5dL xRilaWGJhpc3UZeC8WQaVdAUUyx66/ZcbmopcNmWqCThkgVo7xsATu0PUrzeNqAXDRCD E/dFroUYhjFz+gHjDcauqqVCR7UVpoxtl+AXNZPg3XRUU8tAqXjF/XLVCJO0F3ylLIkF Z16v50sorjc9KxYUwvLP9AhlMSht+wfN59msBzZN8f7AByyGyx59K2WvH7DJFLo6SV+N DY0w== 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 o25si1932874otk.28.2020.02.06.03.39.01; Thu, 06 Feb 2020 03:39:13 -0800 (PST) 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 S1728506AbgBFKin (ORCPT + 99 others); Thu, 6 Feb 2020 05:38:43 -0500 Received: from mx2.suse.de ([195.135.220.15]:41282 "EHLO mx2.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728368AbgBFKim (ORCPT ); Thu, 6 Feb 2020 05:38:42 -0500 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay2.suse.de (unknown [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 53E6BB159; Thu, 6 Feb 2020 10:38:40 +0000 (UTC) From: Luis Henriques To: Jeff Layton , Sage Weil , Ilya Dryomov , "Yan, Zheng" , Gregory Farnum Cc: ceph-devel@vger.kernel.org, linux-kernel@vger.kernel.org, Luis Henriques , stable@vger.kernel.org Subject: [PATCH v2] ceph: fix copy_file_range error path in short copies Date: Thu, 6 Feb 2020 10:38:42 +0000 Message-Id: <20200206103842.14936-1-lhenriques@suse.com> In-Reply-To: <20200205192414.GA27345@suse.com> References: <20200205192414.GA27345@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 When there's an error in the copying loop but some bytes have already been copied into the destination file, it is necessary to dirty the caps and eventually update the MDS with the file metadata (timestamps, size). This patch fixes this error path. Another issue this patch fixes is the destination file size being reported to the MDS. If we're on the error path but the amount of bytes written has already changed the destination file size, the offset to use is dst_off and not endoff. Cc: stable@vger.kernel.org Signed-off-by: Luis Henriques --- fs/ceph/file.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/fs/ceph/file.c b/fs/ceph/file.c index 11929d2bb594..f7f8cb6c243f 100644 --- a/fs/ceph/file.c +++ b/fs/ceph/file.c @@ -2104,9 +2104,16 @@ static ssize_t __ceph_copy_file_range(struct file *src_file, loff_t src_off, CEPH_OSD_OP_FLAG_FADVISE_DONTNEED, 0); if (err) { dout("ceph_osdc_copy_from returned %d\n", err); - if (!ret) + /* + * If we haven't done any copy yet, just exit with the + * error code; otherwise, return the number of bytes + * already copied, update metadata and dirty caps. + */ + if (!ret) { ret = err; - goto out_caps; + goto out_caps; + } + goto update_dst_inode; } len -= object_size; src_off += object_size; @@ -2118,16 +2125,17 @@ static ssize_t __ceph_copy_file_range(struct file *src_file, loff_t src_off, /* We still need one final local copy */ do_final_copy = true; +update_dst_inode: file_update_time(dst_file); inode_inc_iversion_raw(dst_inode); - if (endoff > size) { + if (dst_off > size) { int caps_flags = 0; /* Let the MDS know about dst file size change */ - if (ceph_quota_is_max_bytes_approaching(dst_inode, endoff)) + if (ceph_quota_is_max_bytes_approaching(dst_inode, dst_off)) caps_flags |= CHECK_CAPS_NODELAY; - if (ceph_inode_set_size(dst_inode, endoff)) + if (ceph_inode_set_size(dst_inode, dst_off)) caps_flags |= CHECK_CAPS_AUTHONLY; if (caps_flags) ceph_check_caps(dst_ci, caps_flags, NULL);