Loading fs/gfs2/glock.c +4 −3 Original line number Original line Diff line number Diff line Loading @@ -595,11 +595,12 @@ static void run_queue(struct gfs2_glock *gl) blocked = rq_mutex(gh); blocked = rq_mutex(gh); } else if (test_bit(GLF_DEMOTE, &gl->gl_flags)) { } else if (test_bit(GLF_DEMOTE, &gl->gl_flags)) { blocked = rq_demote(gl); blocked = rq_demote(gl); if (gl->gl_waiters2 && !blocked) { if (test_bit(GLF_WAITERS2, &gl->gl_flags) && !blocked) { set_bit(GLF_DEMOTE, &gl->gl_flags); set_bit(GLF_DEMOTE, &gl->gl_flags); gl->gl_demote_state = LM_ST_UNLOCKED; gl->gl_demote_state = LM_ST_UNLOCKED; } } gl->gl_waiters2 = 0; clear_bit(GLF_WAITERS2, &gl->gl_flags); } else if (!list_empty(&gl->gl_waiters3)) { } else if (!list_empty(&gl->gl_waiters3)) { gh = list_entry(gl->gl_waiters3.next, gh = list_entry(gl->gl_waiters3.next, struct gfs2_holder, gh_list); struct gfs2_holder, gh_list); Loading Loading @@ -710,7 +711,7 @@ static void handle_callback(struct gfs2_glock *gl, unsigned int state, } else if (gl->gl_demote_state != LM_ST_UNLOCKED && } else if (gl->gl_demote_state != LM_ST_UNLOCKED && gl->gl_demote_state != state) { gl->gl_demote_state != state) { if (test_bit(GLF_DEMOTE_IN_PROGRESS, &gl->gl_flags)) if (test_bit(GLF_DEMOTE_IN_PROGRESS, &gl->gl_flags)) gl->gl_waiters2 = 1; set_bit(GLF_WAITERS2, &gl->gl_flags); else else gl->gl_demote_state = LM_ST_UNLOCKED; gl->gl_demote_state = LM_ST_UNLOCKED; } } Loading fs/gfs2/incore.h +2 −2 Original line number Original line Diff line number Diff line /* /* * Copyright (C) Sistina Software, Inc. 1997-2003 All rights reserved. * Copyright (C) Sistina Software, Inc. 1997-2003 All rights reserved. * Copyright (C) 2004-2007 Red Hat, Inc. All rights reserved. * Copyright (C) 2004-2008 Red Hat, Inc. All rights reserved. * * * This copyrighted material is made available to anyone wishing to use, * This copyrighted material is made available to anyone wishing to use, * modify, copy, or redistribute it subject to the terms and conditions * modify, copy, or redistribute it subject to the terms and conditions Loading Loading @@ -167,6 +167,7 @@ enum { GLF_DIRTY = 5, GLF_DIRTY = 5, GLF_DEMOTE_IN_PROGRESS = 6, GLF_DEMOTE_IN_PROGRESS = 6, GLF_LFLUSH = 7, GLF_LFLUSH = 7, GLF_WAITERS2 = 8, }; }; struct gfs2_glock { struct gfs2_glock { Loading @@ -186,7 +187,6 @@ struct gfs2_glock { struct list_head gl_holders; struct list_head gl_holders; struct list_head gl_waiters1; /* HIF_MUTEX */ struct list_head gl_waiters1; /* HIF_MUTEX */ struct list_head gl_waiters3; /* HIF_PROMOTE */ struct list_head gl_waiters3; /* HIF_PROMOTE */ int gl_waiters2; /* GIF_DEMOTE */ const struct gfs2_glock_operations *gl_ops; const struct gfs2_glock_operations *gl_ops; Loading Loading
fs/gfs2/glock.c +4 −3 Original line number Original line Diff line number Diff line Loading @@ -595,11 +595,12 @@ static void run_queue(struct gfs2_glock *gl) blocked = rq_mutex(gh); blocked = rq_mutex(gh); } else if (test_bit(GLF_DEMOTE, &gl->gl_flags)) { } else if (test_bit(GLF_DEMOTE, &gl->gl_flags)) { blocked = rq_demote(gl); blocked = rq_demote(gl); if (gl->gl_waiters2 && !blocked) { if (test_bit(GLF_WAITERS2, &gl->gl_flags) && !blocked) { set_bit(GLF_DEMOTE, &gl->gl_flags); set_bit(GLF_DEMOTE, &gl->gl_flags); gl->gl_demote_state = LM_ST_UNLOCKED; gl->gl_demote_state = LM_ST_UNLOCKED; } } gl->gl_waiters2 = 0; clear_bit(GLF_WAITERS2, &gl->gl_flags); } else if (!list_empty(&gl->gl_waiters3)) { } else if (!list_empty(&gl->gl_waiters3)) { gh = list_entry(gl->gl_waiters3.next, gh = list_entry(gl->gl_waiters3.next, struct gfs2_holder, gh_list); struct gfs2_holder, gh_list); Loading Loading @@ -710,7 +711,7 @@ static void handle_callback(struct gfs2_glock *gl, unsigned int state, } else if (gl->gl_demote_state != LM_ST_UNLOCKED && } else if (gl->gl_demote_state != LM_ST_UNLOCKED && gl->gl_demote_state != state) { gl->gl_demote_state != state) { if (test_bit(GLF_DEMOTE_IN_PROGRESS, &gl->gl_flags)) if (test_bit(GLF_DEMOTE_IN_PROGRESS, &gl->gl_flags)) gl->gl_waiters2 = 1; set_bit(GLF_WAITERS2, &gl->gl_flags); else else gl->gl_demote_state = LM_ST_UNLOCKED; gl->gl_demote_state = LM_ST_UNLOCKED; } } Loading
fs/gfs2/incore.h +2 −2 Original line number Original line Diff line number Diff line /* /* * Copyright (C) Sistina Software, Inc. 1997-2003 All rights reserved. * Copyright (C) Sistina Software, Inc. 1997-2003 All rights reserved. * Copyright (C) 2004-2007 Red Hat, Inc. All rights reserved. * Copyright (C) 2004-2008 Red Hat, Inc. All rights reserved. * * * This copyrighted material is made available to anyone wishing to use, * This copyrighted material is made available to anyone wishing to use, * modify, copy, or redistribute it subject to the terms and conditions * modify, copy, or redistribute it subject to the terms and conditions Loading Loading @@ -167,6 +167,7 @@ enum { GLF_DIRTY = 5, GLF_DIRTY = 5, GLF_DEMOTE_IN_PROGRESS = 6, GLF_DEMOTE_IN_PROGRESS = 6, GLF_LFLUSH = 7, GLF_LFLUSH = 7, GLF_WAITERS2 = 8, }; }; struct gfs2_glock { struct gfs2_glock { Loading @@ -186,7 +187,6 @@ struct gfs2_glock { struct list_head gl_holders; struct list_head gl_holders; struct list_head gl_waiters1; /* HIF_MUTEX */ struct list_head gl_waiters1; /* HIF_MUTEX */ struct list_head gl_waiters3; /* HIF_PROMOTE */ struct list_head gl_waiters3; /* HIF_PROMOTE */ int gl_waiters2; /* GIF_DEMOTE */ const struct gfs2_glock_operations *gl_ops; const struct gfs2_glock_operations *gl_ops; Loading