From mboxrd@z Thu Jan 1 00:00:00 1970 From: wcheng@sourceware.org Date: 18 Jan 2007 20:40:12 -0000 Subject: [Cluster-devel] cluster/gfs-kernel/src/gfs ops_inode.c Message-ID: <20070118204012.12641.qmail@sourceware.org> List-Id: To: cluster-devel.redhat.com MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit CVSROOT: /cvs/cluster Module name: cluster Branch: RHEL4 Changes by: wcheng at sourceware.org 2007-01-18 20:40:12 Modified files: gfs-kernel/src/gfs: ops_inode.c Log message: bugzilla 190475 (rename 3-2): This patch fixes: Current rename doesn't lock the (to be deleted) source file during rename operation unless the source is a directory. This issue would not show up in a single node case since VFS layer has done its i_sem/ i_mutex locks for both directories and involved files. This patch excludes a previous proposed change (in the draft patch sent out for review in cluster-devel list) that adds gfs rename global lock to prevent a rare case of cluster deadlock. Since cluster rename global lock is very expensive, we prefer to find other means to fix that issue. Patches: http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs-kernel/src/gfs/ops_inode.c.diff?cvsroot=cluster&only_with_tag=RHEL4&r1=1.6.2.4&r2=1.6.2.5 --- cluster/gfs-kernel/src/gfs/ops_inode.c 2006/10/10 18:35:27 1.6.2.4 +++ cluster/gfs-kernel/src/gfs/ops_inode.c 2007/01/18 20:40:12 1.6.2.5 @@ -968,15 +968,19 @@ goto fail; } - gfs_holder_init(odip->i_gl, LM_ST_EXCLUSIVE, 0, &ghs[0]); - gfs_holder_init(ndip->i_gl, LM_ST_EXCLUSIVE, 0, &ghs[1]); - num_gh = 2; - - if (nip) - gfs_holder_init(nip->i_gl, LM_ST_EXCLUSIVE, 0, &ghs[num_gh++]); + num_gh = 1; + gfs_holder_init(odip->i_gl, LM_ST_EXCLUSIVE, 0, ghs); + if (odip != ndip) { + gfs_holder_init(ndip->i_gl, LM_ST_EXCLUSIVE, 0, ghs+num_gh); + num_gh++; + } + gfs_holder_init(ip->i_gl, LM_ST_EXCLUSIVE, 0, ghs+num_gh); + num_gh++; - if (dir_rename) - gfs_holder_init(ip->i_gl, LM_ST_EXCLUSIVE, 0, &ghs[num_gh++]); + if (nip) { + gfs_holder_init(nip->i_gl, LM_ST_EXCLUSIVE, 0, ghs + num_gh); + num_gh++; + } error = gfs_glock_nq_m(num_gh, ghs); if (error)