2013年(22)
分类: LINUX
2013-08-04 18:27:59
Q:I_FREEING标识inode正在被释放,由于竞争,drop_pagecache_sb(),igrab()等函数中看到的I_FREEING,I_WILL_FREE置位的inode是否可能正在被释放到slab?
A:不会,由于supberblock的i_sb_list受inode_lock保护,drop_pagecache_sb()和dispose_list()竞争时,如果drop_pagecache_sb竞争到了inode_lock锁,dispose_list()要销毁inode就必须等待,确保drop_pagecache_sb()可以安全的遍历inode;如果dispose_list()竞争到了inode_lock锁,在destroy_inode()之前必须先将inode从icache和i_sb_list中移除,此后drop_pagecache_sb()获得锁,自然就无法看到I_FREEING置位的inode.也就是说,只要获得了inode_lock锁就可以任意遍历icache和superblock中的inode,无需担心inode被销毁.
Q:generic_sync_sb_inodes()中为什么不会看到I_FREEING置位的inode?
A:inode在置位I_FREEING以前都会先从superblock的io,dirty或全局inode_unused链表中移除,generic_sync_sb_inodes()只回写superblock的io和dirty链表中的inode,自然不会看到I_FREEING置位的inode.
Q:__sync_single_inode()中,什么情况下inode的I_FREEING标志会置位?
1.generic_sync_sb_inodes()->__writeback_single_inode()->__sync_single_inode()情况下,在generic_sync_sb_inodes()中会增加inode的引用计数,因此在__sync_single_inode()不会出现I_FREEING置位的情况.
2.generic_forget_inode()->write_inode_now()->__writeback_single_inode()->__sync_single_inode()情况下,inode的引用计数为0,__sync_single_inode()会释放inode_lock,此时sys_umount()会置位inode的I_FREEING.