[GFS2] Fix double locking problem in rename
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>
This commit is contained in:
parent
bf9f424d9a
commit
d9d1ca3050
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user