Received: by 2002:a25:4158:0:0:0:0:0 with SMTP id o85csp102107yba; Mon, 20 May 2019 05:44:50 -0700 (PDT) X-Google-Smtp-Source: APXvYqxTg98w75WLmeVOAwBNJx54dPP3/sN6YxXqqpAhMIGHK6b2LQlsPfmTO29s6r/aZfNhFPPC X-Received: by 2002:a63:fd0c:: with SMTP id d12mr75439641pgh.391.1558356290785; Mon, 20 May 2019 05:44:50 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1558356290; cv=none; d=google.com; s=arc-20160816; b=P3cEHnLWEBkXi/JIxduY82sSraWCxP8RTcQsZ9IPr84gflR0hPKrsQtND/tUkBINko BPzqo0ptr3AIc+ZJMjSBTXGdkG0XQgZZiEfwQgiXBxlYPpbNL0jJxIx5NjA8WqYPbj3+ CnDKFWQU/uSNly8ivetZ8W2aXgrMXJIfvO95wiASIynPyNUPBvXuaZtXuLNWTguVMfRB +dAMKgNBKM6m+Hh380RuNeMLu78d/6gKixHDuFMTu8B1L2vM9bg/cJc4l4zSDtHSSxJY w876zH+6C3U6UONuS8aBx/nqR6c1yp9tgqmbN8e6OJqc+bXqKjdtnGwlqDsSy2qLsUhk eUWw== 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=JCXlnQ6aBi/blzi4Xn/yq4Rn76Wv5ieXtJOMbbH6Xck=; b=ICtiQ6ArTn+m7inOHa6lfUqgKkl5bhrTl8ynoG7REZy/ZwmHyWr4nS4gPDEu//v6TC z2YyjnZE+YRxkkdzRt9eluoJpxzuYxnOcxddbiHNSotPDmT4TeTGg0cn3lgbUatg7yqf 6XPkiQ0Mks1f3gfQCroWtSQPdOrHQIfigkuFP3UEOSCqG/zWiyzaw1OtiijK7OADlYfS hA4bRkLduB+SEb7E4BiGGGdWY21BA+JhCNk8No3jj8mCv49OF7H3L0bldYlANKdI+Kqn ODzLXSJ9xddzHx+yCHodVkKC+70z079wUH+cJzw8kXLW99tu2EY1cYwJxtfG5+oDgWWy Keuw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=rkwMDcsH; 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 n1si16456004pgh.584.2019.05.20.05.44.36; Mon, 20 May 2019 05:44:50 -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=rkwMDcsH; 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 S2389135AbfETM3b (ORCPT + 99 others); Mon, 20 May 2019 08:29:31 -0400 Received: from mail.kernel.org ([198.145.29.99]:45574 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2389896AbfETM32 (ORCPT ); Mon, 20 May 2019 08:29:28 -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 E39D220675; Mon, 20 May 2019 12:29:26 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1558355367; bh=DBGX2oj/oOpoUbOD+YZNLeqUupMQg52GiLvBkERzb3w=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=rkwMDcsHprHvAAiQkCtcBIOqOMgJkzabhGvbDnoAaKbqzwQlBaMEUR+cUk/IlA9qU RLBjI4b4nHwtkpD8EZPTkzWfA3MpwjOyB48JE4wSAZQmu8+HFI5yuzcOmqV1Wgn/Fv 42B5nWike/A6wI3O7sqqTK0Sp+oFc0+XfgryeRVs= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Nikolay Borisov , David Sterba Subject: [PATCH 5.0 091/123] btrfs: Honour FITRIM range constraints during free space trim Date: Mon, 20 May 2019 14:14:31 +0200 Message-Id: <20190520115250.986341927@linuxfoundation.org> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190520115245.439864225@linuxfoundation.org> References: <20190520115245.439864225@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 @@ -11192,9 +11192,9 @@ int btrfs_error_unpin_extent_range(struc * held back allocations. */ 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; @@ -11237,8 +11237,8 @@ static int btrfs_trim_free_extents(struc if (!trans) up_read(&fs_info->commit_root_sem); - 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) { up_read(&fs_info->commit_root_sem); btrfs_put_transaction(trans); @@ -11251,6 +11251,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); mutex_unlock(&fs_info->chunk_mutex); @@ -11260,6 +11270,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; @@ -11343,8 +11357,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;