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:
@@ -1478,22 +1478,38 @@ xfs_vm_direct_IO(
|
||||
if (rw & WRITE) {
|
||||
iocb->private = xfs_alloc_ioend(inode, IO_NEW);
|
||||
|
||||
ret = blockdev_direct_IO_no_locking(rw, iocb, inode, bdev, iov,
|
||||
offset, nr_segs,
|
||||
xfs_get_blocks_direct,
|
||||
xfs_end_io_direct_write);
|
||||
ret = __blockdev_direct_IO(rw, iocb, inode, bdev, iov,
|
||||
offset, nr_segs,
|
||||
xfs_get_blocks_direct,
|
||||
xfs_end_io_direct_write, NULL, 0);
|
||||
if (ret != -EIOCBQUEUED && iocb->private)
|
||||
xfs_destroy_ioend(iocb->private);
|
||||
} else {
|
||||
ret = blockdev_direct_IO_no_locking(rw, iocb, inode, bdev, iov,
|
||||
offset, nr_segs,
|
||||
xfs_get_blocks_direct,
|
||||
NULL);
|
||||
ret = __blockdev_direct_IO(rw, iocb, inode, bdev, iov,
|
||||
offset, nr_segs,
|
||||
xfs_get_blocks_direct,
|
||||
NULL, NULL, 0);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
STATIC void
|
||||
xfs_vm_write_failed(
|
||||
struct address_space *mapping,
|
||||
loff_t to)
|
||||
{
|
||||
struct inode *inode = mapping->host;
|
||||
|
||||
if (to > inode->i_size) {
|
||||
struct iattr ia = {
|
||||
.ia_valid = ATTR_SIZE | ATTR_FORCE,
|
||||
.ia_size = inode->i_size,
|
||||
};
|
||||
xfs_setattr(XFS_I(inode), &ia, XFS_ATTR_NOLOCK);
|
||||
}
|
||||
}
|
||||
|
||||
STATIC int
|
||||
xfs_vm_write_begin(
|
||||
struct file *file,
|
||||
@@ -1504,9 +1520,31 @@ xfs_vm_write_begin(
|
||||
struct page **pagep,
|
||||
void **fsdata)
|
||||
{
|
||||
*pagep = NULL;
|
||||
return block_write_begin(file, mapping, pos, len, flags | AOP_FLAG_NOFS,
|
||||
pagep, fsdata, xfs_get_blocks);
|
||||
int ret;
|
||||
|
||||
ret = block_write_begin(mapping, pos, len, flags | AOP_FLAG_NOFS,
|
||||
pagep, xfs_get_blocks);
|
||||
if (unlikely(ret))
|
||||
xfs_vm_write_failed(mapping, pos + len);
|
||||
return ret;
|
||||
}
|
||||
|
||||
STATIC int
|
||||
xfs_vm_write_end(
|
||||
struct file *file,
|
||||
struct address_space *mapping,
|
||||
loff_t pos,
|
||||
unsigned len,
|
||||
unsigned copied,
|
||||
struct page *page,
|
||||
void *fsdata)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = generic_write_end(file, mapping, pos, len, copied, page, fsdata);
|
||||
if (unlikely(ret < len))
|
||||
xfs_vm_write_failed(mapping, pos + len);
|
||||
return ret;
|
||||
}
|
||||
|
||||
STATIC sector_t
|
||||
@@ -1551,7 +1589,7 @@ const struct address_space_operations xfs_address_space_operations = {
|
||||
.releasepage = xfs_vm_releasepage,
|
||||
.invalidatepage = xfs_vm_invalidatepage,
|
||||
.write_begin = xfs_vm_write_begin,
|
||||
.write_end = generic_write_end,
|
||||
.write_end = xfs_vm_write_end,
|
||||
.bmap = xfs_vm_bmap,
|
||||
.direct_IO = xfs_vm_direct_IO,
|
||||
.migratepage = buffer_migrate_page,
|
||||
|
@@ -80,7 +80,7 @@ xfs_mark_inode_dirty_sync(
|
||||
{
|
||||
struct inode *inode = VFS_I(ip);
|
||||
|
||||
if (!(inode->i_state & (I_WILL_FREE|I_FREEING|I_CLEAR)))
|
||||
if (!(inode->i_state & (I_WILL_FREE|I_FREEING)))
|
||||
mark_inode_dirty_sync(inode);
|
||||
}
|
||||
|
||||
@@ -90,7 +90,7 @@ xfs_mark_inode_dirty(
|
||||
{
|
||||
struct inode *inode = VFS_I(ip);
|
||||
|
||||
if (!(inode->i_state & (I_WILL_FREE|I_FREEING|I_CLEAR)))
|
||||
if (!(inode->i_state & (I_WILL_FREE|I_FREEING)))
|
||||
mark_inode_dirty(inode);
|
||||
}
|
||||
|
||||
@@ -540,21 +540,6 @@ xfs_vn_setattr(
|
||||
return -xfs_setattr(XFS_I(dentry->d_inode), iattr, 0);
|
||||
}
|
||||
|
||||
/*
|
||||
* block_truncate_page can return an error, but we can't propagate it
|
||||
* at all here. Leave a complaint + stack trace in the syslog because
|
||||
* this could be bad. If it is bad, we need to propagate the error further.
|
||||
*/
|
||||
STATIC void
|
||||
xfs_vn_truncate(
|
||||
struct inode *inode)
|
||||
{
|
||||
int error;
|
||||
error = block_truncate_page(inode->i_mapping, inode->i_size,
|
||||
xfs_get_blocks);
|
||||
WARN_ON(error);
|
||||
}
|
||||
|
||||
STATIC long
|
||||
xfs_vn_fallocate(
|
||||
struct inode *inode,
|
||||
@@ -694,7 +679,6 @@ xfs_vn_fiemap(
|
||||
|
||||
static const struct inode_operations xfs_inode_operations = {
|
||||
.check_acl = xfs_check_acl,
|
||||
.truncate = xfs_vn_truncate,
|
||||
.getattr = xfs_vn_getattr,
|
||||
.setattr = xfs_vn_setattr,
|
||||
.setxattr = generic_setxattr,
|
||||
|
@@ -156,8 +156,6 @@
|
||||
*/
|
||||
#define xfs_sort(a,n,s,fn) sort(a,n,s,fn,NULL)
|
||||
#define xfs_stack_trace() dump_stack()
|
||||
#define xfs_itruncate_data(ip, off) \
|
||||
(-vmtruncate(VFS_I(ip), (off)))
|
||||
|
||||
|
||||
/* Move the kernel do_div definition off to one side */
|
||||
|
@@ -1100,13 +1100,15 @@ xfs_fs_write_inode(
|
||||
}
|
||||
|
||||
STATIC void
|
||||
xfs_fs_clear_inode(
|
||||
xfs_fs_evict_inode(
|
||||
struct inode *inode)
|
||||
{
|
||||
xfs_inode_t *ip = XFS_I(inode);
|
||||
|
||||
trace_xfs_clear_inode(ip);
|
||||
trace_xfs_evict_inode(ip);
|
||||
|
||||
truncate_inode_pages(&inode->i_data, 0);
|
||||
end_writeback(inode);
|
||||
XFS_STATS_INC(vn_rele);
|
||||
XFS_STATS_INC(vn_remove);
|
||||
XFS_STATS_DEC(vn_active);
|
||||
@@ -1622,7 +1624,7 @@ static const struct super_operations xfs_super_operations = {
|
||||
.destroy_inode = xfs_fs_destroy_inode,
|
||||
.dirty_inode = xfs_fs_dirty_inode,
|
||||
.write_inode = xfs_fs_write_inode,
|
||||
.clear_inode = xfs_fs_clear_inode,
|
||||
.evict_inode = xfs_fs_evict_inode,
|
||||
.put_super = xfs_fs_put_super,
|
||||
.sync_fs = xfs_fs_sync_fs,
|
||||
.freeze_fs = xfs_fs_freeze,
|
||||
|
@@ -581,7 +581,7 @@ DEFINE_INODE_EVENT(xfs_ioctl_setattr);
|
||||
DEFINE_INODE_EVENT(xfs_file_fsync);
|
||||
DEFINE_INODE_EVENT(xfs_destroy_inode);
|
||||
DEFINE_INODE_EVENT(xfs_write_inode);
|
||||
DEFINE_INODE_EVENT(xfs_clear_inode);
|
||||
DEFINE_INODE_EVENT(xfs_evict_inode);
|
||||
|
||||
DEFINE_INODE_EVENT(xfs_dquot_dqalloc);
|
||||
DEFINE_INODE_EVENT(xfs_dquot_dqdetach);
|
||||
|
Reference in New Issue
Block a user