hfs: fix B-tree corruption after insertion at position 0
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: Hin-Tak Leung <htl10@users.sourceforge.net> Cc: Sergei Antonov <saproj@gmail.com> Cc: Joe Perches <joe@perches.com> Reviewed-by: Vyacheslav 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: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
Родитель
7cb74be6fd
Коммит
b4cc0efea4
|
@ -131,13 +131,16 @@ skip:
|
||||||
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_bnode_read_key(node, fd->search_key, data_off + size);
|
||||||
hfs_brec_update_parent(fd);
|
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 @@ skip:
|
||||||
goto again;
|
goto again;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!rec)
|
|
||||||
hfs_brec_update_parent(fd);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -366,6 +366,8 @@ again:
|
||||||
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;
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче