]> git.karo-electronics.de Git - mv-sheeva.git/commitdiff
hfsplus: fix error handling in hfsplus_symlink
authorChristoph Hellwig <hch@tuxera.com>
Fri, 1 Oct 2010 03:43:54 +0000 (05:43 +0200)
committerChristoph Hellwig <hch@lst.de>
Fri, 1 Oct 2010 03:43:54 +0000 (05:43 +0200)
We need to free the inode again on a hfsplus_create_cat failure.

Signed-off-by: Christoph Hellwig <hch@tuxera.com>
fs/hfsplus/dir.c

index 7efcf75ea73a78d76290f82961d51e962b7c2fd8..f8ae468f4ab6caebb5c31e20126059b2311c0dc8 100644 (file)
@@ -364,31 +364,29 @@ static int hfsplus_rmdir(struct inode *dir, struct dentry *dentry)
 static int hfsplus_symlink(struct inode *dir, struct dentry *dentry,
                           const char *symname)
 {
-       struct super_block *sb;
        struct inode *inode;
        int res;
 
-       sb = dir->i_sb;
-       inode = hfsplus_new_inode(sb, S_IFLNK | S_IRWXUGO);
+       inode = hfsplus_new_inode(dir->i_sb, S_IFLNK | S_IRWXUGO);
        if (!inode)
                return -ENOSPC;
 
        res = page_symlink(inode, symname, strlen(symname) + 1);
-       if (res) {
-               inode->i_nlink = 0;
-               hfsplus_delete_inode(inode);
-               iput(inode);
-               return res;
-       }
+       if (res)
+               goto out_err;
 
-       mark_inode_dirty(inode);
        res = hfsplus_create_cat(inode->i_ino, dir, &dentry->d_name, inode);
+       if (res)
+               goto out_err;
 
-       if (!res) {
-               hfsplus_instantiate(dentry, inode, inode->i_ino);
-               mark_inode_dirty(inode);
-       }
+       hfsplus_instantiate(dentry, inode, inode->i_ino);
+       mark_inode_dirty(inode);
+       return 0;
 
+out_err:
+       inode->i_nlink = 0;
+       hfsplus_delete_inode(inode);
+       iput(inode);
        return res;
 }