Merge tag 'pull-misc' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
[sfrench/cifs-2.6.git] / fs / reiserfs / namei.c
index c5f233b4a27f8b13f15eb923953075e70909b1c1..7e7b531fcc49a58cf68b1fa4228e5e997156f944 100644 (file)
@@ -1317,8 +1317,8 @@ static int reiserfs_rename(struct mnt_idmap *idmap,
        struct inode *old_inode, *new_dentry_inode;
        struct reiserfs_transaction_handle th;
        int jbegin_count;
-       umode_t old_inode_mode;
        unsigned long savelink = 1;
+       bool update_dir_parent = false;
 
        if (flags & ~RENAME_NOREPLACE)
                return -EINVAL;
@@ -1368,8 +1368,7 @@ static int reiserfs_rename(struct mnt_idmap *idmap,
                return -ENOENT;
        }
 
-       old_inode_mode = old_inode->i_mode;
-       if (S_ISDIR(old_inode_mode)) {
+       if (S_ISDIR(old_inode->i_mode)) {
                /*
                 * make sure that directory being renamed has correct ".."
                 * and that its new parent directory has not too many links
@@ -1382,24 +1381,28 @@ static int reiserfs_rename(struct mnt_idmap *idmap,
                        }
                }
 
-               /*
-                * directory is renamed, its parent directory will be changed,
-                * so find ".." entry
-                */
-               dot_dot_de.de_gen_number_bit_string = NULL;
-               retval =
-                   reiserfs_find_entry(old_inode, "..", 2, &dot_dot_entry_path,
+               if (old_dir != new_dir) {
+                       /*
+                        * directory is renamed, its parent directory will be
+                        * changed, so find ".." entry
+                        */
+                       dot_dot_de.de_gen_number_bit_string = NULL;
+                       retval =
+                           reiserfs_find_entry(old_inode, "..", 2,
+                                       &dot_dot_entry_path,
                                        &dot_dot_de);
-               pathrelse(&dot_dot_entry_path);
-               if (retval != NAME_FOUND) {
-                       reiserfs_write_unlock(old_dir->i_sb);
-                       return -EIO;
-               }
+                       pathrelse(&dot_dot_entry_path);
+                       if (retval != NAME_FOUND) {
+                               reiserfs_write_unlock(old_dir->i_sb);
+                               return -EIO;
+                       }
 
-               /* inode number of .. must equal old_dir->i_ino */
-               if (dot_dot_de.de_objectid != old_dir->i_ino) {
-                       reiserfs_write_unlock(old_dir->i_sb);
-                       return -EIO;
+                       /* inode number of .. must equal old_dir->i_ino */
+                       if (dot_dot_de.de_objectid != old_dir->i_ino) {
+                               reiserfs_write_unlock(old_dir->i_sb);
+                               return -EIO;
+                       }
+                       update_dir_parent = true;
                }
        }
 
@@ -1479,7 +1482,7 @@ static int reiserfs_rename(struct mnt_idmap *idmap,
 
                reiserfs_prepare_for_journal(old_inode->i_sb, new_de.de_bh, 1);
 
-               if (S_ISDIR(old_inode->i_mode)) {
+               if (update_dir_parent) {
                        if ((retval =
                             search_by_entry_key(new_dir->i_sb,
                                                 &dot_dot_de.de_entry_key,
@@ -1527,14 +1530,14 @@ static int reiserfs_rename(struct mnt_idmap *idmap,
                                                         new_de.de_bh);
                        reiserfs_restore_prepared_buffer(old_inode->i_sb,
                                                         old_de.de_bh);
-                       if (S_ISDIR(old_inode_mode))
+                       if (update_dir_parent)
                                reiserfs_restore_prepared_buffer(old_inode->
                                                                 i_sb,
                                                                 dot_dot_de.
                                                                 de_bh);
                        continue;
                }
-               if (S_ISDIR(old_inode_mode)) {
+               if (update_dir_parent) {
                        if (item_moved(&dot_dot_ih, &dot_dot_entry_path) ||
                            !entry_points_to_object("..", 2, &dot_dot_de,
                                                    old_dir)) {
@@ -1552,7 +1555,7 @@ static int reiserfs_rename(struct mnt_idmap *idmap,
                        }
                }
 
-               RFALSE(S_ISDIR(old_inode_mode) &&
+               RFALSE(update_dir_parent &&
                       !buffer_journal_prepared(dot_dot_de.de_bh), "");
 
                break;
@@ -1585,11 +1588,12 @@ static int reiserfs_rename(struct mnt_idmap *idmap,
                savelink = new_dentry_inode->i_nlink;
        }
 
-       if (S_ISDIR(old_inode_mode)) {
+       if (update_dir_parent) {
                /* adjust ".." of renamed directory */
                set_ino_in_dir_entry(&dot_dot_de, INODE_PKEY(new_dir));
                journal_mark_dirty(&th, dot_dot_de.de_bh);
-
+       }
+       if (S_ISDIR(old_inode->i_mode)) {
                /*
                 * there (in new_dir) was no directory, so it got new link
                 * (".."  of renamed directory)