diff options
Diffstat (limited to 'fs/gfs2/glock.c')
| -rw-r--r-- | fs/gfs2/glock.c | 14 | 
1 files changed, 11 insertions, 3 deletions
diff --git a/fs/gfs2/glock.c b/fs/gfs2/glock.c index a2a6abbccc0..1c1336e7b3b 100644 --- a/fs/gfs2/glock.c +++ b/fs/gfs2/glock.c @@ -663,14 +663,19 @@ static void glock_work_func(struct work_struct *work)  		drop_ref = 1;  	}  	spin_lock(&gl->gl_spin); -	if (test_and_clear_bit(GLF_PENDING_DEMOTE, &gl->gl_flags) && +	if (test_bit(GLF_PENDING_DEMOTE, &gl->gl_flags) &&  	    gl->gl_state != LM_ST_UNLOCKED &&  	    gl->gl_demote_state != LM_ST_EXCLUSIVE) {  		unsigned long holdtime, now = jiffies; +  		holdtime = gl->gl_tchange + gl->gl_ops->go_min_hold_time;  		if (time_before(now, holdtime))  			delay = holdtime - now; -		set_bit(delay ? GLF_PENDING_DEMOTE : GLF_DEMOTE, &gl->gl_flags); + +		if (!delay) { +			clear_bit(GLF_PENDING_DEMOTE, &gl->gl_flags); +			set_bit(GLF_DEMOTE, &gl->gl_flags); +		}  	}  	run_queue(gl, 0);  	spin_unlock(&gl->gl_spin); @@ -1346,11 +1351,14 @@ void gfs2_glock_complete(struct gfs2_glock *gl, int ret)  } -static int gfs2_shrink_glock_memory(struct shrinker *shrink, int nr, gfp_t gfp_mask) +static int gfs2_shrink_glock_memory(struct shrinker *shrink, +				    struct shrink_control *sc)  {  	struct gfs2_glock *gl;  	int may_demote;  	int nr_skipped = 0; +	int nr = sc->nr_to_scan; +	gfp_t gfp_mask = sc->gfp_mask;  	LIST_HEAD(skipped);  	if (nr == 0)  |