CVSROOT: /cvs/cluster Module name: cluster Branch: RHEL51 Changes by: [EMAIL PROTECTED] 2008-01-24 22:23:47
Modified files: gfs-kernel/src/gfs: glock.c Log message: Oops. Reverted fix for bz #426291. It isn't going into RHEL 5.1 Patches: http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs-kernel/src/gfs/glock.c.diff?cvsroot=cluster&only_with_tag=RHEL51&r1=1.29.2.5.2.1&r2=1.29.2.5.2.2 --- cluster/gfs-kernel/src/gfs/glock.c 2008/01/24 20:08:43 1.29.2.5.2.1 +++ cluster/gfs-kernel/src/gfs/glock.c 2008/01/24 22:23:47 1.29.2.5.2.2 @@ -1618,6 +1618,8 @@ struct gfs_sbd *sdp = gl->gl_sbd; struct gfs_glock_operations *glops = gl->gl_ops; struct list_head *pos; + struct gfs_holder *tmp_gh = NULL; + int count = 0; atomic_inc(&gl->gl_sbd->sd_glock_dq_calls); @@ -1628,13 +1630,14 @@ set_bit(GLF_SYNC, &gl->gl_flags); /* Don't cache glock; request demote to unlock at inter-node scope */ - if (gh->gh_flags & GL_NOCACHE && gl->gl_holders.next == &gh->gh_list && - gl->gl_holders.prev == &gh->gh_list) - /* There's a race here. If there are two holders, and both - * are dq'ed at almost the same time, you can't guarantee that - * you will call handle_callback. Fixing this will require - * some refactoring */ - handle_callback(gl, LM_ST_UNLOCKED); + if (gh->gh_flags & GL_NOCACHE) { + list_for_each(pos, &gl->gl_holders) { + tmp_gh = list_entry(pos, struct gfs_holder, gh_list); + ++count; + } + if (tmp_gh == gh && count == 1) + handle_callback(gl, LM_ST_UNLOCKED); + } lock_on_glock(gl);