From patchwork Wed Feb 27 11:16:57 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Wang Shilong X-Patchwork-Id: 2192901 Return-Path: X-Original-To: patchwork-linux-btrfs@patchwork.kernel.org Delivered-To: patchwork-process-083081@patchwork2.kernel.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by patchwork2.kernel.org (Postfix) with ESMTP id 5CAF6DF2F2 for ; Wed, 27 Feb 2013 11:17:08 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1758593Ab3B0LRE (ORCPT ); Wed, 27 Feb 2013 06:17:04 -0500 Received: from mail-pa0-f43.google.com ([209.85.220.43]:47010 "EHLO mail-pa0-f43.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1758543Ab3B0LRD (ORCPT ); Wed, 27 Feb 2013 06:17:03 -0500 Received: by mail-pa0-f43.google.com with SMTP id bh2so373228pad.30 for ; Wed, 27 Feb 2013 03:17:02 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=x-received:from:to:cc:subject:date:message-id:x-mailer; bh=b0at73/rubBrr4Bh1XdH0nDRtNM82F2krEh4wDGiJqQ=; b=rKd1+yIdKR1BL6JrlRwabQ73S99pTtN16+F4a8NvZ6y6YDyzX3AVRo9hSlgTV01Xao Zg8ucTXamB9IV0rHSq8eFJCeKx4RUwmUY6YuWg81z+MySrDfRFqkXo/h2XYSBgLIjJCp 0qb2AJd8sT2GmnT5BLzBaClN2OFgBiW6212aiyBj+V1fqz3GJ16jUxE87M8Zk+7BDlzZ LkxaL+SS8r08+U0zoabtm8W3UsVV86TE4odNSMwanfIzhZ1xTnvRTkHqQcBuafVYHbW4 4ZLuP9kLDdvJlDs/A7PftyL2j6PMBPryGpe7SPREaP68QqXEZKJ1Y8qpd1M4XyE0CzA0 vkTw== X-Received: by 10.67.22.103 with SMTP id hr7mr4245552pad.2.1361963822143; Wed, 27 Feb 2013 03:17:02 -0800 (PST) Received: from localhost.localdomain ([112.23.170.203]) by mx.google.com with ESMTPS id mz8sm1713321pbc.9.2013.02.27.03.16.59 (version=TLSv1 cipher=RC4-SHA bits=128/128); Wed, 27 Feb 2013 03:17:01 -0800 (PST) From: Wang Shilong To: linux-btrfs@vger.kernel.org Cc: wangshilong1991@gmail.com, miaox@cn.fujitsu.com, sensille@gmx.net Subject: [PATCH 1/3] Btrfs: fix missing deleted items in btrfs_clean_quota_tree Date: Wed, 27 Feb 2013 19:16:57 +0800 Message-Id: <1361963817-2283-1-git-send-email-wangshilong1991@gmail.com> X-Mailer: git-send-email 1.7.11.7 Sender: linux-btrfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org From: Wang Shilong Steps to reproduce: i=0 ncases=100 mkfs.btrfs mount btrfs quota enable btrfs qgroup create 2/1 while [ $i -le $ncases ] do btrfs qgroup create 1/$i btrfs qgroup assign 1/$i 2/1 i=$(($i+1)) done btrfs quota disable umount btrfsck You can also use the commands: btrfs-debug-tree | grep QGROUP You will find there are still items existed.The reasons why this happens is because the original code just checks slots[0]==0 and returns. We try to fix it by deleting the leaf one by one. Signed-off-by: Wang Shilong Signed-off-by: Miao Xie --- fs/btrfs/qgroup.c | 34 +++++++++++++++++++++------------- 1 files changed, 21 insertions(+), 13 deletions(-) diff --git a/fs/btrfs/qgroup.c b/fs/btrfs/qgroup.c index 88ab785..f011d9b 100644 --- a/fs/btrfs/qgroup.c +++ b/fs/btrfs/qgroup.c @@ -732,7 +732,9 @@ static int btrfs_clean_quota_tree(struct btrfs_trans_handle *trans, { struct btrfs_path *path; struct btrfs_key key; + struct extent_buffer *leaf = NULL; int ret; + int nr = 0; if (!root) return -EINVAL; @@ -741,24 +743,30 @@ static int btrfs_clean_quota_tree(struct btrfs_trans_handle *trans, if (!path) return -ENOMEM; - while (1) { - key.objectid = 0; - key.offset = 0; - key.type = 0; + path->leave_spinning = 1; - path->leave_spinning = 1; + key.objectid = 0; + key.offset = 0; + key.type = 0; + + while (1) { ret = btrfs_search_slot(trans, root, &key, path, -1, 1); - if (ret > 0) { - if (path->slots[0] == 0) - break; - path->slots[0]--; - } else if (ret < 0) { + if (ret < 0) + goto out; + leaf = path->nodes[0]; + nr = btrfs_header_nritems(leaf); + if (!nr) break; - } - - ret = btrfs_del_item(trans, root, path); + /* + * delete the leaf one by one + * since the whole tree is going + * to be deleted. + */ + path->slots[0] = 0; + ret = btrfs_del_items(trans, root, path, 0, nr); if (ret) goto out; + btrfs_release_path(path); } ret = 0;