aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
Diffstat (limited to 'fs')
-rw-r--r--fs/ext4/namei.c20
1 files changed, 11 insertions, 9 deletions
diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c
index efb64aee5b9e..23a0b9bf822d 100644
--- a/fs/ext4/namei.c
+++ b/fs/ext4/namei.c
@@ -1864,7 +1864,7 @@ static int ext4_add_entry(handle_t *handle, struct dentry *dentry,
1864 struct inode *inode) 1864 struct inode *inode)
1865{ 1865{
1866 struct inode *dir = dentry->d_parent->d_inode; 1866 struct inode *dir = dentry->d_parent->d_inode;
1867 struct buffer_head *bh; 1867 struct buffer_head *bh = NULL;
1868 struct ext4_dir_entry_2 *de; 1868 struct ext4_dir_entry_2 *de;
1869 struct ext4_dir_entry_tail *t; 1869 struct ext4_dir_entry_tail *t;
1870 struct super_block *sb; 1870 struct super_block *sb;
@@ -1888,14 +1888,14 @@ static int ext4_add_entry(handle_t *handle, struct dentry *dentry,
1888 return retval; 1888 return retval;
1889 if (retval == 1) { 1889 if (retval == 1) {
1890 retval = 0; 1890 retval = 0;
1891 return retval; 1891 goto out;
1892 } 1892 }
1893 } 1893 }
1894 1894
1895 if (is_dx(dir)) { 1895 if (is_dx(dir)) {
1896 retval = ext4_dx_add_entry(handle, dentry, inode); 1896 retval = ext4_dx_add_entry(handle, dentry, inode);
1897 if (!retval || (retval != ERR_BAD_DX_DIR)) 1897 if (!retval || (retval != ERR_BAD_DX_DIR))
1898 return retval; 1898 goto out;
1899 ext4_clear_inode_flag(dir, EXT4_INODE_INDEX); 1899 ext4_clear_inode_flag(dir, EXT4_INODE_INDEX);
1900 dx_fallback++; 1900 dx_fallback++;
1901 ext4_mark_inode_dirty(handle, dir); 1901 ext4_mark_inode_dirty(handle, dir);
@@ -1907,14 +1907,15 @@ static int ext4_add_entry(handle_t *handle, struct dentry *dentry,
1907 return PTR_ERR(bh); 1907 return PTR_ERR(bh);
1908 1908
1909 retval = add_dirent_to_buf(handle, dentry, inode, NULL, bh); 1909 retval = add_dirent_to_buf(handle, dentry, inode, NULL, bh);
1910 if (retval != -ENOSPC) { 1910 if (retval != -ENOSPC)
1911 brelse(bh); 1911 goto out;
1912 return retval;
1913 }
1914 1912
1915 if (blocks == 1 && !dx_fallback && 1913 if (blocks == 1 && !dx_fallback &&
1916 EXT4_HAS_COMPAT_FEATURE(sb, EXT4_FEATURE_COMPAT_DIR_INDEX)) 1914 EXT4_HAS_COMPAT_FEATURE(sb, EXT4_FEATURE_COMPAT_DIR_INDEX)) {
1917 return make_indexed_dir(handle, dentry, inode, bh); 1915 retval = make_indexed_dir(handle, dentry, inode, bh);
1916 bh = NULL; /* make_indexed_dir releases bh */
1917 goto out;
1918 }
1918 brelse(bh); 1919 brelse(bh);
1919 } 1920 }
1920 bh = ext4_append(handle, dir, &block); 1921 bh = ext4_append(handle, dir, &block);
@@ -1930,6 +1931,7 @@ static int ext4_add_entry(handle_t *handle, struct dentry *dentry,
1930 } 1931 }
1931 1932
1932 retval = add_dirent_to_buf(handle, dentry, inode, de, bh); 1933 retval = add_dirent_to_buf(handle, dentry, inode, de, bh);
1934out:
1933 brelse(bh); 1935 brelse(bh);
1934 if (retval == 0) 1936 if (retval == 0)
1935 ext4_set_inode_state(inode, EXT4_STATE_NEWENTRY); 1937 ext4_set_inode_state(inode, EXT4_STATE_NEWENTRY);