[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <1319821210-7374-3-git-send-email-dmonakhov@openvz.org>
Date: Fri, 28 Oct 2011 21:00:05 +0400
From: Dmitry Monakhov <dmonakhov@...nvz.org>
To: linux-ext4@...r.kernel.org
Cc: achender@...ux.vnet.ibm.com, tytso@....edu,
Dmitry Monakhov <dmonakhov@...nvz.org>
Subject: [PATCH 2/7] ext4: move inode indepth shrink logic to didicated function
- add ext4_ext_try_shrink helper
- ext4_mark_inode_dirty() called externally in order to allow
caller to butch several inode updates in to one mark_dirty call.
Signed-off-by: Dmitry Monakhov <dmonakhov@...nvz.org>
---
fs/ext4/extents.c | 59 ++++++++++++++++++++++------------------------------
1 files changed, 25 insertions(+), 34 deletions(-)
diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c
index eae9680..6e3ce38 100644
--- a/fs/ext4/extents.c
+++ b/fs/ext4/extents.c
@@ -2496,6 +2496,22 @@ ext4_ext_more_to_rm(struct ext4_ext_path *path)
return 1;
}
+static int ext4_ext_try_shrink(handle_t *handle, struct inode *inode)
+{
+ /* TODO: flexible tree reduction should be here */
+ if (ext_depth(inode) && ext_inode_hdr(inode)->eh_entries == 0) {
+ /*
+ * truncate to zero freed all the tree,
+ * so we need to correct eh_depth
+ */
+ ext_inode_hdr(inode)->eh_depth = 0;
+ ext_inode_hdr(inode)->eh_max =
+ cpu_to_le16(ext4_ext_space_root(inode, 0));
+ return 1;
+ }
+ return 0;
+}
+
static int ext4_ext_remove_space(struct inode *inode, ext4_lblk_t start)
{
struct super_block *sb = inode->i_sb;
@@ -2503,7 +2519,7 @@ static int ext4_ext_remove_space(struct inode *inode, ext4_lblk_t start)
struct ext4_ext_path *path;
ext4_fsblk_t partial_cluster = 0;
handle_t *handle;
- int i, err;
+ int i, err, err2;
ext_debug("truncate since %u\n", start);
@@ -2629,29 +2645,18 @@ again:
EXT4_SB(sb)->s_cluster_ratio, flags);
partial_cluster = 0;
}
-
- /* TODO: flexible tree reduction should be here */
- if (path->p_hdr->eh_entries == 0) {
- /*
- * truncate to zero freed all the tree,
- * so we need to correct eh_depth
- */
- err = ext4_ext_get_access(handle, inode, path);
- if (err == 0) {
- ext_inode_hdr(inode)->eh_depth = 0;
- ext_inode_hdr(inode)->eh_max =
- cpu_to_le16(ext4_ext_space_root(inode, 0));
- err = ext4_ext_dirty(handle, inode, path);
- }
- }
+ if(ext4_ext_try_shrink(handle, inode))
+ err2 = ext4_mark_inode_dirty(handle, inode);
+ if (!err)
+ err = err2;
out:
ext4_ext_drop_refs(path);
kfree(path);
if (err == -EAGAIN)
goto again;
- ext4_journal_stop(handle);
+ err2 = ext4_journal_stop(handle);
- return err;
+ return err ? err : err2;
}
/*
@@ -3895,22 +3900,8 @@ int ext4_ext_map_blocks(handle_t *handle, struct inode *inode,
&partial_cluster, map->m_lblk,
map->m_lblk + punched_out);
- if (!err && path->p_hdr->eh_entries == 0) {
- /*
- * Punch hole freed all of this sub tree,
- * so we need to correct eh_depth
- */
- err = ext4_ext_get_access(handle, inode, path);
- if (err == 0) {
- ext_inode_hdr(inode)->eh_depth = 0;
- ext_inode_hdr(inode)->eh_max =
- cpu_to_le16(ext4_ext_space_root(
- inode, 0));
-
- err = ext4_ext_dirty(
- handle, inode, path);
- }
- }
+ if (!err && ext4_ext_try_shrink(handle, inode))
+ err = ext4_mark_inode_dirty(handle, inode);
goto out2;
}
--
1.7.1
--
To unsubscribe from this list: send the line "unsubscribe linux-ext4" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Powered by blists - more mailing lists