From patchwork Sun Feb 17 16:27:53 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zheng Liu X-Patchwork-Id: 221073 Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 95EAB2C0079 for ; Mon, 18 Feb 2013 03:14:07 +1100 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751037Ab3BQQOG (ORCPT ); Sun, 17 Feb 2013 11:14:06 -0500 Received: from mail-da0-f53.google.com ([209.85.210.53]:40020 "EHLO mail-da0-f53.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751026Ab3BQQOF (ORCPT ); Sun, 17 Feb 2013 11:14:05 -0500 Received: by mail-da0-f53.google.com with SMTP id w3so2098605dad.40 for ; Sun, 17 Feb 2013 08:14:05 -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:in-reply-to :references; bh=q73XsC3o8G74fBqK2BykqTtBVrg5fXYck4R0rJPVdaE=; b=cpZ3AYTy5U7tpqojUnVZ8YA8LehuhZ+ptibImt4SgAWxWs85dNzKSXnFdB4Li2xuHr LYLHWWzSuUD6BOStzjipWzzB9l5+KukLU47pFCoT8tKIVL/IrYrEoFwE6gfNPoQx8LrH HSUSGVSMVs5frQBbMEZY9yOPl2pVPpzQhP0kizE9i7XrCfeR24NLqGjKuKq5d42UUjpX qpggHExMl3oeloCsqDQ29ZlJFNBXL2B75TYAoWDqjvzPVzssghPcYsVR18OaPuqvS6iu FsrWS3Qp2UugOHjYuCuNHc6wyvipDFpAIv3yMUc4+tRIs8nPHvS98492U23FODKnr/eB t3iw== X-Received: by 10.66.83.8 with SMTP id m8mr28902834pay.40.1361117645234; Sun, 17 Feb 2013 08:14:05 -0800 (PST) Received: from lz-desktop.taobao.ali.com ([182.92.247.2]) by mx.google.com with ESMTPS id qb10sm11481772pbb.43.2013.02.17.08.14.00 (version=TLSv1 cipher=RC4-SHA bits=128/128); Sun, 17 Feb 2013 08:14:04 -0800 (PST) From: Zheng Liu To: linux-ext4@vger.kernel.org Cc: Zheng Liu , "Theodore Ts'o" , Jan kara Subject: [PATCH 8/9] ext4: adjust some functions for reclaiming extents from extent status tree Date: Mon, 18 Feb 2013 00:27:53 +0800 Message-Id: <1361118474-18310-9-git-send-email-wenqing.lz@taobao.com> X-Mailer: git-send-email 1.7.12.rc2.18.g61b472e In-Reply-To: <1361118474-18310-1-git-send-email-wenqing.lz@taobao.com> References: <1361118474-18310-1-git-send-email-wenqing.lz@taobao.com> Sender: linux-ext4-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-ext4@vger.kernel.org From: Zheng Liu This commit changes some interfaces in extent status tree because we need to use inode to count the cached objects in a extent status tree. Signed-off-by: Zheng Liu Cc: "Theodore Ts'o" Cc: Jan kara --- fs/ext4/extents_status.c | 50 +++++++++++++++++++++++------------------------- 1 file changed, 24 insertions(+), 26 deletions(-) diff --git a/fs/ext4/extents_status.c b/fs/ext4/extents_status.c index 473a935..3021858 100644 --- a/fs/ext4/extents_status.c +++ b/fs/ext4/extents_status.c @@ -142,9 +142,8 @@ static struct kmem_cache *ext4_es_cachep; -static int __es_insert_extent(struct ext4_es_tree *tree, - struct extent_status *newes); -static int __es_remove_extent(struct ext4_es_tree *tree, ext4_lblk_t lblk, +static int __es_insert_extent(struct inode *inode, struct extent_status *newes); +static int __es_remove_extent(struct inode *inode, ext4_lblk_t lblk, ext4_lblk_t end); int __init ext4_init_es(void) @@ -285,7 +284,8 @@ out: } static struct extent_status * -ext4_es_alloc_extent(ext4_lblk_t lblk, ext4_lblk_t len, ext4_fsblk_t pblk) +ext4_es_alloc_extent(struct inode *inode, ext4_lblk_t lblk, ext4_lblk_t len, + ext4_fsblk_t pblk) { struct extent_status *es; es = kmem_cache_alloc(ext4_es_cachep, GFP_ATOMIC); @@ -297,7 +297,7 @@ ext4_es_alloc_extent(ext4_lblk_t lblk, ext4_lblk_t len, ext4_fsblk_t pblk) return es; } -static void ext4_es_free_extent(struct extent_status *es) +static void ext4_es_free_extent(struct inode *inode, struct extent_status *es) { kmem_cache_free(ext4_es_cachep, es); } @@ -326,8 +326,9 @@ static int ext4_es_can_be_merged(struct extent_status *es1, } static struct extent_status * -ext4_es_try_to_merge_left(struct ext4_es_tree *tree, struct extent_status *es) +ext4_es_try_to_merge_left(struct inode *inode, struct extent_status *es) { + struct ext4_es_tree *tree = &EXT4_I(inode)->i_es_tree; struct extent_status *es1; struct rb_node *node; @@ -339,7 +340,7 @@ ext4_es_try_to_merge_left(struct ext4_es_tree *tree, struct extent_status *es) if (ext4_es_can_be_merged(es1, es)) { es1->es_len += es->es_len; rb_erase(&es->rb_node, &tree->root); - ext4_es_free_extent(es); + ext4_es_free_extent(inode, es); es = es1; } @@ -347,8 +348,9 @@ ext4_es_try_to_merge_left(struct ext4_es_tree *tree, struct extent_status *es) } static struct extent_status * -ext4_es_try_to_merge_right(struct ext4_es_tree *tree, struct extent_status *es) +ext4_es_try_to_merge_right(struct inode *inode, struct extent_status *es) { + struct ext4_es_tree *tree = &EXT4_I(inode)->i_es_tree; struct extent_status *es1; struct rb_node *node; @@ -360,15 +362,15 @@ ext4_es_try_to_merge_right(struct ext4_es_tree *tree, struct extent_status *es) if (ext4_es_can_be_merged(es, es1)) { es->es_len += es1->es_len; rb_erase(node, &tree->root); - ext4_es_free_extent(es1); + ext4_es_free_extent(inode, es1); } return es; } -static int __es_insert_extent(struct ext4_es_tree *tree, - struct extent_status *newes) +static int __es_insert_extent(struct inode *inode, struct extent_status *newes) { + struct ext4_es_tree *tree = &EXT4_I(inode)->i_es_tree; struct rb_node **p = &tree->root.rb_node; struct rb_node *parent = NULL; struct extent_status *es; @@ -389,14 +391,14 @@ static int __es_insert_extent(struct ext4_es_tree *tree, ext4_es_is_unwritten(es)) ext4_es_store_pblock(es, newes->es_pblk); - es = ext4_es_try_to_merge_left(tree, es); + es = ext4_es_try_to_merge_left(inode, es); goto out; } p = &(*p)->rb_left; } else if (newes->es_lblk > ext4_es_end(es)) { if (ext4_es_can_be_merged(es, newes)) { es->es_len += newes->es_len; - es = ext4_es_try_to_merge_right(tree, es); + es = ext4_es_try_to_merge_right(inode, es); goto out; } p = &(*p)->rb_right; @@ -406,7 +408,7 @@ static int __es_insert_extent(struct ext4_es_tree *tree, } } - es = ext4_es_alloc_extent(newes->es_lblk, newes->es_len, + es = ext4_es_alloc_extent(inode, newes->es_lblk, newes->es_len, newes->es_pblk); if (!es) return -ENOMEM; @@ -430,7 +432,6 @@ int ext4_es_insert_extent(struct inode *inode, ext4_lblk_t lblk, ext4_lblk_t len, ext4_fsblk_t pblk, unsigned long long status) { - struct ext4_es_tree *tree; struct extent_status newes; ext4_lblk_t end = lblk + len - 1; int err = 0; @@ -447,11 +448,10 @@ int ext4_es_insert_extent(struct inode *inode, ext4_lblk_t lblk, trace_ext4_es_insert_extent(inode, &newes); write_lock(&EXT4_I(inode)->i_es_lock); - tree = &EXT4_I(inode)->i_es_tree; - err = __es_remove_extent(tree, lblk, end); + err = __es_remove_extent(inode, lblk, end); if (err != 0) goto error; - err = __es_insert_extent(tree, &newes); + err = __es_insert_extent(inode, &newes); error: write_unlock(&EXT4_I(inode)->i_es_lock); @@ -521,9 +521,10 @@ out: return found; } -static int __es_remove_extent(struct ext4_es_tree *tree, ext4_lblk_t lblk, - ext4_lblk_t end) +static int __es_remove_extent(struct inode *inode, ext4_lblk_t lblk, + ext4_lblk_t end) { + struct ext4_es_tree *tree = &EXT4_I(inode)->i_es_tree; struct rb_node *node; struct extent_status *es; struct extent_status orig_es; @@ -561,7 +562,7 @@ static int __es_remove_extent(struct ext4_es_tree *tree, ext4_lblk_t lblk, ext4_es_store_pblock(&newes, block); } ext4_es_store_status(&newes, ext4_es_status(&orig_es)); - err = __es_insert_extent(tree, &newes); + err = __es_insert_extent(inode, &newes); if (err) { es->es_lblk = orig_es.es_lblk; es->es_len = orig_es.es_len; @@ -590,7 +591,7 @@ static int __es_remove_extent(struct ext4_es_tree *tree, ext4_lblk_t lblk, while (es && ext4_es_end(es) <= end) { node = rb_next(&es->rb_node); rb_erase(&es->rb_node, &tree->root); - ext4_es_free_extent(es); + ext4_es_free_extent(inode, es); if (!node) { es = NULL; break; @@ -622,7 +623,6 @@ out: int ext4_es_remove_extent(struct inode *inode, ext4_lblk_t lblk, ext4_lblk_t len) { - struct ext4_es_tree *tree; ext4_lblk_t end; int err = 0; @@ -633,10 +633,8 @@ int ext4_es_remove_extent(struct inode *inode, ext4_lblk_t lblk, end = lblk + len - 1; BUG_ON(end < lblk); - tree = &EXT4_I(inode)->i_es_tree; - write_lock(&EXT4_I(inode)->i_es_lock); - err = __es_remove_extent(tree, lblk, end); + err = __es_remove_extent(inode, lblk, end); write_unlock(&EXT4_I(inode)->i_es_lock); ext4_es_print_tree(inode); return err;