lkml.org 
[lkml]   [2015]   [Mar]   [23]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 45/48] writeback: dirty inodes against their matching cgroup bdi_writeback's
    Date
    __mark_inode_dirty() always dirtied the inode against the root wb
    (bdi_writeback). The previous patches added all the infrastructure
    necessary to attribute an inode against the wb of the dirtying cgroup.

    This patch updates __mark_inode_dirty() so that it uses the wb
    associated with the inode instead of unconditionally using the root
    one.

    Currently, none of the filesystems has FS_CGROUP_WRITEBACK and all
    pages will keep being dirtied against the root wb.

    v2: Updated for per-inode wb association.

    Signed-off-by: Tejun Heo <tj@kernel.org>
    Cc: Jens Axboe <axboe@kernel.dk>
    Cc: Jan Kara <jack@suse.cz>
    ---
    fs/fs-writeback.c | 23 +++++++++++------------
    1 file changed, 11 insertions(+), 12 deletions(-)

    diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c
    index 57b2282..890cff1 100644
    --- a/fs/fs-writeback.c
    +++ b/fs/fs-writeback.c
    @@ -1442,7 +1442,6 @@ static noinline void block_dump___mark_inode_dirty(struct inode *inode)
    void __mark_inode_dirty(struct inode *inode, int flags)
    {
    struct super_block *sb = inode->i_sb;
    - struct backing_dev_info *bdi = NULL;
    int dirtytime;

    trace_writeback_mark_inode_dirty(inode, flags);
    @@ -1512,21 +1511,21 @@ void __mark_inode_dirty(struct inode *inode, int flags)
    * reposition it (that would break b_dirty time-ordering).
    */
    if (!was_dirty) {
    + struct bdi_writeback *wb = inode_to_wb(inode);
    bool wakeup_bdi = false;
    - bdi = inode_to_bdi(inode);

    spin_unlock(&inode->i_lock);
    - spin_lock(&bdi->wb.list_lock);
    + spin_lock(&wb->list_lock);

    - WARN(bdi_cap_writeback_dirty(bdi) &&
    - !test_bit(WB_registered, &bdi->wb.state),
    - "bdi-%s not registered\n", bdi->name);
    + WARN(bdi_cap_writeback_dirty(wb->bdi) &&
    + !test_bit(WB_registered, &wb->state),
    + "bdi-%s not registered\n", wb->bdi->name);

    inode->dirtied_when = jiffies;
    - wakeup_bdi = inode_wb_list_move_locked(inode, &bdi->wb,
    - dirtytime ? &bdi->wb.b_dirty_time :
    - &bdi->wb.b_dirty);
    - spin_unlock(&bdi->wb.list_lock);
    + wakeup_bdi = inode_wb_list_move_locked(inode, wb,
    + dirtytime ? &wb->b_dirty_time :
    + &wb->b_dirty);
    + spin_unlock(&wb->list_lock);
    trace_writeback_dirty_inode_enqueue(inode);

    /*
    @@ -1535,8 +1534,8 @@ void __mark_inode_dirty(struct inode *inode, int flags)
    * to make sure background write-back happens
    * later.
    */
    - if (bdi_cap_writeback_dirty(bdi) && wakeup_bdi)
    - wb_wakeup_delayed(&bdi->wb);
    + if (bdi_cap_writeback_dirty(wb->bdi) && wakeup_bdi)
    + wb_wakeup_delayed(wb);
    return;
    }
    }
    --
    2.1.0


    \
     
     \ /
      Last update: 2015-03-23 06:21    [W:4.939 / U:0.264 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site