switch minix to ->evict_inode(), fix write_inode/delete_inode race
PATCH 12/58 switch minix to ->evict_inode(), fix write_inode/delete_inode race
We need to wait for completion of possible writeback in progress before we clear on-disk inode during deletion.
Signed-off-by Al Viro <[email protected]>
--- fs/minix/bitmap.c | 6 ++---- fs/minix/inode.c | 15 ++++++++++----- 2 files changed, 12 insertions(+), 9 deletions(-)
fs/minix/bitmap.c +2 -4
@@ -200,13 +200,13 @@ void minix_free_inode(struct inode * inode) ino = inode->i_ino;if (ino <1 || ino > sbi->s_ninodes) {printk ("minix_free_inode: inode 0 or nonexistent inode\n" ); - goto out; +return ; } bit = ino & ((1 <<k) -1 ); ino >>= k;if (ino >= sbi->s_imap_blocks) {printk ("minix_free_inode: nonexistent imap in superblock\n" ); - goto out; +return ; }minix_clear_inode (inode);/* clear on-disk copy */
@@ -217,8 +217,6 @@ void minix_free_inode(struct inode * inode)printk ("minix_free_inode: bit %lu already cleared\n" , bit);spin_unlock (&bitmap_lock);mark_buffer_dirty (bh); - out: -clear_inode (inode);/* clear in-memory copy */ }struct inode *minix_new_inode (const struct inode *dir,int mode,int *error)
fs/minix/inode.c +10 -5
@@ -24,12 +24,17 @@ static int minix_write_inode(struct inode *inode,static int minix_statfs (struct dentry *dentry,struct kstatfs *buf);static int minix_remount (struct super_block * sb,int * flags,char * data); -static void minix_delete_inode (struct inode *inode) +static void minix_evict_inode (struct inode *inode) {truncate_inode_pages (&inode->i_data,0 ); - inode->i_size =0 ; -minix_truncate (inode); -minix_free_inode (inode); +if (!inode->i_nlink) { + inode->i_size =0 ; +minix_truncate (inode); + } +invalidate_inode_buffers (inode); +end_writeback (inode); +if (!inode->i_nlink) +minix_free_inode (inode); }static void minix_put_super (struct super_block *sb)
@@ -96,7 +101,7 @@ static const struct super_operations minix_sops = { .alloc_inode = minix_alloc_inode, .destroy_inode = minix_destroy_inode, .write_inode = minix_write_inode, - .delete_inode = minix_delete_inode, + .evict_inode = minix_evict_inode, .put_super = minix_put_super, .statfs = minix_statfs, .remount_fs = minix_remount,
Signature · 1 line
1.5.6.5