Skip to content

Latest commit

 

History

History
76 lines (69 loc) · 2.76 KB

inode_drop_and_evict.md

File metadata and controls

76 lines (69 loc) · 2.76 KB
(gdb) bt
#0  ext4_drop_inode (inode=0xffff88001accaf50) at ../fs/ext4/super.c:994
#1  0xffffffff81257e9d in iput_final (inode=<optimised out>) at ../fs/inode.c:1489
#2  iput (inode=0xffff88001accaf50) at ../fs/inode.c:1540
#3  0xffffffff8124a2ef in do_unlinkat (dfd=-100, pathname=<optimised out>) at ../fs/namei.c:4050
#4  0xffffffff8124af8b in SYSC_unlinkat (flag=<optimised out>, pathname=<optimised out>, dfd=<optimised out>) at ../fs/namei.c:4086
#5  SyS_unlinkat (dfd=<optimised out>, pathname=<optimised out>, flag=<optimised out>) at ../fs/namei.c:4078
#6  0xffffffff818aae7b in entry_SYSCALL_64 () at ../arch/x86/entry/entry_64.S:203
#7  0x0000000001d820f0 in ?? ()
#8  0x00007ffcfb903290 in ?? ()
#9  0x0000000000000000 in ?? ()

(gdb) b ext4_evict_inode
Breakpoint 39 at 0xffffffff812e4b70: file ../fs/ext4/inode.c, line 189.

(gdb) c
Continuing.

Thread 2 hit Breakpoint 39, ext4_evict_inode (inode=0xffff88001accaf50) at ../fs/ext4/inode.c:189
189	{
(gdb) bt
#0  ext4_evict_inode (inode=0xffff88001accaf50) at ../fs/ext4/inode.c:189
#1  0xffffffff81257c77 in evict (inode=0xffff88001accaf50) at ../fs/inode.c:552
#2  0xffffffff81257f6c in iput_final (inode=<optimised out>) at ../fs/inode.c:1513
#3  iput (inode=0xffff88001accaf50) at ../fs/inode.c:1540
#4  0xffffffff8124a2ef in do_unlinkat (dfd=-100, pathname=<optimised out>) at ../fs/namei.c:4050
#5  0xffffffff8124af8b in SYSC_unlinkat (flag=<optimised out>, pathname=<optimised out>, dfd=<optimised out>) at ../fs/namei.c:4086
#6  SyS_unlinkat (dfd=<optimised out>, pathname=<optimised out>, flag=<optimised out>) at ../fs/namei.c:4078
#7  0xffffffff818aae7b in entry_SYSCALL_64 () at ../arch/x86/entry/entry_64.S:203
#8  0x0000000001d820f0 in ?? ()
#9  0x00007ffcfb903290 in ?? ()
#10 0x0000000000000000 in ?? ()

(gdb) f 2 
#2  0xffffffff81257f6c in iput_final (inode=<optimised out>) at ../fs/inode.c:1513

(gdb) l 1480,1520
1480	static void iput_final(struct inode *inode)
1481	{
1482		struct super_block *sb = inode->i_sb;
1483		const struct super_operations *op = inode->i_sb->s_op;
1484		int drop;
1485	
1486		WARN_ON(inode->i_state & I_NEW);
1487	
1488		if (op->drop_inode)
1489			drop = op->drop_inode(inode);
1490		else
1491			drop = generic_drop_inode(inode);
1492	
1493		if (!drop && (sb->s_flags & MS_ACTIVE)) {
1494			inode_add_lru(inode);
1495			spin_unlock(&inode->i_lock);
1496			return;
1497		}
1498	
1499		if (!drop) {
1500			inode->i_state |= I_WILL_FREE;
1501			spin_unlock(&inode->i_lock);
1502			write_inode_now(inode, 1);
1503			spin_lock(&inode->i_lock);
1504			WARN_ON(inode->i_state & I_NEW);
1505			inode->i_state &= ~I_WILL_FREE;
1506		}
1507	
1508		inode->i_state |= I_FREEING;
1509		if (!list_empty(&inode->i_lru))
1510			inode_lru_list_del(inode);
1511		spin_unlock(&inode->i_lock);
1512	
1513		evict(inode);
1514	}