lkml.org 
[lkml]   [2009]   [May]   [25]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 08/12] writeback: include default_backing_dev_info in writeback
    Date
    We see dirty inodes there occasionally, so better be safe and write them
    out.

    Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
    ---
    fs/fs-writeback.c | 2 +-
    include/linux/writeback.h | 1 +
    mm/backing-dev.c | 16 +++++++++++-----
    3 files changed, 13 insertions(+), 6 deletions(-)
    diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c
    index 563860c..47f5ace 100644
    --- a/fs/fs-writeback.c
    +++ b/fs/fs-writeback.c
    @@ -364,7 +364,7 @@ static void wb_writeback(struct bdi_writeback *wb)
    * This will be inlined in bdi_writeback_task() once we get rid of any
    * dirty inodes on the default_backing_dev_info
    */
    -static void wb_do_writeback(struct bdi_writeback *wb)
    +void wb_do_writeback(struct bdi_writeback *wb)
    {
    /*
    * We get here in two cases:
    diff --git a/include/linux/writeback.h b/include/linux/writeback.h
    index baf04a9..e414702 100644
    --- a/include/linux/writeback.h
    +++ b/include/linux/writeback.h
    @@ -69,6 +69,7 @@ void writeback_inodes(struct writeback_control *wbc);
    int inode_wait(void *);
    void sync_inodes_sb(struct super_block *, int wait);
    void sync_inodes(int wait);
    +void wb_do_writeback(struct bdi_writeback *wb);

    /* writeback.h requires fs.h; it, too, is not included from here. */
    static inline void wait_on_inode(struct inode *inode)
    diff --git a/mm/backing-dev.c b/mm/backing-dev.c
    index 3e74041..3a032be 100644
    --- a/mm/backing-dev.c
    +++ b/mm/backing-dev.c
    @@ -388,12 +388,14 @@ static int bdi_forker_task(void *ptr)
    struct bdi_writeback *wb;

    /*
    - * Should never trigger on the default bdi
    + * Ideally we'd like not to see any dirty inodes on the
    + * default_backing_dev_info. Until these are tracked down,
    + * perform the same writeback here that bdi_writeback_task
    + * does. For logic, see comment in
    + * fs/fs-writeback.c:bdi_writeback_task()
    */
    - if (wb_has_dirty_io(me)) {
    - bdi_flush_io(me->bdi);
    - WARN_ON(1);
    - }
    + if (wb_has_dirty_io(me) || !list_empty(&me->bdi->work_list))
    + wb_do_writeback(me);

    prepare_to_wait(&me->wait, &wait, TASK_INTERRUPTIBLE);

    @@ -420,6 +422,10 @@ static int bdi_forker_task(void *ptr)
    continue;
    }

    + /*
    + * This is our real job - check for pending entries in
    + * bdi_pending_list, and create the tasks that got added
    + */
    bdi = list_entry(bdi_pending_list.next, struct backing_dev_info,
    bdi_list);
    list_del_init(&bdi->bdi_list);
    --
    1.6.3.rc0.1.gf800


    \
     
     \ /
      Last update: 2009-05-25 09:47    [from the cache]
    ©2003-2014 Jasper Spaans. hosted at Digital Ocean