mirror of
https://github.com/adulau/aha.git
synced 2024-12-27 11:16:11 +00:00
HFS+: fix unlink of links
Some time ago while attempting to handle invalid link counts, I botched the unlink of links itself, so this patch fixes this now correctly, so that only the link count of nodes that don't point to links is ignored. Thanks to Vlado Plaga <rechner@vlado-do.de> to notify me of this problem. Signed-off-by: Roman Zippel <zippel@linux-m68k.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
f4be31ec96
commit
76b0c26af2
1 changed files with 16 additions and 9 deletions
|
@ -340,16 +340,23 @@ static int hfsplus_unlink(struct inode *dir, struct dentry *dentry)
|
|||
|
||||
if (inode->i_nlink > 0)
|
||||
drop_nlink(inode);
|
||||
hfsplus_delete_inode(inode);
|
||||
if (inode->i_ino != cnid && !inode->i_nlink) {
|
||||
if (!atomic_read(&HFSPLUS_I(inode).opencnt)) {
|
||||
res = hfsplus_delete_cat(inode->i_ino, HFSPLUS_SB(sb).hidden_dir, NULL);
|
||||
if (!res)
|
||||
hfsplus_delete_inode(inode);
|
||||
} else
|
||||
inode->i_flags |= S_DEAD;
|
||||
} else
|
||||
if (inode->i_ino == cnid)
|
||||
clear_nlink(inode);
|
||||
if (!inode->i_nlink) {
|
||||
if (inode->i_ino != cnid) {
|
||||
HFSPLUS_SB(sb).file_count--;
|
||||
if (!atomic_read(&HFSPLUS_I(inode).opencnt)) {
|
||||
res = hfsplus_delete_cat(inode->i_ino,
|
||||
HFSPLUS_SB(sb).hidden_dir,
|
||||
NULL);
|
||||
if (!res)
|
||||
hfsplus_delete_inode(inode);
|
||||
} else
|
||||
inode->i_flags |= S_DEAD;
|
||||
} else
|
||||
hfsplus_delete_inode(inode);
|
||||
} else
|
||||
HFSPLUS_SB(sb).file_count--;
|
||||
inode->i_ctime = CURRENT_TIME_SEC;
|
||||
mark_inode_dirty(inode);
|
||||
|
||||
|
|
Loading…
Reference in a new issue