• Prasad Joshi's avatar
    logfs: set superblock shutdown flag after generic sb shutdown · ecfd8909
    Prasad Joshi authored
    While unmounting the file system LogFS calls generic_shutdown_super.
    The function does file system independent superblock shutdown.
    However, it might result in call file system specific inode eviction.
    
    LogFS marks FS shutting down by setting bit LOGFS_SB_FLAG_SHUTDOWN in
    super->s_flags. Since, inode eviction might call truncate on inode,
    following BUG is observed when file system is unmounted:
    
    ------------[ cut here ]------------
    kernel BUG at /home/prasad/logfs/segment.c:362!
    invalid opcode: 0000 [#1] PREEMPT SMP
    CPU 3
    Modules linked in: logfs binfmt_misc ppdev virtio_blk parport_pc lp
    	parport psmouse floppy virtio_pci serio_raw virtio_ring virtio
    
    Pid: 1933, comm: umount Not tainted 3.0.0+ #4 Bochs Bochs
    RIP: 0010:[<ffffffffa008c841>]  [<ffffffffa008c841>]
    		logfs_segment_write+0x211/0x230 [logfs]
    RSP: 0018:ffff880062d7b9e8  EFLAGS: 00010202
    RAX: 000000000000000e RBX: ffff88006eca9000 RCX: 0000000000000000
    RDX: ffff88006fd87c40 RSI: ffffea00014ff468 RDI: ffff88007b68e000
    RBP: ffff880062d7ba48 R08: 8000000020451430 R09: 0000000000000000
    R10: dead000000100100 R11: 0000000000000000 R12: ffff88006fd87c40
    R13: ffffea00014ff468 R14: ffff88005ad0a460 R15: 0000000000000000
    FS:  00007f25d50ea760(0000) GS:ffff88007fd80000(0000)
    	knlGS:0000000000000000
    CS:  0010 DS: 0000 ES: 0000 CR0: 000000008005003b
    CR2: 0000000000d05e48 CR3: 0000000062c72000 CR4: 00000000000006e0
    DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
    DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400
    Process umount (pid: 1933, threadinfo ffff880062d7a000,
    	task ffff880070b44500)
    Stack:
    ffff880062d7ba38 ffff88005ad0a508 0000000000001000 0000000000000000
    8000000020451430 ffffea00014ff468 ffff880062d7ba48 ffff88005ad0a460
    ffff880062d7bad8 ffffea00014ff468 ffff88006fd87c40 0000000000000000
    Call Trace:
    [<ffffffffa0088fee>] logfs_write_i0+0x12e/0x190 [logfs]
    [<ffffffffa0089360>] __logfs_write_rec+0x140/0x220 [logfs]
    [<ffffffffa0089312>] __logfs_write_rec+0xf2/0x220 [logfs]
    [<ffffffffa00894a4>] logfs_write_rec+0x64/0xd0 [logfs]
    [<ffffffffa0089616>] __logfs_write_buf+0x106/0x110 [logfs]
    [<ffffffffa008a19e>] logfs_write_buf+0x4e/0x80 [logfs]
    [<ffffffffa008a6b8>] __logfs_write_inode+0x98/0x110 [logfs]
    [<ffffffffa008a7c4>] logfs_truncate+0x54/0x290 [logfs]
    [<ffffffffa008abfc>] logfs_evict_inode+0xdc/0x190 [logfs]
    [<ffffffff8115eef5>] evict+0x85/0x170
    [<ffffffff8115f126>] iput+0xe6/0x1b0
    [<ffffffff8115b4a8>] shrink_dcache_for_umount_subtree+0x218/0x280
    [<ffffffff8115ce91>] shrink_dcache_for_umount+0x51/0x90
    [<ffffffff8114796c>] generic_shutdown_super+0x2c/0x100
    [<ffffffffa008cc47>] logfs_kill_sb+0x57/0xf0 [logfs]
    [<ffffffff81147de5>] deactivate_locked_super+0x45/0x70
    [<ffffffff811487ea>] deactivate_super+0x4a/0x70
    [<ffffffff81163934>] mntput_no_expire+0xa4/0xf0
    [<ffffffff8116469f>] sys_umount+0x6f/0x380
    [<ffffffff814dd46b>] system_call_fastpath+0x16/0x1b
    Code: 55 c8 49 8d b6 a8 00 00 00 45 89 f9 45 89 e8 4c 89 e1 4c 89 55
    b8 c7 04 24 00 00 00 00 e8 68 fc ff ff 4c 8b 55 b8 e9 3c ff ff ff <0f>
    0b 0f 0b c7 45 c0 00 00 00 00 e9 44 fe ff ff 66 66 66 66 66
    RIP  [<ffffffffa008c841>] logfs_segment_write+0x211/0x230 [logfs]
    RSP <ffff880062d7b9e8>
    ---[ end trace fe6b040cea952290 ]---
    
    Therefore, move super->s_flags setting after the fs-indenpendent work
    has been finished.
    Reviewed-by: default avatarJoern Engel <joern@logfs.org>
    Signed-off-by: default avatarPrasad Joshi <prasadjoshi.linux@gmail.com>
    ecfd8909
super.c 16.2 KB