Received: by 2002:a25:86ce:0:0:0:0:0 with SMTP id y14csp2187163ybm; Thu, 23 May 2019 12:48:08 -0700 (PDT) X-Google-Smtp-Source: APXvYqzTec43gBaPifEynAQsyGSLZiacF9cLNV+QWjInaB7lEeQXGUbOo5Bt704viAeGlGrDcz3Q X-Received: by 2002:a63:4815:: with SMTP id v21mr2453434pga.312.1558640888116; Thu, 23 May 2019 12:48:08 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1558640888; cv=none; d=google.com; s=arc-20160816; b=IQ0g5RwmdCe40pfK9SG2gUDGHl5OHjgHbmMdD/sivAeD7TUmX3gfpfrXNAcdAmPxNm P93s6G3fKJna4Nl480CkLRPBw+s9nA+r+JADjL0lMOhQ2XBYuVmVsBrl5jpl2EIpbHQx dpUZFXOHw3fMEASY+DkBQVPYdDZtflqr+GIVQBCynsJnQFUBw76fy30OogyrZ90gaake PoBGNuroene4o6BrSgN+qFLHBJFzMcp676Q4VyonEliEhGBAPs01DOpW0Iiwgguz+r8U Q65D4xUSLsholsTAEdw7OxPlZJJasd3NbmEZpVS+VINXoCkMAMpk25alCwQE/9mhBt8O ZYeA== 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 :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=ySKKZlc/5H5V9RqyZvuHP9E3P7Qr8T6qSqegP6xj1NY=; b=jJzpzX4AlQsdcLagnLOE4+5GLK5E2szRudh72hevDnU2xJYeWhWtbbCeEU1je29aUJ U9Hcy8TDvCNIJ8TcEa478xX234QXqqQZqZhJF3tW7H0F90sq71Jt9dS3iTNkWj6pMuMB v7g9rUsl0TsCPog9WpzlYMhEZJ8KFZVnzGL9HljM7WdW8uwsq1ZkNUdhGUyJ3zVd1zuJ JIbZObbNHepZHM5XM5qgY/sqtMUMrhFvEzWZyioOTmIzYUH1LIy+me1EVzOD0VlYnr5S +gMc/Q4p1yF1vH8tT2fB9nwLjD/cWT+QB6orHoT6D5k0yyOfBzyEERDX74AdU/qCLoLB BHBQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=l6G91ikz; 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 m189si578069pfm.17.2019.05.23.12.47.53; Thu, 23 May 2019 12:48:08 -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; dkim=pass header.i=@kernel.org header.s=default header.b=l6G91ikz; 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 S2388708AbfEWTOO (ORCPT + 99 others); Thu, 23 May 2019 15:14:14 -0400 Received: from mail.kernel.org ([198.145.29.99]:48166 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2388698AbfEWTON (ORCPT ); Thu, 23 May 2019 15:14:13 -0400 Received: from localhost (83-86-89-107.cable.dynamic.v4.ziggo.nl [83.86.89.107]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id A57072184E; Thu, 23 May 2019 19:14:11 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1558638852; bh=cmtK/sdqxsP3V+WBMc4cyAYKdWHqDGrsfVMsTV08nF8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=l6G91ikziQzPGcxEnhyVE2Q6w8Sd7yF+DP0uHE3L3Xnn8ZuPxutHez8ewII231dTU bf2HWd9bKpqWaxe3DzyzGL80k1rDqFit/IeT0Y0UsidIT3eJL3cCQljW7NTIzXBn6E UxdnjGCbSUD7/Rg5EPf1T/q+x30o9IYRmefDWA5w= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Nikolay Borisov , David Sterba Subject: [PATCH 4.14 77/77] btrfs: Honour FITRIM range constraints during free space trim Date: Thu, 23 May 2019 21:06:35 +0200 Message-Id: <20190523181730.581872705@linuxfoundation.org> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190523181719.982121681@linuxfoundation.org> References: <20190523181719.982121681@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Nikolay Borisov commit c2d1b3aae33605a61cbab445d8ae1c708ccd2698 upstream. Up until now trimming the freespace was done irrespective of what the arguments of the FITRIM ioctl were. For example fstrim's -o/-l arguments will be entirely ignored. Fix it by correctly handling those paramter. This requires breaking if the found freespace extent is after the end of the passed range as well as completing trim after trimming fstrim_range::len bytes. Fixes: 499f377f49f0 ("btrfs: iterate over unused chunk space in FITRIM") CC: stable@vger.kernel.org # 4.4+ Signed-off-by: Nikolay Borisov Reviewed-by: David Sterba Signed-off-by: David Sterba Signed-off-by: Greg Kroah-Hartman --- fs/btrfs/extent-tree.c | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c @@ -11058,9 +11058,9 @@ int btrfs_error_unpin_extent_range(struc * transaction. */ static int btrfs_trim_free_extents(struct btrfs_device *device, - u64 minlen, u64 *trimmed) + struct fstrim_range *range, u64 *trimmed) { - u64 start = 0, len = 0; + u64 start = range->start, len = 0; int ret; *trimmed = 0; @@ -11096,8 +11096,8 @@ static int btrfs_trim_free_extents(struc refcount_inc(&trans->use_count); spin_unlock(&fs_info->trans_lock); - ret = find_free_dev_extent_start(trans, device, minlen, start, - &start, &len); + ret = find_free_dev_extent_start(trans, device, range->minlen, + start, &start, &len); if (trans) btrfs_put_transaction(trans); @@ -11109,6 +11109,16 @@ static int btrfs_trim_free_extents(struc break; } + /* If we are out of the passed range break */ + if (start > range->start + range->len - 1) { + mutex_unlock(&fs_info->chunk_mutex); + ret = 0; + break; + } + + start = max(range->start, start); + len = min(range->len, len); + ret = btrfs_issue_discard(device->bdev, start, len, &bytes); up_read(&fs_info->commit_root_sem); mutex_unlock(&fs_info->chunk_mutex); @@ -11119,6 +11129,10 @@ static int btrfs_trim_free_extents(struc start += len; *trimmed += bytes; + /* We've trimmed enough */ + if (*trimmed >= range->len) + break; + if (fatal_signal_pending(current)) { ret = -ERESTARTSYS; break; @@ -11202,8 +11216,7 @@ int btrfs_trim_fs(struct btrfs_fs_info * mutex_lock(&fs_info->fs_devices->device_list_mutex); devices = &fs_info->fs_devices->devices; list_for_each_entry(device, devices, dev_list) { - ret = btrfs_trim_free_extents(device, range->minlen, - &group_trimmed); + ret = btrfs_trim_free_extents(device, range, &group_trimmed); if (ret) { dev_failed++; dev_ret = ret;