aboutsummaryrefslogtreecommitdiffstats
path: root/fs/hfsplus/hfsplus_fs.h
diff options
context:
space:
mode:
authorChristoph Hellwig <hch@tuxera.com>2010-10-14 09:54:28 -0400
committerChristoph Hellwig <hch@lst.de>2010-10-14 09:54:28 -0400
commitf6089ff87d309a8ddb7b0d4dd92a570f1b0f689b (patch)
tree9b2c6b43885899e055e7b64b88e12bf3759e3794 /fs/hfsplus/hfsplus_fs.h
parent13571a6977f821fab7d9c3cc5f75da52b7732e40 (diff)
hfsplus: fix link corruption
HFS implements hardlink by using indirect catalog entries that refer to a hidden directly. The link target is cached in the dev field in the HFS+ specific inode, which is also used for the device number for device files, and inside for passing the nlink value of the indirect node from hfsplus_cat_write_inode to a helper function. Now if we happen to write out the indirect node while hfsplus_link is creating the catalog entry we'll get a link pointing to the linkid of the current nlink value. This can easily be reproduced by a large enough loop of local git-clone operations. Stop abusing the dev field in the HFS+ inode for short term storage by refactoring the way the permission structure in the catalog entry is set up, and rename the dev field to linkid to avoid any confusion. While we're at it also prevent creating hard links to special files, as the HFS+ dev and linkid share the same space in the on-disk structure. Signed-off-by: Christoph Hellwig <hch@tuxera.com>
Diffstat (limited to 'fs/hfsplus/hfsplus_fs.h')
-rw-r--r--fs/hfsplus/hfsplus_fs.h8
1 files changed, 5 insertions, 3 deletions
diff --git a/fs/hfsplus/hfsplus_fs.h b/fs/hfsplus/hfsplus_fs.h
index 5cda96366acf..d92f590d6633 100644
--- a/fs/hfsplus/hfsplus_fs.h
+++ b/fs/hfsplus/hfsplus_fs.h
@@ -178,7 +178,11 @@ struct hfsplus_inode_info {
178 */ 178 */
179 struct inode *rsrc_inode; 179 struct inode *rsrc_inode;
180 __be32 create_date; 180 __be32 create_date;
181 u32 dev; 181
182 /*
183 * Protected by sbi->vh_mutex.
184 */
185 u32 linkid;
182 186
183 /* 187 /*
184 * Protected by i_mutex. 188 * Protected by i_mutex.
@@ -427,6 +431,4 @@ static inline struct hfsplus_inode_info *HFSPLUS_I(struct inode *inode)
427#define hfsp_ut2mt(t) __hfsp_ut2mt((t).tv_sec) 431#define hfsp_ut2mt(t) __hfsp_ut2mt((t).tv_sec)
428#define hfsp_now2mt() __hfsp_ut2mt(get_seconds()) 432#define hfsp_now2mt() __hfsp_ut2mt(get_seconds())
429 433
430#define kdev_t_to_nr(x) (x)
431
432#endif 434#endif