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:
commit
5f248c9c25
205 changed files with 2594 additions and 2485 deletions
|
@ -167,11 +167,16 @@ int ext4_truncate_restart_trans(handle_t *handle, struct inode *inode,
|
|||
/*
|
||||
* Called at the last iput() if i_nlink is zero.
|
||||
*/
|
||||
void ext4_delete_inode(struct inode *inode)
|
||||
void ext4_evict_inode(struct inode *inode)
|
||||
{
|
||||
handle_t *handle;
|
||||
int err;
|
||||
|
||||
if (inode->i_nlink) {
|
||||
truncate_inode_pages(&inode->i_data, 0);
|
||||
goto no_delete;
|
||||
}
|
||||
|
||||
if (!is_bad_inode(inode))
|
||||
dquot_initialize(inode);
|
||||
|
||||
|
@ -246,13 +251,13 @@ void ext4_delete_inode(struct inode *inode)
|
|||
*/
|
||||
if (ext4_mark_inode_dirty(handle, inode))
|
||||
/* If that failed, just do the required in-core inode clear. */
|
||||
clear_inode(inode);
|
||||
ext4_clear_inode(inode);
|
||||
else
|
||||
ext4_free_inode(handle, inode);
|
||||
ext4_journal_stop(handle);
|
||||
return;
|
||||
no_delete:
|
||||
clear_inode(inode); /* We must guarantee clearing of inode... */
|
||||
ext4_clear_inode(inode); /* We must guarantee clearing of inode... */
|
||||
}
|
||||
|
||||
typedef struct {
|
||||
|
@ -1602,11 +1607,9 @@ retry:
|
|||
*pagep = page;
|
||||
|
||||
if (ext4_should_dioread_nolock(inode))
|
||||
ret = block_write_begin(file, mapping, pos, len, flags, pagep,
|
||||
fsdata, ext4_get_block_write);
|
||||
ret = __block_write_begin(page, pos, len, ext4_get_block_write);
|
||||
else
|
||||
ret = block_write_begin(file, mapping, pos, len, flags, pagep,
|
||||
fsdata, ext4_get_block);
|
||||
ret = __block_write_begin(page, pos, len, ext4_get_block);
|
||||
|
||||
if (!ret && ext4_should_journal_data(inode)) {
|
||||
ret = walk_page_buffers(handle, page_buffers(page),
|
||||
|
@ -1617,7 +1620,7 @@ retry:
|
|||
unlock_page(page);
|
||||
page_cache_release(page);
|
||||
/*
|
||||
* block_write_begin may have instantiated a few blocks
|
||||
* __block_write_begin may have instantiated a few blocks
|
||||
* outside i_size. Trim these off again. Don't need
|
||||
* i_size_read because we hold i_mutex.
|
||||
*
|
||||
|
@ -3205,8 +3208,7 @@ retry:
|
|||
}
|
||||
*pagep = page;
|
||||
|
||||
ret = block_write_begin(file, mapping, pos, len, flags, pagep, fsdata,
|
||||
ext4_da_get_block_prep);
|
||||
ret = __block_write_begin(page, pos, len, ext4_da_get_block_prep);
|
||||
if (ret < 0) {
|
||||
unlock_page(page);
|
||||
ext4_journal_stop(handle);
|
||||
|
@ -3565,15 +3567,24 @@ static ssize_t ext4_ind_direct_IO(int rw, struct kiocb *iocb,
|
|||
|
||||
retry:
|
||||
if (rw == READ && ext4_should_dioread_nolock(inode))
|
||||
ret = blockdev_direct_IO_no_locking(rw, iocb, inode,
|
||||
ret = __blockdev_direct_IO(rw, iocb, inode,
|
||||
inode->i_sb->s_bdev, iov,
|
||||
offset, nr_segs,
|
||||
ext4_get_block, NULL);
|
||||
else
|
||||
ext4_get_block, NULL, NULL, 0);
|
||||
else {
|
||||
ret = blockdev_direct_IO(rw, iocb, inode,
|
||||
inode->i_sb->s_bdev, iov,
|
||||
offset, nr_segs,
|
||||
ext4_get_block, NULL);
|
||||
|
||||
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 && ext4_should_retry_alloc(inode->i_sb, &retries))
|
||||
goto retry;
|
||||
|
||||
|
@ -5536,11 +5547,19 @@ int ext4_setattr(struct dentry *dentry, struct iattr *attr)
|
|||
ext4_truncate(inode);
|
||||
}
|
||||
|
||||
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 inode_setattr's call to ext4_truncate failed to get a
|
||||
* transaction handle at all, we need to clean up the in-core
|
||||
* orphan list manually. */
|
||||
if (!rc) {
|
||||
setattr_copy(inode, attr);
|
||||
mark_inode_dirty(inode);
|
||||
}
|
||||
|
||||
/*
|
||||
* If the call to ext4_truncate failed to get a transaction handle at
|
||||
* all, we need to clean up the in-core orphan list manually.
|
||||
*/
|
||||
if (inode->i_nlink)
|
||||
ext4_orphan_del(NULL, inode);
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue