X-Git-Url: https://err.no/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=fs%2Fgfs2%2Fglock.c;h=13391e546616ce47a9b413dde1ac73ad396d808d;hb=aefcc28a3a63ac33a298777aa50ba43641c75241;hp=cd0aa213fb2f56e29037f9f152637ddde1bcee2a;hpb=265d529cef6fd57698d79b3c0edd3a8178059ea6;p=linux-2.6 diff --git a/fs/gfs2/glock.c b/fs/gfs2/glock.c index cd0aa213fb..13391e5466 100644 --- a/fs/gfs2/glock.c +++ b/fs/gfs2/glock.c @@ -267,8 +267,12 @@ static inline int may_grant(const struct gfs2_glock *gl, const struct gfs2_holde return 1; if (gh->gh_flags & GL_EXACT) return 0; - if (gh->gh_state == LM_ST_SHARED && gl->gl_state == LM_ST_EXCLUSIVE) - return 1; + if (gl->gl_state == LM_ST_EXCLUSIVE) { + if (gh->gh_state == LM_ST_SHARED && gh_head->gh_state == LM_ST_SHARED) + return 1; + if (gh->gh_state == LM_ST_DEFERRED && gh_head->gh_state == LM_ST_DEFERRED) + return 1; + } if (gl->gl_state != LM_ST_UNLOCKED && (gh->gh_flags & LM_FLAG_ANY)) return 1; return 0;