diff options
| -rw-r--r-- | fs/gfs2/glock.c | 49 | 
1 files changed, 25 insertions, 24 deletions
| diff --git a/fs/gfs2/glock.c b/fs/gfs2/glock.c index 0898f3ec8212..717531d1b2a8 100644 --- a/fs/gfs2/glock.c +++ b/fs/gfs2/glock.c @@ -328,6 +328,30 @@ static void gfs2_holder_wake(struct gfs2_holder *gh)  }  /** + * do_error - Something unexpected has happened during a lock request + * + */ + +static inline void do_error(struct gfs2_glock *gl, const int ret) +{ +	struct gfs2_holder *gh, *tmp; + +	list_for_each_entry_safe(gh, tmp, &gl->gl_holders, gh_list) { +		if (test_bit(HIF_HOLDER, &gh->gh_iflags)) +			continue; +		if (ret & LM_OUT_ERROR) +			gh->gh_error = -EIO; +		else if (gh->gh_flags & (LM_FLAG_TRY | LM_FLAG_TRY_1CB)) +			gh->gh_error = GLR_TRYFAILED; +		else +			continue; +		list_del_init(&gh->gh_list); +		trace_gfs2_glock_queue(gh, 0); +		gfs2_holder_wake(gh); +	} +} + +/**   * do_promote - promote as many requests as possible on the current queue   * @gl: The glock   *  @@ -375,36 +399,13 @@ restart:  		}  		if (gh->gh_list.prev == &gl->gl_holders)  			return 1; +		do_error(gl, 0);  		break;  	}  	return 0;  }  /** - * do_error - Something unexpected has happened during a lock request - * - */ - -static inline void do_error(struct gfs2_glock *gl, const int ret) -{ -	struct gfs2_holder *gh, *tmp; - -	list_for_each_entry_safe(gh, tmp, &gl->gl_holders, gh_list) { -		if (test_bit(HIF_HOLDER, &gh->gh_iflags)) -			continue; -		if (ret & LM_OUT_ERROR) -			gh->gh_error = -EIO; -		else if (gh->gh_flags & (LM_FLAG_TRY | LM_FLAG_TRY_1CB)) -			gh->gh_error = GLR_TRYFAILED; -		else -			continue; -		list_del_init(&gh->gh_list); -		trace_gfs2_glock_queue(gh, 0); -		gfs2_holder_wake(gh); -	} -} - -/**   * find_first_waiter - find the first gh that's waiting for the glock   * @gl: the glock   */ | 
