Re: [PATCH v2] ext4:Teach ext4_ext_split to caculate extents efficiently.
From: Ted Ts'o <tytso@mit.edu>
Date: 2011-05-24 21:07:25
On Mon, May 23, 2011 at 05:30:57PM +0800, Yongqiang Yang wrote:
quoted hunk ↗ jump to hunk
@@ -982,20 +997,13 @@ static int ext4_ext_split(handle_t *handle, struct inode *inode, err = -EIO; goto cleanup; } - while (path[i].p_idx <= EXT_MAX_INDEX(path[i].p_hdr)) { - ext_debug("%d: move %d:%llu in new index %llu\n", i, - le32_to_cpu(path[i].p_idx->ei_block), - ext4_idx_pblock(path[i].p_idx), - newblock); - /*memmove(++fidx, path[i].p_idx++, - sizeof(struct ext4_extent_idx)); - neh->eh_entries++; - BUG_ON(neh->eh_entries > neh->eh_max);*/ - path[i].p_idx++; - m++; - } + /* start copy indexes */ + m = EXT_MAX_INDEX(path[i].p_hdr) - path[i].p_idx++; + ext_debug("cur 0x%p, last 0x%p\n", path[i].p_idx, + EXT_MAX_INDEX(path[i].p_hdr)); + ext4_ext_show_move(inode, path, newblock, i); if (m) { - memmove(++fidx, path[i].p_idx - m, + memmove(++fidx, path[i].p_idx, sizeof(struct ext4_extent_idx) * m); le16_add_cpu(&neh->eh_entries, m); }
So the old code mutates path[i].p_idx, where as your new code doesn't. The one thing that scares me is that ext4_ext_insert_index() is passed &path[at], the function preferences path[at].p_idx. Have you looked at this case? - Ted