writeback: merge bdi_writeback_task and bdi_start_fn
Christoph Hellwig [Sat, 19 Jun 2010 21:08:22 +0000 (23:08 +0200)]
Move all code for the writeback thread into fs/fs-writeback.c instead of
splitting it over two functions in two files.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Jens Axboe <jaxboe@fusionio.com>

fs/fs-writeback.c
include/linux/backing-dev.h
mm/backing-dev.c

index d67989b..c8471b3 100644 (file)
@@ -775,12 +775,36 @@ long wb_do_writeback(struct bdi_writeback *wb, int force_wait)
  * Handle writeback of dirty data for the device backed by this bdi. Also
  * wakes up periodically and does kupdated style flushing.
  */
-int bdi_writeback_task(struct bdi_writeback *wb)
+int bdi_writeback_thread(void *data)
 {
+       struct bdi_writeback *wb = data;
+       struct backing_dev_info *bdi = wb->bdi;
        unsigned long last_active = jiffies;
        unsigned long wait_jiffies = -1UL;
        long pages_written;
 
+       /*
+        * Add us to the active bdi_list
+        */
+       spin_lock_bh(&bdi_lock);
+       list_add_rcu(&bdi->bdi_list, &bdi_list);
+       spin_unlock_bh(&bdi_lock);
+
+       current->flags |= PF_FLUSHER | PF_SWAPWRITE;
+       set_freezable();
+
+       /*
+        * Our parent may run at a different priority, just set us to normal
+        */
+       set_user_nice(current, 0);
+
+       /*
+        * Clear pending bit and wakeup anybody waiting to tear us down
+        */
+       clear_bit(BDI_pending, &bdi->state);
+       smp_mb__after_clear_bit();
+       wake_up_bit(&bdi->state, BDI_pending);
+
        while (!kthread_should_stop()) {
                pages_written = wb_do_writeback(wb, 0);
 
@@ -813,9 +837,18 @@ int bdi_writeback_task(struct bdi_writeback *wb)
                try_to_freeze();
        }
 
+       wb->task = NULL;
+
+       /*
+        * Flush any work that raced with us exiting. No new work
+        * will be added, since this bdi isn't discoverable anymore.
+        */
+       if (!list_empty(&bdi->work_list))
+               wb_do_writeback(wb, 1);
        return 0;
 }
 
+
 /*
  * Start writeback of `nr_pages' pages.  If `nr_pages' is zero, write back
  * the whole world.
index 50f1461..e536f3a 100644 (file)
@@ -102,7 +102,7 @@ void bdi_unregister(struct backing_dev_info *bdi);
 int bdi_setup_and_register(struct backing_dev_info *, char *, unsigned int);
 void bdi_start_writeback(struct backing_dev_info *bdi, long nr_pages);
 void bdi_start_background_writeback(struct backing_dev_info *bdi);
-int bdi_writeback_task(struct bdi_writeback *wb);
+int bdi_writeback_thread(void *data);
 int bdi_has_dirty_io(struct backing_dev_info *bdi);
 void bdi_arm_supers_timer(void);
 
index 6c2a09c..bceac64 100644 (file)
@@ -260,48 +260,6 @@ static void bdi_wb_init(struct bdi_writeback *wb, struct backing_dev_info *bdi)
        INIT_LIST_HEAD(&wb->b_more_io);
 }
 
-static int bdi_start_fn(void *ptr)
-{
-       struct bdi_writeback *wb = ptr;
-       struct backing_dev_info *bdi = wb->bdi;
-       int ret;
-
-       /*
-        * Add us to the active bdi_list
-        */
-       spin_lock_bh(&bdi_lock);
-       list_add_rcu(&bdi->bdi_list, &bdi_list);
-       spin_unlock_bh(&bdi_lock);
-
-       current->flags |= PF_FLUSHER | PF_SWAPWRITE;
-       set_freezable();
-
-       /*
-        * Our parent may run at a different priority, just set us to normal
-        */
-       set_user_nice(current, 0);
-
-       /*
-        * Clear pending bit and wakeup anybody waiting to tear us down
-        */
-       clear_bit(BDI_pending, &bdi->state);
-       smp_mb__after_clear_bit();
-       wake_up_bit(&bdi->state, BDI_pending);
-
-       ret = bdi_writeback_task(wb);
-
-       wb->task = NULL;
-
-       /*
-        * Flush any work that raced with us exiting. No new work
-        * will be added, since this bdi isn't discoverable anymore.
-        */
-       if (!list_empty(&bdi->work_list))
-               wb_do_writeback(wb, 1);
-
-       return ret;
-}
-
 int bdi_has_dirty_io(struct backing_dev_info *bdi)
 {
        return wb_has_dirty_io(&bdi->wb);
@@ -425,7 +383,7 @@ static int bdi_forker_task(void *ptr)
                spin_unlock_bh(&bdi_lock);
 
                wb = &bdi->wb;
-               wb->task = kthread_run(bdi_start_fn, wb, "flush-%s",
+               wb->task = kthread_run(bdi_writeback_thread, wb, "flush-%s",
                                        dev_name(bdi->dev));
                /*
                 * If task creation fails, then readd the bdi to