| From d1ce1b8b0edf4f3a620bd522fd1337e674b407b1 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 30 Oct 2018 15:06:04 -0700 |
| Subject: hfsplus: fix BUG on bnode parent update |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| From: Ernesto A. Fernández <ernesto.mnd.fernandez@gmail.com> |
| |
| [ Upstream commit 19a9d0f1acf75e8be8cfba19c1a34e941846fa2b ] |
| |
| Creating, renaming or deleting a file may hit BUG_ON() if the first |
| record of both a leaf node and its parent are changed, and if this |
| forces the parent to be split. This bug is triggered by xfstests |
| generic/027, somewhat rarely; here is a more reliable reproducer: |
| |
| truncate -s 50M fs.iso |
| mkfs.hfsplus fs.iso |
| mount fs.iso /mnt |
| i=1000 |
| while [ $i -le 2400 ]; do |
| touch /mnt/$i &>/dev/null |
| ((++i)) |
| done |
| i=2400 |
| while [ $i -ge 1000 ]; do |
| mv /mnt/$i /mnt/$(perl -e "print $i x61") &>/dev/null |
| ((--i)) |
| done |
| |
| The issue is that a newly created bnode is being put twice. Reset |
| new_node to NULL in hfs_brec_update_parent() before reaching goto again. |
| |
| Link: http://lkml.kernel.org/r/5ee1db09b60373a15890f6a7c835d00e76bf601d.1535682461.git.ernesto.mnd.fernandez@gmail.com |
| Signed-off-by: Ernesto A. Fernández <ernesto.mnd.fernandez@gmail.com> |
| Cc: Christoph Hellwig <hch@infradead.org> |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| fs/hfsplus/brec.c | 1 + |
| 1 file changed, 1 insertion(+) |
| |
| diff --git a/fs/hfsplus/brec.c b/fs/hfsplus/brec.c |
| index aa17a392b4140..1918544a78716 100644 |
| --- a/fs/hfsplus/brec.c |
| +++ b/fs/hfsplus/brec.c |
| @@ -449,6 +449,7 @@ static int hfs_brec_update_parent(struct hfs_find_data *fd) |
| /* restore search_key */ |
| hfs_bnode_read_key(node, fd->search_key, 14); |
| } |
| + new_node = NULL; |
| } |
| |
| if (!rec && node->parent) |
| -- |
| 2.20.1 |
| |