On Fri, Feb 05, 2016 at 10:05:08AM +1100, Dave Chinner wrote: > From: Dave Chinner <dchinner@xxxxxxxxxx> > > When a buffer on the dirty MRU is looked up and found, we remove the > buffer from the MRU. However, we've already set the priority ofthe of the > buffer to "dirty" so when we are donw with it it will go back on the done > dirty buffer MRU regardless of whether it needs to or not. > > Hence when we move a buffer to a the dirty MRU, reocrd the old record > priority and restore it when we remove the buffer from the MRU on > lookup. This will prevent us from putting fixed, now writeable > buffers back on the dirty MRU and allow the cache routine to write, > shake and reclaim the buffers once they are clean. > > Signed-off-by: Dave Chinner <dchinner@xxxxxxxxxx> > --- > include/cache.h | 1 + > libxfs/cache.c | 7 +++++++ > 2 files changed, 8 insertions(+) > ... > diff --git a/libxfs/cache.c b/libxfs/cache.c > index d4b4a4e..0398be3 100644 > --- a/libxfs/cache.c > +++ b/libxfs/cache.c ... > @@ -434,6 +436,10 @@ cache_node_get( > mru->cm_count--; > list_del_init(&node->cn_mru); > pthread_mutex_unlock(&mru->cm_mutex); > + if (node->cn_old_priority != -1) { Might be good to ASSERT(node->cn_priority == CACHE_DIRTY_PRIORITY) here. Otherwise looks good: Reviewed-by: Brian Foster <bfoster@xxxxxxxxxx> > + node->cn_priority = node->cn_old_priority; > + node->cn_old_priority = -1; > + } > } > node->cn_count++; > > @@ -534,6 +540,7 @@ cache_node_set_priority( > pthread_mutex_lock(&node->cn_mutex); > ASSERT(node->cn_count > 0); > node->cn_priority = priority; > + node->cn_old_priority = -1; > pthread_mutex_unlock(&node->cn_mutex); > } > > -- > 2.5.0 > > _______________________________________________ > xfs mailing list > xfs@xxxxxxxxxxx > http://oss.sgi.com/mailman/listinfo/xfs _______________________________________________ xfs mailing list xfs@xxxxxxxxxxx http://oss.sgi.com/mailman/listinfo/xfs