diff options
author | Sergei Antonov <saproj@gmail.com> | 2014-06-06 14:36:28 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2014-06-06 16:08:10 -0700 |
commit | 2cd282a1bc6b9d111b8beee63bea0af735a8a1aa (patch) | |
tree | 80dff1bb5f089868bdbee433b0308098b2c2e6b4 /fs/hfsplus/hfsplus_fs.h | |
parent | 915ab236d3c491f9bb0f6596d03e25b37f4d5a20 (diff) | |
download | talos-obmc-linux-2cd282a1bc6b9d111b8beee63bea0af735a8a1aa.tar.gz talos-obmc-linux-2cd282a1bc6b9d111b8beee63bea0af735a8a1aa.zip |
hfsplus: fix "unused node is not erased" error
Zero newly allocated extents in the catalog tree if volume attributes
tell us to. Not doing so we risk getting the "unused node is not
erased" error. See kHFSUnusedNodeFix flag in Apple's source code for
reference.
There was a previous commit clearing the node when it is freed: commit
899bed05e9f6 ("hfsplus: fix issue with unzeroed unused b-tree nodes").
But it did not handle newly allocated extents (this patch fixes it).
And it zeroed nodes in all trees unconditionally which is an overkill.
This patch adds a condition and also switches to 'tree->node_size' as a
simpler method of getting the length to zero.
Signed-off-by: Sergei Antonov <saproj@gmail.com>
Cc: Anton Altaparmakov <aia21@cam.ac.uk>
Cc: Al Viro <viro@zeniv.linux.org.uk>
Cc: Christoph Hellwig <hch@infradead.org>
Cc: Vyacheslav Dubeyko <slava@dubeyko.com>
Cc: Hin-Tak Leung <htl10@users.sourceforge.net>
Cc: Kyle Laracey <kalaracey@gmail.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'fs/hfsplus/hfsplus_fs.h')
-rw-r--r-- | fs/hfsplus/hfsplus_fs.h | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/fs/hfsplus/hfsplus_fs.h b/fs/hfsplus/hfsplus_fs.h index 6c08ff6b11b2..d5ab79bd2f0f 100644 --- a/fs/hfsplus/hfsplus_fs.h +++ b/fs/hfsplus/hfsplus_fs.h @@ -414,6 +414,7 @@ void hfs_bnode_free(struct hfs_bnode *); struct hfs_bnode *hfs_bnode_create(struct hfs_btree *, u32); void hfs_bnode_get(struct hfs_bnode *); void hfs_bnode_put(struct hfs_bnode *); +bool hfs_bnode_need_zeroout(struct hfs_btree *); /* brec.c */ u16 hfs_brec_lenoff(struct hfs_bnode *, u16, u16 *); @@ -460,7 +461,7 @@ int hfsplus_ext_write_extent(struct inode *); int hfsplus_get_block(struct inode *, sector_t, struct buffer_head *, int); int hfsplus_free_fork(struct super_block *, u32, struct hfsplus_fork_raw *, int); -int hfsplus_file_extend(struct inode *); +int hfsplus_file_extend(struct inode *, bool zeroout); void hfsplus_file_truncate(struct inode *); /* inode.c */ |