[GFS2] Fix double locking problem in rename
authorSteven Whitehouse <swhiteho@redhat.com>
Wed, 21 Jun 2006 19:38:17 +0000 (15:38 -0400)
committerSteven Whitehouse <swhiteho@redhat.com>
Wed, 21 Jun 2006 19:38:17 +0000 (15:38 -0400)
The rename inode operation was trying to lock the same
inode twice in the case of renaming with the source
and destination directories the same. We now test for
this and just lock once.

Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>
fs/gfs2/ops_inode.c

index 2fe37aeac7b02ec125e6352dfac513989afee592..3a2769ebfe4aa20f3ea752bc3155f9719cd5b8da 100644 (file)
@@ -615,13 +615,19 @@ static int gfs2_rename(struct inode *odir, struct dentry *odentry,
                        goto out_gunlock_r;
        }
 
+       num_gh = 1;
        gfs2_holder_init(odip->i_gl, LM_ST_EXCLUSIVE, 0, ghs);
-       gfs2_holder_init(ndip->i_gl, LM_ST_EXCLUSIVE, 0, ghs + 1);
-       gfs2_holder_init(ip->i_gl, LM_ST_EXCLUSIVE, 0, ghs + 2);
-       num_gh = 3;
+       if (odip != ndip) {
+               gfs2_holder_init(ndip->i_gl, LM_ST_EXCLUSIVE, 0, ghs + num_gh);
+               num_gh++;
+       }
+       gfs2_holder_init(ip->i_gl, LM_ST_EXCLUSIVE, 0, ghs + num_gh);
+       num_gh++;
 
-       if (nip)
-               gfs2_holder_init(nip->i_gl, LM_ST_EXCLUSIVE, 0, ghs + num_gh++);
+       if (nip) {
+               gfs2_holder_init(nip->i_gl, LM_ST_EXCLUSIVE, 0, ghs + num_gh);
+               num_gh++;
+       }
 
        error = gfs2_glock_nq_m(num_gh, ghs);
        if (error)
This page took 0.025434 seconds and 5 git commands to generate.