Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs-2.6
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs-2.6: (96 commits) no need for list_for_each_entry_safe()/resetting with superblock list Fix sget() race with failing mount vfs: don't hold s_umount over close_bdev_exclusive() call sysv: do not mark superblock dirty on remount sysv: do not mark superblock dirty on mount btrfs: remove junk sb_dirt change BFS: clean up the superblock usage AFFS: wait for sb synchronization when needed AFFS: clean up dirty flag usage cifs: truncate fallout mbcache: fix shrinker function return value mbcache: Remove unused features add f_flags to struct statfs(64) pass a struct path to vfs_statfs update VFS documentation for method changes. All filesystems that need invalidate_inode_buffers() are doing that explicitly convert remaining ->clear_inode() to ->evict_inode() Make ->drop_inode() just return whether inode needs to be dropped fs/inode.c:clear_inode() is gone fs/inode.c:evict() doesn't care about delete vs. non-delete paths now ... Fix up trivial conflicts in fs/nilfs2/super.c
This commit is contained in:
@@ -119,20 +119,8 @@ void ext3_free_inode (handle_t *handle, struct inode * inode)
|
||||
ino = inode->i_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);
|
||||
|
||||
/* Do this BEFORE marking the inode not in use or returning an error */
|
||||
clear_inode (inode);
|
||||
|
||||
es = EXT3_SB(sb)->s_es;
|
||||
if (ino < EXT3_FIRST_INO(sb) || ino > le32_to_cpu(es->s_inodes_count)) {
|
||||
ext3_error (sb, "ext3_free_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;
|
||||
int want_delete = 0;
|
||||
|
||||
if (!is_bad_inode(inode))
|
||||
if (!inode->i_nlink && !is_bad_inode(inode)) {
|
||||
dquot_initialize(inode);
|
||||
want_delete = 1;
|
||||
}
|
||||
|
||||
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;
|
||||
|
||||
handle = start_transaction(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
|
||||
* fails.
|
||||
*/
|
||||
if (ext3_mark_inode_dirty(handle, inode))
|
||||
/* If that failed, just do the required in-core inode clear. */
|
||||
clear_inode(inode);
|
||||
else
|
||||
if (ext3_mark_inode_dirty(handle, inode)) {
|
||||
/* If that failed, just dquot_drop() and be done with that */
|
||||
dquot_drop(inode);
|
||||
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_journal_stop(handle);
|
||||
return;
|
||||
no_delete:
|
||||
clear_inode(inode); /* We must guarantee clearing of inode... */
|
||||
end_writeback(inode);
|
||||
dquot_drop(inode);
|
||||
}
|
||||
|
||||
typedef struct {
|
||||
@@ -1212,8 +1229,7 @@ retry:
|
||||
ret = PTR_ERR(handle);
|
||||
goto out;
|
||||
}
|
||||
ret = block_write_begin(file, mapping, pos, len, flags, pagep, fsdata,
|
||||
ext3_get_block);
|
||||
ret = __block_write_begin(page, pos, len, ext3_get_block);
|
||||
if (ret)
|
||||
goto write_begin_failed;
|
||||
|
||||
@@ -1798,6 +1814,17 @@ retry:
|
||||
ret = blockdev_direct_IO(rw, iocb, inode, inode->i_sb->s_bdev, iov,
|
||||
offset, nr_segs,
|
||||
ext3_get_block, NULL);
|
||||
/*
|
||||
* In case of error extending write may have instantiated a few
|
||||
* blocks outside i_size. Trim these off again.
|
||||
*/
|
||||
if (unlikely((rw & WRITE) && ret < 0)) {
|
||||
loff_t isize = i_size_read(inode);
|
||||
loff_t end = offset + iov_length(iov, nr_segs);
|
||||
|
||||
if (end > isize)
|
||||
vmtruncate(inode, isize);
|
||||
}
|
||||
if (ret == -ENOSPC && ext3_should_retry_alloc(inode->i_sb, &retries))
|
||||
goto retry;
|
||||
|
||||
@@ -2560,7 +2587,7 @@ out_stop:
|
||||
* 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.
|
||||
* 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.
|
||||
*/
|
||||
if (inode->i_nlink)
|
||||
@@ -3204,9 +3231,17 @@ int ext3_setattr(struct dentry *dentry, struct iattr *attr)
|
||||
ext3_journal_stop(handle);
|
||||
}
|
||||
|
||||
rc = inode_setattr(inode, attr);
|
||||
if ((attr->ia_valid & ATTR_SIZE) &&
|
||||
attr->ia_size != i_size_read(inode)) {
|
||||
rc = vmtruncate(inode, attr->ia_size);
|
||||
if (rc)
|
||||
goto err_out;
|
||||
}
|
||||
|
||||
if (!rc && (ia_valid & ATTR_MODE))
|
||||
setattr_copy(inode, attr);
|
||||
mark_inode_dirty(inode);
|
||||
|
||||
if (ia_valid & ATTR_MODE)
|
||||
rc = ext3_acl_chmod(inode);
|
||||
|
||||
err_out:
|
||||
|
@@ -527,17 +527,6 @@ static void destroy_inodecache(void)
|
||||
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)
|
||||
{
|
||||
#if defined(CONFIG_QUOTA)
|
||||
@@ -780,14 +769,13 @@ static const struct super_operations ext3_sops = {
|
||||
.destroy_inode = ext3_destroy_inode,
|
||||
.write_inode = ext3_write_inode,
|
||||
.dirty_inode = ext3_dirty_inode,
|
||||
.delete_inode = ext3_delete_inode,
|
||||
.evict_inode = ext3_evict_inode,
|
||||
.put_super = ext3_put_super,
|
||||
.sync_fs = ext3_sync_fs,
|
||||
.freeze_fs = ext3_freeze,
|
||||
.unfreeze_fs = ext3_unfreeze,
|
||||
.statfs = ext3_statfs,
|
||||
.remount_fs = ext3_remount,
|
||||
.clear_inode = ext3_clear_inode,
|
||||
.show_options = ext3_show_options,
|
||||
#ifdef CONFIG_QUOTA
|
||||
.quota_read = ext3_quota_read,
|
||||
|
@@ -1139,7 +1139,7 @@ ext3_xattr_cache_insert(struct buffer_head *bh)
|
||||
ea_bdebug(bh, "out of memory");
|
||||
return;
|
||||
}
|
||||
error = mb_cache_entry_insert(ce, bh->b_bdev, bh->b_blocknr, &hash);
|
||||
error = mb_cache_entry_insert(ce, bh->b_bdev, bh->b_blocknr, hash);
|
||||
if (error) {
|
||||
mb_cache_entry_free(ce);
|
||||
if (error == -EBUSY) {
|
||||
@@ -1211,8 +1211,8 @@ ext3_xattr_cache_find(struct inode *inode, struct ext3_xattr_header *header,
|
||||
return NULL; /* never share */
|
||||
ea_idebug(inode, "looking for cached blocks [%x]", (int)hash);
|
||||
again:
|
||||
ce = mb_cache_entry_find_first(ext3_xattr_cache, 0,
|
||||
inode->i_sb->s_bdev, hash);
|
||||
ce = mb_cache_entry_find_first(ext3_xattr_cache, inode->i_sb->s_bdev,
|
||||
hash);
|
||||
while (ce) {
|
||||
struct buffer_head *bh;
|
||||
|
||||
@@ -1237,7 +1237,7 @@ again:
|
||||
return bh;
|
||||
}
|
||||
brelse(bh);
|
||||
ce = mb_cache_entry_find_next(ce, 0, inode->i_sb->s_bdev, hash);
|
||||
ce = mb_cache_entry_find_next(ce, inode->i_sb->s_bdev, hash);
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
@@ -1313,9 +1313,7 @@ static void ext3_xattr_rehash(struct ext3_xattr_header *header,
|
||||
int __init
|
||||
init_ext3_xattr(void)
|
||||
{
|
||||
ext3_xattr_cache = mb_cache_create("ext3_xattr", NULL,
|
||||
sizeof(struct mb_cache_entry) +
|
||||
sizeof(((struct mb_cache_entry *) 0)->e_indexes[0]), 1, 6);
|
||||
ext3_xattr_cache = mb_cache_create("ext3_xattr", 6);
|
||||
if (!ext3_xattr_cache)
|
||||
return -ENOMEM;
|
||||
return 0;
|
||||
|
Reference in New Issue
Block a user