• T
    writeback: keep superblock pinned during cgroup writeback association switches · 5ff8eaac
    Tejun Heo 提交于
    If cgroup writeback is in use, an inode is associated with a cgroup
    for writeback.  If the inode's main dirtier changes to another cgroup,
    the association gets updated asynchronously.  Nothing was pinning the
    superblock while such switches are in progress and superblock could go
    away while async switching is pending or in progress leading to
    crashes like the following.
    
     kernel BUG at fs/jbd2/transaction.c:319!
     invalid opcode: 0000 [#1] SMP DEBUG_PAGEALLOC
     CPU: 1 PID: 29158 Comm: kworker/1:10 Not tainted 4.5.0-rc3 #51
     Hardware name: Google Google, BIOS Google 01/01/2011
     Workqueue: events inode_switch_wbs_work_fn
     task: ffff880213dbbd40 ti: ffff880209264000 task.ti: ffff880209264000
     RIP: 0010:[<ffffffff803e6922>]  [<ffffffff803e6922>] start_this_handle+0x382/0x3e0
     RSP: 0018:ffff880209267c30  EFLAGS: 00010202
     ...
     Call Trace:
      [<ffffffff803e6be4>] jbd2__journal_start+0xf4/0x190
      [<ffffffff803cfc7e>] __ext4_journal_start_sb+0x4e/0x70
      [<ffffffff803b31ec>] ext4_evict_inode+0x12c/0x3d0
      [<ffffffff8035338b>] evict+0xbb/0x190
      [<ffffffff80354190>] iput+0x130/0x190
      [<ffffffff80360223>] inode_switch_wbs_work_fn+0x343/0x4c0
      [<ffffffff80279819>] process_one_work+0x129/0x300
      [<ffffffff80279b16>] worker_thread+0x126/0x480
      [<ffffffff8027ed14>] kthread+0xc4/0xe0
      [<ffffffff809771df>] ret_from_fork+0x3f/0x70
    
    Fix it by bumping s_active while cgroup association switching is in
    flight.
    Signed-off-by: NTejun Heo <tj@kernel.org>
    Reported-and-tested-by: NTahsin Erdogan <tahsin@google.com>
    Link: http://lkml.kernel.org/g/CAAeU0aNCq7LGODvVGRU-oU_o-6enii5ey0p1c26D1ZzYwkDc5A@mail.gmail.com
    Fixes: d10c8095 ("writeback: implement foreign cgroup inode bdi_writeback switching")
    Cc: stable@vger.kernel.org #v4.5+
    Signed-off-by: NJens Axboe <axboe@fb.com>
    5ff8eaac
fs-writeback.c 67.5 KB