diff options
author | Vyacheslav Dubeyko <slava@dubeyko.com> | 2013-02-27 20:03:06 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2013-02-27 22:10:10 -0500 |
commit | 899bed05e9f6bbb21776f9ebd88f5631987f987a (patch) | |
tree | 3bf5ddc222085ac01f04080b0b307dd69d3f004a /fs/hfsplus/bnode.c | |
parent | 324ef39a8a4f693035d63527f16100ed27310ecc (diff) |
hfsplus: fix issue with unzeroed unused b-tree nodes
The fsck_hfs (under MacOS X) complains about unzeroed unused b-tree nodes
after deletion of folders' tree under Linux.
SYMPTOMS:
Running Disk Utiltiy's "Verify Disk" on "test" gives the following:
Verifying volume “Test”
Checking file systemChecking Journaled HFS Plus volume.
Checking extents overflow file.
Checking catalog file.
Unused node is not erased (node = 3111)
Checking multi-linked files.
Checking catalog hierarchy.
Checking extended attributes file.
Checking volume bitmap.
Checking volume information.
The volume Test was found corrupt and needs to be repaired.
Error: This disk needs to be repaired. Click Repair Disk.
REPRODUCING PATH:
1. Prepare HFS+ (non-case sensitive) partition (for example, 5GB)
under MacOS X.
2. Copy linux kernel source tree (for example, 3.7-rc6 version) on
this partition under MacOS X.
3. Then switch to Linux and mount this prepared partition.
4. Execute `sudo rm -r` under prepared directory with linux kernel
source tree.
5. Unmount and boot back into OS X.
6. Open up Disk Utility and verify partition.
REPRODUCIBILITY: 100%
FIX:
It is added code of node clearing in hfs_bnode_put() method for the case
when node has flag HFS_BNODE_DELETED.
Signed-off-by: Vyacheslav Dubeyko <slava@dubeyko.com>
Reported-by: Kyle Laracey <kalaracey@gmail.com>
Acked-by: Hin-Tak Leung <htl10@users.sourceforge.net>
Cc: Al Viro <viro@zeniv.linux.org.uk>
Cc: Christoph Hellwig <hch@lst.de>
Cc: Jan Kara <jack@suse.cz>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'fs/hfsplus/bnode.c')
-rw-r--r-- | fs/hfsplus/bnode.c | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/fs/hfsplus/bnode.c b/fs/hfsplus/bnode.c index 5c125ce6bd72..f31ac6f404f1 100644 --- a/fs/hfsplus/bnode.c +++ b/fs/hfsplus/bnode.c | |||
@@ -648,6 +648,8 @@ void hfs_bnode_put(struct hfs_bnode *node) | |||
648 | if (test_bit(HFS_BNODE_DELETED, &node->flags)) { | 648 | if (test_bit(HFS_BNODE_DELETED, &node->flags)) { |
649 | hfs_bnode_unhash(node); | 649 | hfs_bnode_unhash(node); |
650 | spin_unlock(&tree->hash_lock); | 650 | spin_unlock(&tree->hash_lock); |
651 | hfs_bnode_clear(node, 0, | ||
652 | PAGE_CACHE_SIZE * tree->pages_per_bnode); | ||
651 | hfs_bmap_free(node); | 653 | hfs_bmap_free(node); |
652 | hfs_bnode_free(node); | 654 | hfs_bnode_free(node); |
653 | return; | 655 | return; |