On large systems the cache policy can be over enthusiastic and queue far
too much dirty data to be written back.  This consumes memory.
Signed-off-by: Joe Thornber <ejt@redhat.com>
Signed-off-by: Mike Snitzer <snitzer@redhat.com>
 
 static bool max_work_reached(struct background_tracker *b)
 {
-       // FIXME: finish
-       return false;
+       return atomic_read(&b->pending_promotes) +
+               atomic_read(&b->pending_writebacks) +
+               atomic_read(&b->pending_demotes) >= b->max_work;
+}
+
+struct bt_work *alloc_work(struct background_tracker *b)
+{
+       if (max_work_reached(b))
+               return NULL;
+
+       return kmem_cache_alloc(b->work_cache, GFP_NOWAIT);
 }
 
 int btracker_queue(struct background_tracker *b,
        if (pwork)
                *pwork = NULL;
 
-       if (max_work_reached(b))
-               return -ENOMEM;
-
-       w = kmem_cache_alloc(b->work_cache, GFP_NOWAIT);
+       w = alloc_work(b);
        if (!w)
                return -ENOMEM;