Commit ac14a95b authored by Al Viro's avatar Al Viro

convert ext3 to ->evict_inode()

Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 0f3f63a4
...@@ -119,20 +119,8 @@ void ext3_free_inode (handle_t *handle, struct inode * inode) ...@@ -119,20 +119,8 @@ void ext3_free_inode (handle_t *handle, struct inode * inode)
ino = inode->i_ino; ino = inode->i_ino;
ext3_debug ("freeing inode %lu\n", ino); ext3_debug ("freeing inode %lu\n", ino);
/*
* Note: we must free any quota before locking the superblock,
* as writing the quota to disk may need the lock as well.
*/
dquot_initialize(inode);
ext3_xattr_delete_inode(handle, inode);
dquot_free_inode(inode);
dquot_drop(inode);
is_directory = S_ISDIR(inode->i_mode); is_directory = S_ISDIR(inode->i_mode);
/* Do this BEFORE marking the inode not in use or returning an error */
clear_inode (inode);
es = EXT3_SB(sb)->s_es; es = EXT3_SB(sb)->s_es;
if (ino < EXT3_FIRST_INO(sb) || ino > le32_to_cpu(es->s_inodes_count)) { if (ino < EXT3_FIRST_INO(sb) || ino > le32_to_cpu(es->s_inodes_count)) {
ext3_error (sb, "ext3_free_inode", ext3_error (sb, "ext3_free_inode",
......
...@@ -190,18 +190,28 @@ static int truncate_restart_transaction(handle_t *handle, struct inode *inode) ...@@ -190,18 +190,28 @@ static int truncate_restart_transaction(handle_t *handle, struct inode *inode)
} }
/* /*
* Called at the last iput() if i_nlink is zero. * Called at inode eviction from icache
*/ */
void ext3_delete_inode (struct inode * inode) void ext3_evict_inode (struct inode *inode)
{ {
struct ext3_block_alloc_info *rsv;
handle_t *handle; handle_t *handle;
int want_delete = 0;
if (!is_bad_inode(inode)) if (!inode->i_nlink && !is_bad_inode(inode)) {
dquot_initialize(inode); dquot_initialize(inode);
want_delete = 1;
}
truncate_inode_pages(&inode->i_data, 0); truncate_inode_pages(&inode->i_data, 0);
if (is_bad_inode(inode)) ext3_discard_reservation(inode);
rsv = EXT3_I(inode)->i_block_alloc_info;
EXT3_I(inode)->i_block_alloc_info = NULL;
if (unlikely(rsv))
kfree(rsv);
if (!want_delete)
goto no_delete; goto no_delete;
handle = start_transaction(inode); handle = start_transaction(inode);
...@@ -238,15 +248,22 @@ void ext3_delete_inode (struct inode * inode) ...@@ -238,15 +248,22 @@ void ext3_delete_inode (struct inode * inode)
* having errors), but we can't free the inode if the mark_dirty * having errors), but we can't free the inode if the mark_dirty
* fails. * fails.
*/ */
if (ext3_mark_inode_dirty(handle, inode)) if (ext3_mark_inode_dirty(handle, inode)) {
/* If that failed, just do the required in-core inode clear. */ /* If that failed, just dquot_drop() and be done with that */
clear_inode(inode); dquot_drop(inode);
else end_writeback(inode);
} else {
ext3_xattr_delete_inode(handle, inode);
dquot_free_inode(inode);
dquot_drop(inode);
end_writeback(inode);
ext3_free_inode(handle, inode); ext3_free_inode(handle, inode);
}
ext3_journal_stop(handle); ext3_journal_stop(handle);
return; return;
no_delete: no_delete:
clear_inode(inode); /* We must guarantee clearing of inode... */ end_writeback(inode);
dquot_drop(inode);
} }
typedef struct { typedef struct {
...@@ -2564,7 +2581,7 @@ void ext3_truncate(struct inode *inode) ...@@ -2564,7 +2581,7 @@ void ext3_truncate(struct inode *inode)
* If this was a simple ftruncate(), and the file will remain alive * If this was a simple ftruncate(), and the file will remain alive
* then we need to clear up the orphan record which we created above. * then we need to clear up the orphan record which we created above.
* However, if this was a real unlink then we were called by * However, if this was a real unlink then we were called by
* ext3_delete_inode(), and we allow that function to clean up the * ext3_evict_inode(), and we allow that function to clean up the
* orphan info for us. * orphan info for us.
*/ */
if (inode->i_nlink) if (inode->i_nlink)
......
...@@ -527,17 +527,6 @@ static void destroy_inodecache(void) ...@@ -527,17 +527,6 @@ static void destroy_inodecache(void)
kmem_cache_destroy(ext3_inode_cachep); kmem_cache_destroy(ext3_inode_cachep);
} }
static void ext3_clear_inode(struct inode *inode)
{
struct ext3_block_alloc_info *rsv = EXT3_I(inode)->i_block_alloc_info;
dquot_drop(inode);
ext3_discard_reservation(inode);
EXT3_I(inode)->i_block_alloc_info = NULL;
if (unlikely(rsv))
kfree(rsv);
}
static inline void ext3_show_quota_options(struct seq_file *seq, struct super_block *sb) static inline void ext3_show_quota_options(struct seq_file *seq, struct super_block *sb)
{ {
#if defined(CONFIG_QUOTA) #if defined(CONFIG_QUOTA)
...@@ -783,14 +772,13 @@ static const struct super_operations ext3_sops = { ...@@ -783,14 +772,13 @@ static const struct super_operations ext3_sops = {
.destroy_inode = ext3_destroy_inode, .destroy_inode = ext3_destroy_inode,
.write_inode = ext3_write_inode, .write_inode = ext3_write_inode,
.dirty_inode = ext3_dirty_inode, .dirty_inode = ext3_dirty_inode,
.delete_inode = ext3_delete_inode, .evict_inode = ext3_evict_inode,
.put_super = ext3_put_super, .put_super = ext3_put_super,
.sync_fs = ext3_sync_fs, .sync_fs = ext3_sync_fs,
.freeze_fs = ext3_freeze, .freeze_fs = ext3_freeze,
.unfreeze_fs = ext3_unfreeze, .unfreeze_fs = ext3_unfreeze,
.statfs = ext3_statfs, .statfs = ext3_statfs,
.remount_fs = ext3_remount, .remount_fs = ext3_remount,
.clear_inode = ext3_clear_inode,
.show_options = ext3_show_options, .show_options = ext3_show_options,
#ifdef CONFIG_QUOTA #ifdef CONFIG_QUOTA
.quota_read = ext3_quota_read, .quota_read = ext3_quota_read,
......
...@@ -896,7 +896,7 @@ int ext3_get_blocks_handle(handle_t *handle, struct inode *inode, ...@@ -896,7 +896,7 @@ int ext3_get_blocks_handle(handle_t *handle, struct inode *inode,
extern struct inode *ext3_iget(struct super_block *, unsigned long); extern struct inode *ext3_iget(struct super_block *, unsigned long);
extern int ext3_write_inode (struct inode *, struct writeback_control *); extern int ext3_write_inode (struct inode *, struct writeback_control *);
extern int ext3_setattr (struct dentry *, struct iattr *); extern int ext3_setattr (struct dentry *, struct iattr *);
extern void ext3_delete_inode (struct inode *); extern void ext3_evict_inode (struct inode *);
extern int ext3_sync_inode (handle_t *, struct inode *); extern int ext3_sync_inode (handle_t *, struct inode *);
extern void ext3_discard_reservation (struct inode *); extern void ext3_discard_reservation (struct inode *);
extern void ext3_dirty_inode(struct inode *); extern void ext3_dirty_inode(struct inode *);
......
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