Commit 5eb8a3fc authored by Hin-Tak Leung's avatar Hin-Tak Leung Committed by Jiri Slaby

hfs: fix B-tree corruption after insertion at position 0

commit b4cc0efe upstream.

Fix B-tree corruption when a new record is inserted at position 0 in the
node in hfs_brec_insert().

This is an identical change to the corresponding hfs b-tree code to Sergei
Antonov's "hfsplus: fix B-tree corruption after insertion at position 0",
to keep similar code paths in the hfs and hfsplus drivers in sync, where
appropriate.
Signed-off-by: default avatarHin-Tak Leung <htl10@users.sourceforge.net>
Cc: Sergei Antonov <saproj@gmail.com>
Cc: Joe Perches <joe@perches.com>
Reviewed-by: default avatarVyacheslav Dubeyko <slava@dubeyko.com>
Cc: Anton Altaparmakov <anton@tuxera.com>
Cc: Al Viro <viro@zeniv.linux.org.uk>
Cc: Christoph Hellwig <hch@infradead.org>
Cc: <stable@vger.kernel.org>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: default avatarJiri Slaby <jslaby@suse.cz>
parent 2081451c
...@@ -131,13 +131,16 @@ int hfs_brec_insert(struct hfs_find_data *fd, void *entry, int entry_len) ...@@ -131,13 +131,16 @@ int hfs_brec_insert(struct hfs_find_data *fd, void *entry, int entry_len)
hfs_bnode_write(node, entry, data_off + key_len, entry_len); hfs_bnode_write(node, entry, data_off + key_len, entry_len);
hfs_bnode_dump(node); hfs_bnode_dump(node);
if (new_node) { /*
/* update parent key if we inserted a key * update parent key if we inserted a key
* at the start of the first node * at the start of the node and it is not the new node
*/ */
if (!rec && new_node != node) if (!rec && new_node != node) {
hfs_brec_update_parent(fd); hfs_bnode_read_key(node, fd->search_key, data_off + size);
hfs_brec_update_parent(fd);
}
if (new_node) {
hfs_bnode_put(fd->bnode); hfs_bnode_put(fd->bnode);
if (!new_node->parent) { if (!new_node->parent) {
hfs_btree_inc_height(tree); hfs_btree_inc_height(tree);
...@@ -166,9 +169,6 @@ int hfs_brec_insert(struct hfs_find_data *fd, void *entry, int entry_len) ...@@ -166,9 +169,6 @@ int hfs_brec_insert(struct hfs_find_data *fd, void *entry, int entry_len)
goto again; goto again;
} }
if (!rec)
hfs_brec_update_parent(fd);
return 0; return 0;
} }
...@@ -366,6 +366,8 @@ static int hfs_brec_update_parent(struct hfs_find_data *fd) ...@@ -366,6 +366,8 @@ static int hfs_brec_update_parent(struct hfs_find_data *fd)
if (IS_ERR(parent)) if (IS_ERR(parent))
return PTR_ERR(parent); return PTR_ERR(parent);
__hfs_brec_find(parent, fd); __hfs_brec_find(parent, fd);
if (fd->record < 0)
return -ENOENT;
hfs_bnode_dump(parent); hfs_bnode_dump(parent);
rec = fd->record; rec = fd->record;
......
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