Commit 5ccb4a78 authored by Al Viro's avatar Al Viro

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: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 01cd9fef
...@@ -200,13 +200,13 @@ void minix_free_inode(struct inode * inode) ...@@ -200,13 +200,13 @@ void minix_free_inode(struct inode * inode)
ino = inode->i_ino; ino = inode->i_ino;
if (ino < 1 || ino > sbi->s_ninodes) { if (ino < 1 || ino > sbi->s_ninodes) {
printk("minix_free_inode: inode 0 or nonexistent inode\n"); printk("minix_free_inode: inode 0 or nonexistent inode\n");
goto out; return;
} }
bit = ino & ((1<<k) - 1); bit = ino & ((1<<k) - 1);
ino >>= k; ino >>= k;
if (ino >= sbi->s_imap_blocks) { if (ino >= sbi->s_imap_blocks) {
printk("minix_free_inode: nonexistent imap in superblock\n"); printk("minix_free_inode: nonexistent imap in superblock\n");
goto out; return;
} }
minix_clear_inode(inode); /* clear on-disk copy */ minix_clear_inode(inode); /* clear on-disk copy */
...@@ -217,8 +217,6 @@ void minix_free_inode(struct inode * inode) ...@@ -217,8 +217,6 @@ void minix_free_inode(struct inode * inode)
printk("minix_free_inode: bit %lu already cleared\n", bit); printk("minix_free_inode: bit %lu already cleared\n", bit);
spin_unlock(&bitmap_lock); spin_unlock(&bitmap_lock);
mark_buffer_dirty(bh); 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) struct inode *minix_new_inode(const struct inode *dir, int mode, int *error)
......
...@@ -24,11 +24,16 @@ static int minix_write_inode(struct inode *inode, ...@@ -24,11 +24,16 @@ static int minix_write_inode(struct inode *inode,
static int minix_statfs(struct dentry *dentry, struct kstatfs *buf); static int minix_statfs(struct dentry *dentry, struct kstatfs *buf);
static int minix_remount (struct super_block * sb, int * flags, char * data); 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); truncate_inode_pages(&inode->i_data, 0);
if (!inode->i_nlink) {
inode->i_size = 0; inode->i_size = 0;
minix_truncate(inode); minix_truncate(inode);
}
invalidate_inode_buffers(inode);
end_writeback(inode);
if (!inode->i_nlink)
minix_free_inode(inode); minix_free_inode(inode);
} }
...@@ -96,7 +101,7 @@ static const struct super_operations minix_sops = { ...@@ -96,7 +101,7 @@ static const struct super_operations minix_sops = {
.alloc_inode = minix_alloc_inode, .alloc_inode = minix_alloc_inode,
.destroy_inode = minix_destroy_inode, .destroy_inode = minix_destroy_inode,
.write_inode = minix_write_inode, .write_inode = minix_write_inode,
.delete_inode = minix_delete_inode, .evict_inode = minix_evict_inode,
.put_super = minix_put_super, .put_super = minix_put_super,
.statfs = minix_statfs, .statfs = minix_statfs,
.remount_fs = minix_remount, .remount_fs = minix_remount,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment