Commit c802ad9e authored by Eric Sandeen's avatar Eric Sandeen Committed by Theodore Ts'o
Browse files

Teach ext2fs_extent_delete() to remove an empty extent node from the tree


ext2fs_extent_delete() will also update the parent node and decrement
the inode block count.

Passing in the EXT2_EXTENT_DELETE_KEEP_EMPTY flag will allow the empty
node to remain.
Signed-off-by: default avatarEric Sandeen <sandeen@redhat.com>
Signed-off-by: default avatarTheodore Ts'o <tytso@mit.edu>
parent f4e9963c
......@@ -335,6 +335,11 @@ typedef struct ext2_extent_path *ext2_extent_path_t;
#define EXT2_EXTENT_INSERT_AFTER 0x0001 /* insert after handle loc'n */
#define EXT2_EXTENT_INSERT_NOSPLIT 0x0002 /* insert may not cause split */
/*
* Flags used by ext2fs_extent_delete()
*/
#define EXT2_EXTENT_DELETE_KEEP_EMPTY 0x001 /* keep node if last extnt gone */
/*
* Flags used by ext2fs_extent_set_bmap()
*/
......
......@@ -1261,8 +1261,7 @@ done:
return retval;
}
errcode_t ext2fs_extent_delete(ext2_extent_handle_t handle,
int flags EXT2FS_ATTR((unused)))
errcode_t ext2fs_extent_delete(ext2_extent_handle_t handle, int flags)
{
struct extent_path *path;
char *cp;
......@@ -1292,15 +1291,33 @@ errcode_t ext2fs_extent_delete(ext2_extent_handle_t handle,
ix--;
path->curr = ix;
}
path->entries--;
if (path->entries == 0)
if (--path->entries == 0)
path->curr = 0;
eh = (struct ext3_extent_header *) path->buf;
eh->eh_entries = ext2fs_cpu_to_le16(path->entries);
/* if non-root node has no entries left, remove it & parent ptr to it */
if (path->entries == 0 && handle->level) {
if (!(flags & EXT2_EXTENT_DELETE_KEEP_EMPTY)) {
struct ext2fs_extent extent;
retval = update_path(handle);
retval = ext2fs_extent_get(handle, EXT2_EXTENT_UP,
&extent);
if (retval)
return retval;
retval = ext2fs_extent_delete(handle, flags);
handle->inode->i_blocks -= handle->fs->blocksize / 512;
retval = ext2fs_write_inode_full(handle->fs,
handle->ino, handle->inode,
EXT2_INODE_SIZE(handle->fs->super));
ext2fs_block_alloc_stats(handle->fs, extent.e_pblk, -1);
}
} else {
eh = (struct ext3_extent_header *) path->buf;
eh->eh_entries = ext2fs_cpu_to_le16(path->entries);
if ((path->entries == 0) && (handle->level == 0))
eh->eh_depth = handle->max_depth = 0;
retval = update_path(handle);
}
return retval;
}
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment