lkml.org 
[lkml]   [2008]   [Apr]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    SubjectHFS+: fix unlink of links
    -stable review patch.  If anyone has any objections, please let us know.
    ---------------------

    From: Roman Zippel <zippel@linux-m68k.org>

    upstream commit: 76b0c26af2736b7e5b87e6ed7ab63901483d5736

    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>
    Signed-off-by: Chris Wright <chrisw@sous-sol.org>
    ---
    fs/hfsplus/dir.c | 23 +++++++++++++++--------
    1 file changed, 15 insertions(+), 8 deletions(-)

    --- a/fs/hfsplus/dir.c
    +++ b/fs/hfsplus/dir.c
    @@ -340,16 +340,23 @@ static int hfsplus_unlink(struct inode *

    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);
    + 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
    - inode->i_flags |= S_DEAD;
    + hfsplus_delete_inode(inode);
    } else
    - clear_nlink(inode);
    + HFSPLUS_SB(sb).file_count--;
    inode->i_ctime = CURRENT_TIME_SEC;
    mark_inode_dirty(inode);

    --


    \
     
     \ /
      Last update: 2008-04-17 03:33    [W:0.023 / U:28.684 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site