Merge branch 'write_inode2' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs-2.6
* 'write_inode2' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs-2.6: pass writeback_control to ->write_inode make sure data is on disk before calling ->write_inode
This commit is contained in:
commit
9467c4fdd6
|
@ -121,7 +121,7 @@ struct adfs_discmap {
|
|||
|
||||
/* Inode stuff */
|
||||
struct inode *adfs_iget(struct super_block *sb, struct object_info *obj);
|
||||
int adfs_write_inode(struct inode *inode,int unused);
|
||||
int adfs_write_inode(struct inode *inode, struct writeback_control *wbc);
|
||||
int adfs_notify_change(struct dentry *dentry, struct iattr *attr);
|
||||
|
||||
/* map.c */
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
*/
|
||||
#include <linux/smp_lock.h>
|
||||
#include <linux/buffer_head.h>
|
||||
#include <linux/writeback.h>
|
||||
#include "adfs.h"
|
||||
|
||||
/*
|
||||
|
@ -360,7 +361,7 @@ adfs_notify_change(struct dentry *dentry, struct iattr *attr)
|
|||
* The adfs-specific inode data has already been updated by
|
||||
* adfs_notify_change()
|
||||
*/
|
||||
int adfs_write_inode(struct inode *inode, int wait)
|
||||
int adfs_write_inode(struct inode *inode, struct writeback_control *wbc)
|
||||
{
|
||||
struct super_block *sb = inode->i_sb;
|
||||
struct object_info obj;
|
||||
|
@ -375,7 +376,7 @@ int adfs_write_inode(struct inode *inode, int wait)
|
|||
obj.attr = ADFS_I(inode)->attr;
|
||||
obj.size = inode->i_size;
|
||||
|
||||
ret = adfs_dir_update(sb, &obj, wait);
|
||||
ret = adfs_dir_update(sb, &obj, wbc->sync_mode == WB_SYNC_ALL);
|
||||
unlock_kernel();
|
||||
return ret;
|
||||
}
|
||||
|
|
|
@ -175,7 +175,8 @@ extern void affs_delete_inode(struct inode *inode);
|
|||
extern void affs_clear_inode(struct inode *inode);
|
||||
extern struct inode *affs_iget(struct super_block *sb,
|
||||
unsigned long ino);
|
||||
extern int affs_write_inode(struct inode *inode, int);
|
||||
extern int affs_write_inode(struct inode *inode,
|
||||
struct writeback_control *wbc);
|
||||
extern int affs_add_entry(struct inode *dir, struct inode *inode, struct dentry *dentry, s32 type);
|
||||
|
||||
/* file.c */
|
||||
|
|
|
@ -166,7 +166,7 @@ struct inode *affs_iget(struct super_block *sb, unsigned long ino)
|
|||
}
|
||||
|
||||
int
|
||||
affs_write_inode(struct inode *inode, int unused)
|
||||
affs_write_inode(struct inode *inode, struct writeback_control *wbc)
|
||||
{
|
||||
struct super_block *sb = inode->i_sb;
|
||||
struct buffer_head *bh;
|
||||
|
|
|
@ -733,7 +733,6 @@ extern int afs_write_end(struct file *file, struct address_space *mapping,
|
|||
struct page *page, void *fsdata);
|
||||
extern int afs_writepage(struct page *, struct writeback_control *);
|
||||
extern int afs_writepages(struct address_space *, struct writeback_control *);
|
||||
extern int afs_write_inode(struct inode *, int);
|
||||
extern void afs_pages_written_back(struct afs_vnode *, struct afs_call *);
|
||||
extern ssize_t afs_file_write(struct kiocb *, const struct iovec *,
|
||||
unsigned long, loff_t);
|
||||
|
|
|
@ -48,7 +48,6 @@ struct file_system_type afs_fs_type = {
|
|||
static const struct super_operations afs_super_ops = {
|
||||
.statfs = afs_statfs,
|
||||
.alloc_inode = afs_alloc_inode,
|
||||
.write_inode = afs_write_inode,
|
||||
.destroy_inode = afs_destroy_inode,
|
||||
.clear_inode = afs_clear_inode,
|
||||
.put_super = afs_put_super,
|
||||
|
|
|
@ -584,27 +584,6 @@ int afs_writepages(struct address_space *mapping,
|
|||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* write an inode back
|
||||
*/
|
||||
int afs_write_inode(struct inode *inode, int sync)
|
||||
{
|
||||
struct afs_vnode *vnode = AFS_FS_I(inode);
|
||||
int ret;
|
||||
|
||||
_enter("{%x:%u},", vnode->fid.vid, vnode->fid.vnode);
|
||||
|
||||
ret = 0;
|
||||
if (sync) {
|
||||
ret = filemap_fdatawait(inode->i_mapping);
|
||||
if (ret < 0)
|
||||
__mark_inode_dirty(inode, I_DIRTY_DATASYNC);
|
||||
}
|
||||
|
||||
_leave(" = %d", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* completion of write to server
|
||||
*/
|
||||
|
|
|
@ -15,6 +15,7 @@
|
|||
#include <linux/smp_lock.h>
|
||||
#include <linux/buffer_head.h>
|
||||
#include <linux/vfs.h>
|
||||
#include <linux/writeback.h>
|
||||
#include <asm/uaccess.h>
|
||||
#include "bfs.h"
|
||||
|
||||
|
@ -98,7 +99,7 @@ struct inode *bfs_iget(struct super_block *sb, unsigned long ino)
|
|||
return ERR_PTR(-EIO);
|
||||
}
|
||||
|
||||
static int bfs_write_inode(struct inode *inode, int wait)
|
||||
static int bfs_write_inode(struct inode *inode, struct writeback_control *wbc)
|
||||
{
|
||||
struct bfs_sb_info *info = BFS_SB(inode->i_sb);
|
||||
unsigned int ino = (u16)inode->i_ino;
|
||||
|
@ -147,7 +148,7 @@ static int bfs_write_inode(struct inode *inode, int wait)
|
|||
di->i_eoffset = cpu_to_le32(i_sblock * BFS_BSIZE + inode->i_size - 1);
|
||||
|
||||
mark_buffer_dirty(bh);
|
||||
if (wait) {
|
||||
if (wbc->sync_mode == WB_SYNC_ALL) {
|
||||
sync_dirty_buffer(bh);
|
||||
if (buffer_req(bh) && !buffer_uptodate(bh))
|
||||
err = -EIO;
|
||||
|
|
|
@ -2326,7 +2326,7 @@ int btrfs_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf);
|
|||
int btrfs_readpage(struct file *file, struct page *page);
|
||||
void btrfs_delete_inode(struct inode *inode);
|
||||
void btrfs_put_inode(struct inode *inode);
|
||||
int btrfs_write_inode(struct inode *inode, int wait);
|
||||
int btrfs_write_inode(struct inode *inode, struct writeback_control *wbc);
|
||||
void btrfs_dirty_inode(struct inode *inode);
|
||||
struct inode *btrfs_alloc_inode(struct super_block *sb);
|
||||
void btrfs_destroy_inode(struct inode *inode);
|
||||
|
|
|
@ -3968,7 +3968,7 @@ static int btrfs_real_readdir(struct file *filp, void *dirent,
|
|||
return ret;
|
||||
}
|
||||
|
||||
int btrfs_write_inode(struct inode *inode, int wait)
|
||||
int btrfs_write_inode(struct inode *inode, struct writeback_control *wbc)
|
||||
{
|
||||
struct btrfs_root *root = BTRFS_I(inode)->root;
|
||||
struct btrfs_trans_handle *trans;
|
||||
|
@ -3977,7 +3977,7 @@ int btrfs_write_inode(struct inode *inode, int wait)
|
|||
if (root->fs_info->btree_inode == inode)
|
||||
return 0;
|
||||
|
||||
if (wait) {
|
||||
if (wbc->sync_mode == WB_SYNC_ALL) {
|
||||
trans = btrfs_join_transaction(root, 1);
|
||||
btrfs_set_trans_block_group(trans, inode);
|
||||
ret = btrfs_commit_transaction(trans, root);
|
||||
|
|
|
@ -261,7 +261,7 @@ int exofs_write_begin(struct file *file, struct address_space *mapping,
|
|||
struct page **pagep, void **fsdata);
|
||||
extern struct inode *exofs_iget(struct super_block *, unsigned long);
|
||||
struct inode *exofs_new_inode(struct inode *, int);
|
||||
extern int exofs_write_inode(struct inode *, int);
|
||||
extern int exofs_write_inode(struct inode *, struct writeback_control *wbc);
|
||||
extern void exofs_delete_inode(struct inode *);
|
||||
|
||||
/* dir.c: */
|
||||
|
|
|
@ -1280,9 +1280,9 @@ static int exofs_update_inode(struct inode *inode, int do_sync)
|
|||
return ret;
|
||||
}
|
||||
|
||||
int exofs_write_inode(struct inode *inode, int wait)
|
||||
int exofs_write_inode(struct inode *inode, struct writeback_control *wbc)
|
||||
{
|
||||
return exofs_update_inode(inode, wait);
|
||||
return exofs_update_inode(inode, wbc->sync_mode == WB_SYNC_ALL);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -118,7 +118,7 @@ extern unsigned long ext2_count_free (struct buffer_head *, unsigned);
|
|||
|
||||
/* inode.c */
|
||||
extern struct inode *ext2_iget (struct super_block *, unsigned long);
|
||||
extern int ext2_write_inode (struct inode *, int);
|
||||
extern int ext2_write_inode (struct inode *, struct writeback_control *);
|
||||
extern void ext2_delete_inode (struct inode *);
|
||||
extern int ext2_sync_inode (struct inode *);
|
||||
extern int ext2_get_block(struct inode *, sector_t, struct buffer_head *, int);
|
||||
|
|
|
@ -41,6 +41,8 @@ MODULE_AUTHOR("Remy Card and others");
|
|||
MODULE_DESCRIPTION("Second Extended Filesystem");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
static int __ext2_write_inode(struct inode *inode, int do_sync);
|
||||
|
||||
/*
|
||||
* Test whether an inode is a fast symlink.
|
||||
*/
|
||||
|
@ -64,7 +66,7 @@ void ext2_delete_inode (struct inode * inode)
|
|||
goto no_delete;
|
||||
EXT2_I(inode)->i_dtime = get_seconds();
|
||||
mark_inode_dirty(inode);
|
||||
ext2_write_inode(inode, inode_needs_sync(inode));
|
||||
__ext2_write_inode(inode, inode_needs_sync(inode));
|
||||
|
||||
inode->i_size = 0;
|
||||
if (inode->i_blocks)
|
||||
|
@ -1335,7 +1337,7 @@ struct inode *ext2_iget (struct super_block *sb, unsigned long ino)
|
|||
return ERR_PTR(ret);
|
||||
}
|
||||
|
||||
int ext2_write_inode(struct inode *inode, int do_sync)
|
||||
static int __ext2_write_inode(struct inode *inode, int do_sync)
|
||||
{
|
||||
struct ext2_inode_info *ei = EXT2_I(inode);
|
||||
struct super_block *sb = inode->i_sb;
|
||||
|
@ -1440,6 +1442,11 @@ int ext2_write_inode(struct inode *inode, int do_sync)
|
|||
return err;
|
||||
}
|
||||
|
||||
int ext2_write_inode(struct inode *inode, struct writeback_control *wbc)
|
||||
{
|
||||
return __ext2_write_inode(inode, wbc->sync_mode == WB_SYNC_ALL);
|
||||
}
|
||||
|
||||
int ext2_sync_inode(struct inode *inode)
|
||||
{
|
||||
struct writeback_control wbc = {
|
||||
|
|
|
@ -3096,7 +3096,7 @@ static int ext3_do_update_inode(handle_t *handle,
|
|||
* `stuff()' is running, and the new i_size will be lost. Plus the inode
|
||||
* will no longer be on the superblock's dirty inode list.
|
||||
*/
|
||||
int ext3_write_inode(struct inode *inode, int wait)
|
||||
int ext3_write_inode(struct inode *inode, struct writeback_control *wbc)
|
||||
{
|
||||
if (current->flags & PF_MEMALLOC)
|
||||
return 0;
|
||||
|
@ -3107,7 +3107,7 @@ int ext3_write_inode(struct inode *inode, int wait)
|
|||
return -EIO;
|
||||
}
|
||||
|
||||
if (!wait)
|
||||
if (wbc->sync_mode != WB_SYNC_ALL)
|
||||
return 0;
|
||||
|
||||
return ext3_force_commit(inode->i_sb);
|
||||
|
|
|
@ -1446,7 +1446,7 @@ int ext4_get_block(struct inode *inode, sector_t iblock,
|
|||
struct buffer_head *bh_result, int create);
|
||||
|
||||
extern struct inode *ext4_iget(struct super_block *, unsigned long);
|
||||
extern int ext4_write_inode(struct inode *, int);
|
||||
extern int ext4_write_inode(struct inode *, struct writeback_control *);
|
||||
extern int ext4_setattr(struct dentry *, struct iattr *);
|
||||
extern int ext4_getattr(struct vfsmount *mnt, struct dentry *dentry,
|
||||
struct kstat *stat);
|
||||
|
|
|
@ -5348,7 +5348,7 @@ static int ext4_do_update_inode(handle_t *handle,
|
|||
* `stuff()' is running, and the new i_size will be lost. Plus the inode
|
||||
* will no longer be on the superblock's dirty inode list.
|
||||
*/
|
||||
int ext4_write_inode(struct inode *inode, int wait)
|
||||
int ext4_write_inode(struct inode *inode, struct writeback_control *wbc)
|
||||
{
|
||||
int err;
|
||||
|
||||
|
@ -5362,7 +5362,7 @@ int ext4_write_inode(struct inode *inode, int wait)
|
|||
return -EIO;
|
||||
}
|
||||
|
||||
if (!wait)
|
||||
if (wbc->sync_mode != WB_SYNC_ALL)
|
||||
return 0;
|
||||
|
||||
err = ext4_force_commit(inode->i_sb);
|
||||
|
@ -5372,7 +5372,7 @@ int ext4_write_inode(struct inode *inode, int wait)
|
|||
err = ext4_get_inode_loc(inode, &iloc);
|
||||
if (err)
|
||||
return err;
|
||||
if (wait)
|
||||
if (wbc->sync_mode == WB_SYNC_ALL)
|
||||
sync_dirty_buffer(iloc.bh);
|
||||
if (buffer_req(iloc.bh) && !buffer_uptodate(iloc.bh)) {
|
||||
ext4_error(inode->i_sb, "IO error syncing inode, "
|
||||
|
|
|
@ -577,7 +577,7 @@ static inline loff_t fat_i_pos_read(struct msdos_sb_info *sbi,
|
|||
return i_pos;
|
||||
}
|
||||
|
||||
static int fat_write_inode(struct inode *inode, int wait)
|
||||
static int __fat_write_inode(struct inode *inode, int wait)
|
||||
{
|
||||
struct super_block *sb = inode->i_sb;
|
||||
struct msdos_sb_info *sbi = MSDOS_SB(sb);
|
||||
|
@ -634,9 +634,14 @@ static int fat_write_inode(struct inode *inode, int wait)
|
|||
return err;
|
||||
}
|
||||
|
||||
static int fat_write_inode(struct inode *inode, struct writeback_control *wbc)
|
||||
{
|
||||
return __fat_write_inode(inode, wbc->sync_mode == WB_SYNC_ALL);
|
||||
}
|
||||
|
||||
int fat_sync_inode(struct inode *inode)
|
||||
{
|
||||
return fat_write_inode(inode, 1);
|
||||
return __fat_write_inode(inode, 1);
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL_GPL(fat_sync_inode);
|
||||
|
|
|
@ -381,10 +381,10 @@ static void queue_io(struct bdi_writeback *wb, unsigned long *older_than_this)
|
|||
move_expired_inodes(&wb->b_dirty, &wb->b_io, older_than_this);
|
||||
}
|
||||
|
||||
static int write_inode(struct inode *inode, int sync)
|
||||
static int write_inode(struct inode *inode, struct writeback_control *wbc)
|
||||
{
|
||||
if (inode->i_sb->s_op->write_inode && !is_bad_inode(inode))
|
||||
return inode->i_sb->s_op->write_inode(inode, sync);
|
||||
return inode->i_sb->s_op->write_inode(inode, wbc);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -421,7 +421,6 @@ static int
|
|||
writeback_single_inode(struct inode *inode, struct writeback_control *wbc)
|
||||
{
|
||||
struct address_space *mapping = inode->i_mapping;
|
||||
int wait = wbc->sync_mode == WB_SYNC_ALL;
|
||||
unsigned dirty;
|
||||
int ret;
|
||||
|
||||
|
@ -439,7 +438,7 @@ writeback_single_inode(struct inode *inode, struct writeback_control *wbc)
|
|||
* We'll have another go at writing back this inode when we
|
||||
* completed a full scan of b_io.
|
||||
*/
|
||||
if (!wait) {
|
||||
if (wbc->sync_mode != WB_SYNC_ALL) {
|
||||
requeue_io(inode);
|
||||
return 0;
|
||||
}
|
||||
|
@ -461,15 +460,20 @@ writeback_single_inode(struct inode *inode, struct writeback_control *wbc)
|
|||
|
||||
ret = do_writepages(mapping, wbc);
|
||||
|
||||
/* Don't write the inode if only I_DIRTY_PAGES was set */
|
||||
if (dirty & (I_DIRTY_SYNC | I_DIRTY_DATASYNC)) {
|
||||
int err = write_inode(inode, wait);
|
||||
/*
|
||||
* Make sure to wait on the data before writing out the metadata.
|
||||
* This is important for filesystems that modify metadata on data
|
||||
* I/O completion.
|
||||
*/
|
||||
if (wbc->sync_mode == WB_SYNC_ALL) {
|
||||
int err = filemap_fdatawait(mapping);
|
||||
if (ret == 0)
|
||||
ret = err;
|
||||
}
|
||||
|
||||
if (wait) {
|
||||
int err = filemap_fdatawait(mapping);
|
||||
/* Don't write the inode if only I_DIRTY_PAGES was set */
|
||||
if (dirty & (I_DIRTY_SYNC | I_DIRTY_DATASYNC)) {
|
||||
int err = write_inode(inode, wbc);
|
||||
if (ret == 0)
|
||||
ret = err;
|
||||
}
|
||||
|
|
|
@ -22,6 +22,7 @@
|
|||
#include <linux/crc32.h>
|
||||
#include <linux/time.h>
|
||||
#include <linux/wait.h>
|
||||
#include <linux/writeback.h>
|
||||
|
||||
#include "gfs2.h"
|
||||
#include "incore.h"
|
||||
|
@ -711,7 +712,7 @@ void gfs2_unfreeze_fs(struct gfs2_sbd *sdp)
|
|||
* Returns: errno
|
||||
*/
|
||||
|
||||
static int gfs2_write_inode(struct inode *inode, int sync)
|
||||
static int gfs2_write_inode(struct inode *inode, struct writeback_control *wbc)
|
||||
{
|
||||
struct gfs2_inode *ip = GFS2_I(inode);
|
||||
struct gfs2_sbd *sdp = GFS2_SB(inode);
|
||||
|
@ -745,7 +746,7 @@ static int gfs2_write_inode(struct inode *inode, int sync)
|
|||
do_unlock:
|
||||
gfs2_glock_dq_uninit(&gh);
|
||||
do_flush:
|
||||
if (sync != 0)
|
||||
if (wbc->sync_mode == WB_SYNC_ALL)
|
||||
gfs2_log_flush(GFS2_SB(inode), ip->i_gl);
|
||||
return ret;
|
||||
}
|
||||
|
|
|
@ -188,7 +188,7 @@ extern const struct address_space_operations hfs_btree_aops;
|
|||
|
||||
extern struct inode *hfs_new_inode(struct inode *, struct qstr *, int);
|
||||
extern void hfs_inode_write_fork(struct inode *, struct hfs_extent *, __be32 *, __be32 *);
|
||||
extern int hfs_write_inode(struct inode *, int);
|
||||
extern int hfs_write_inode(struct inode *, struct writeback_control *);
|
||||
extern int hfs_inode_setattr(struct dentry *, struct iattr *);
|
||||
extern void hfs_inode_read_fork(struct inode *inode, struct hfs_extent *ext,
|
||||
__be32 log_size, __be32 phys_size, u32 clump_size);
|
||||
|
|
|
@ -381,7 +381,7 @@ void hfs_inode_write_fork(struct inode *inode, struct hfs_extent *ext,
|
|||
HFS_SB(inode->i_sb)->alloc_blksz);
|
||||
}
|
||||
|
||||
int hfs_write_inode(struct inode *inode, int unused)
|
||||
int hfs_write_inode(struct inode *inode, struct writeback_control *wbc)
|
||||
{
|
||||
struct inode *main_inode = inode;
|
||||
struct hfs_find_data fd;
|
||||
|
|
|
@ -87,7 +87,8 @@ struct inode *hfsplus_iget(struct super_block *sb, unsigned long ino)
|
|||
return ERR_PTR(err);
|
||||
}
|
||||
|
||||
static int hfsplus_write_inode(struct inode *inode, int unused)
|
||||
static int hfsplus_write_inode(struct inode *inode,
|
||||
struct writeback_control *wbc)
|
||||
{
|
||||
struct hfsplus_vh *vhdr;
|
||||
int ret = 0;
|
||||
|
|
|
@ -22,6 +22,7 @@
|
|||
#include <linux/buffer_head.h>
|
||||
#include <linux/pagemap.h>
|
||||
#include <linux/quotaops.h>
|
||||
#include <linux/writeback.h>
|
||||
#include "jfs_incore.h"
|
||||
#include "jfs_inode.h"
|
||||
#include "jfs_filsys.h"
|
||||
|
@ -120,8 +121,10 @@ int jfs_commit_inode(struct inode *inode, int wait)
|
|||
return rc;
|
||||
}
|
||||
|
||||
int jfs_write_inode(struct inode *inode, int wait)
|
||||
int jfs_write_inode(struct inode *inode, struct writeback_control *wbc)
|
||||
{
|
||||
int wait = wbc->sync_mode == WB_SYNC_ALL;
|
||||
|
||||
if (test_cflag(COMMIT_Nolink, inode))
|
||||
return 0;
|
||||
/*
|
||||
|
|
|
@ -26,7 +26,7 @@ extern long jfs_ioctl(struct file *, unsigned int, unsigned long);
|
|||
extern long jfs_compat_ioctl(struct file *, unsigned int, unsigned long);
|
||||
extern struct inode *jfs_iget(struct super_block *, unsigned long);
|
||||
extern int jfs_commit_inode(struct inode *, int);
|
||||
extern int jfs_write_inode(struct inode*, int);
|
||||
extern int jfs_write_inode(struct inode *, struct writeback_control *);
|
||||
extern void jfs_delete_inode(struct inode *);
|
||||
extern void jfs_dirty_inode(struct inode *);
|
||||
extern void jfs_truncate(struct inode *);
|
||||
|
|
|
@ -17,8 +17,10 @@
|
|||
#include <linux/init.h>
|
||||
#include <linux/highuid.h>
|
||||
#include <linux/vfs.h>
|
||||
#include <linux/writeback.h>
|
||||
|
||||
static int minix_write_inode(struct inode * inode, int wait);
|
||||
static int minix_write_inode(struct inode *inode,
|
||||
struct writeback_control *wbc);
|
||||
static int minix_statfs(struct dentry *dentry, struct kstatfs *buf);
|
||||
static int minix_remount (struct super_block * sb, int * flags, char * data);
|
||||
|
||||
|
@ -552,7 +554,7 @@ static struct buffer_head * V2_minix_update_inode(struct inode * inode)
|
|||
return bh;
|
||||
}
|
||||
|
||||
static int minix_write_inode(struct inode *inode, int wait)
|
||||
static int minix_write_inode(struct inode *inode, struct writeback_control *wbc)
|
||||
{
|
||||
int err = 0;
|
||||
struct buffer_head *bh;
|
||||
|
@ -563,7 +565,7 @@ static int minix_write_inode(struct inode *inode, int wait)
|
|||
bh = V2_minix_update_inode(inode);
|
||||
if (!bh)
|
||||
return -EIO;
|
||||
if (wait && buffer_dirty(bh)) {
|
||||
if (wbc->sync_mode == WB_SYNC_ALL && buffer_dirty(bh)) {
|
||||
sync_dirty_buffer(bh);
|
||||
if (buffer_req(bh) && !buffer_uptodate(bh)) {
|
||||
printk("IO error syncing minix inode [%s:%08lx]\n",
|
||||
|
|
|
@ -97,16 +97,12 @@ u64 nfs_compat_user_ino64(u64 fileid)
|
|||
return ino;
|
||||
}
|
||||
|
||||
int nfs_write_inode(struct inode *inode, int sync)
|
||||
int nfs_write_inode(struct inode *inode, struct writeback_control *wbc)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if (sync) {
|
||||
ret = filemap_fdatawait(inode->i_mapping);
|
||||
if (ret == 0)
|
||||
ret = nfs_commit_inode(inode, FLUSH_SYNC);
|
||||
} else
|
||||
ret = nfs_commit_inode(inode, 0);
|
||||
ret = nfs_commit_inode(inode,
|
||||
wbc->sync_mode == WB_SYNC_ALL ? FLUSH_SYNC : 0);
|
||||
if (ret >= 0)
|
||||
return 0;
|
||||
__mark_inode_dirty(inode, I_DIRTY_DATASYNC);
|
||||
|
|
|
@ -211,7 +211,7 @@ extern int nfs_access_cache_shrinker(int nr_to_scan, gfp_t gfp_mask);
|
|||
extern struct workqueue_struct *nfsiod_workqueue;
|
||||
extern struct inode *nfs_alloc_inode(struct super_block *sb);
|
||||
extern void nfs_destroy_inode(struct inode *);
|
||||
extern int nfs_write_inode(struct inode *,int);
|
||||
extern int nfs_write_inode(struct inode *, struct writeback_control *);
|
||||
extern void nfs_clear_inode(struct inode *);
|
||||
#ifdef CONFIG_NFS_V4
|
||||
extern void nfs4_clear_inode(struct inode *);
|
||||
|
|
|
@ -1545,7 +1545,7 @@ static int ntfs_dir_fsync(struct file *filp, struct dentry *dentry,
|
|||
write_inode_now(bmp_vi, !datasync);
|
||||
iput(bmp_vi);
|
||||
}
|
||||
ret = ntfs_write_inode(vi, 1);
|
||||
ret = __ntfs_write_inode(vi, 1);
|
||||
write_inode_now(vi, !datasync);
|
||||
err = sync_blockdev(vi->i_sb->s_bdev);
|
||||
if (unlikely(err && !ret))
|
||||
|
|
|
@ -2182,7 +2182,7 @@ static int ntfs_file_fsync(struct file *filp, struct dentry *dentry,
|
|||
ntfs_debug("Entering for inode 0x%lx.", vi->i_ino);
|
||||
BUG_ON(S_ISDIR(vi->i_mode));
|
||||
if (!datasync || !NInoNonResident(NTFS_I(vi)))
|
||||
ret = ntfs_write_inode(vi, 1);
|
||||
ret = __ntfs_write_inode(vi, 1);
|
||||
write_inode_now(vi, !datasync);
|
||||
/*
|
||||
* NOTE: If we were to use mapping->private_list (see ext2 and
|
||||
|
|
|
@ -2957,7 +2957,7 @@ int ntfs_setattr(struct dentry *dentry, struct iattr *attr)
|
|||
*
|
||||
* Return 0 on success and -errno on error.
|
||||
*/
|
||||
int ntfs_write_inode(struct inode *vi, int sync)
|
||||
int __ntfs_write_inode(struct inode *vi, int sync)
|
||||
{
|
||||
sle64 nt;
|
||||
ntfs_inode *ni = NTFS_I(vi);
|
||||
|
|
|
@ -307,12 +307,12 @@ extern void ntfs_truncate_vfs(struct inode *vi);
|
|||
|
||||
extern int ntfs_setattr(struct dentry *dentry, struct iattr *attr);
|
||||
|
||||
extern int ntfs_write_inode(struct inode *vi, int sync);
|
||||
extern int __ntfs_write_inode(struct inode *vi, int sync);
|
||||
|
||||
static inline void ntfs_commit_inode(struct inode *vi)
|
||||
{
|
||||
if (!is_bad_inode(vi))
|
||||
ntfs_write_inode(vi, 1);
|
||||
__ntfs_write_inode(vi, 1);
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
@ -39,6 +39,7 @@
|
|||
#include "dir.h"
|
||||
#include "debug.h"
|
||||
#include "index.h"
|
||||
#include "inode.h"
|
||||
#include "aops.h"
|
||||
#include "layout.h"
|
||||
#include "malloc.h"
|
||||
|
@ -2662,6 +2663,13 @@ static int ntfs_statfs(struct dentry *dentry, struct kstatfs *sfs)
|
|||
return 0;
|
||||
}
|
||||
|
||||
#ifdef NTFS_RW
|
||||
static int ntfs_write_inode(struct inode *vi, struct writeback_control *wbc)
|
||||
{
|
||||
return __ntfs_write_inode(vi, wbc->sync_mode == WB_SYNC_ALL);
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* The complete super operations.
|
||||
*/
|
||||
|
|
|
@ -11,6 +11,7 @@
|
|||
#include <linux/parser.h>
|
||||
#include <linux/buffer_head.h>
|
||||
#include <linux/vmalloc.h>
|
||||
#include <linux/writeback.h>
|
||||
#include <linux/crc-itu-t.h>
|
||||
#include "omfs.h"
|
||||
|
||||
|
@ -89,7 +90,7 @@ static void omfs_update_checksums(struct omfs_inode *oi)
|
|||
oi->i_head.h_check_xor = xor;
|
||||
}
|
||||
|
||||
static int omfs_write_inode(struct inode *inode, int wait)
|
||||
static int __omfs_write_inode(struct inode *inode, int wait)
|
||||
{
|
||||
struct omfs_inode *oi;
|
||||
struct omfs_sb_info *sbi = OMFS_SB(inode->i_sb);
|
||||
|
@ -162,9 +163,14 @@ static int omfs_write_inode(struct inode *inode, int wait)
|
|||
return ret;
|
||||
}
|
||||
|
||||
static int omfs_write_inode(struct inode *inode, struct writeback_control *wbc)
|
||||
{
|
||||
return __omfs_write_inode(inode, wbc->sync_mode == WB_SYNC_ALL);
|
||||
}
|
||||
|
||||
int omfs_sync_inode(struct inode *inode)
|
||||
{
|
||||
return omfs_write_inode(inode, 1);
|
||||
return __omfs_write_inode(inode, 1);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -1615,7 +1615,7 @@ int reiserfs_encode_fh(struct dentry *dentry, __u32 * data, int *lenp,
|
|||
** to properly mark inodes for datasync and such, but only actually
|
||||
** does something when called for a synchronous update.
|
||||
*/
|
||||
int reiserfs_write_inode(struct inode *inode, int do_sync)
|
||||
int reiserfs_write_inode(struct inode *inode, struct writeback_control *wbc)
|
||||
{
|
||||
struct reiserfs_transaction_handle th;
|
||||
int jbegin_count = 1;
|
||||
|
@ -1627,7 +1627,7 @@ int reiserfs_write_inode(struct inode *inode, int do_sync)
|
|||
** inode needs to reach disk for safety, and they can safely be
|
||||
** ignored because the altered inode has already been logged.
|
||||
*/
|
||||
if (do_sync && !(current->flags & PF_MEMALLOC)) {
|
||||
if (wbc->sync_mode == WB_SYNC_ALL && !(current->flags & PF_MEMALLOC)) {
|
||||
reiserfs_write_lock(inode->i_sb);
|
||||
if (!journal_begin(&th, inode->i_sb, jbegin_count)) {
|
||||
reiserfs_update_sd(&th, inode);
|
||||
|
|
|
@ -26,6 +26,7 @@
|
|||
#include <linux/init.h>
|
||||
#include <linux/buffer_head.h>
|
||||
#include <linux/vfs.h>
|
||||
#include <linux/writeback.h>
|
||||
#include <linux/namei.h>
|
||||
#include <asm/byteorder.h>
|
||||
#include "sysv.h"
|
||||
|
@ -246,7 +247,7 @@ struct inode *sysv_iget(struct super_block *sb, unsigned int ino)
|
|||
return ERR_PTR(-EIO);
|
||||
}
|
||||
|
||||
int sysv_write_inode(struct inode *inode, int wait)
|
||||
static int __sysv_write_inode(struct inode *inode, int wait)
|
||||
{
|
||||
struct super_block * sb = inode->i_sb;
|
||||
struct sysv_sb_info * sbi = SYSV_SB(sb);
|
||||
|
@ -296,9 +297,14 @@ int sysv_write_inode(struct inode *inode, int wait)
|
|||
return 0;
|
||||
}
|
||||
|
||||
int sysv_write_inode(struct inode *inode, struct writeback_control *wbc)
|
||||
{
|
||||
return __sysv_write_inode(inode, wbc->sync_mode == WB_SYNC_ALL);
|
||||
}
|
||||
|
||||
int sysv_sync_inode(struct inode *inode)
|
||||
{
|
||||
return sysv_write_inode(inode, 1);
|
||||
return __sysv_write_inode(inode, 1);
|
||||
}
|
||||
|
||||
static void sysv_delete_inode(struct inode *inode)
|
||||
|
|
|
@ -142,7 +142,7 @@ extern int __sysv_write_begin(struct file *file, struct address_space *mapping,
|
|||
|
||||
/* inode.c */
|
||||
extern struct inode *sysv_iget(struct super_block *, unsigned int);
|
||||
extern int sysv_write_inode(struct inode *, int);
|
||||
extern int sysv_write_inode(struct inode *, struct writeback_control *wbc);
|
||||
extern int sysv_sync_inode(struct inode *);
|
||||
extern void sysv_set_inode(struct inode *, dev_t);
|
||||
extern int sysv_getattr(struct vfsmount *, struct dentry *, struct kstat *);
|
||||
|
|
|
@ -1120,7 +1120,7 @@ static int ubifs_rename(struct inode *old_dir, struct dentry *old_dentry,
|
|||
if (release)
|
||||
ubifs_release_budget(c, &ino_req);
|
||||
if (IS_SYNC(old_inode))
|
||||
err = old_inode->i_sb->s_op->write_inode(old_inode, 1);
|
||||
err = old_inode->i_sb->s_op->write_inode(old_inode, NULL);
|
||||
return err;
|
||||
|
||||
out_cancel:
|
||||
|
|
|
@ -1011,7 +1011,7 @@ static int ubifs_writepage(struct page *page, struct writeback_control *wbc)
|
|||
/* Is the page fully inside @i_size? */
|
||||
if (page->index < end_index) {
|
||||
if (page->index >= synced_i_size >> PAGE_CACHE_SHIFT) {
|
||||
err = inode->i_sb->s_op->write_inode(inode, 1);
|
||||
err = inode->i_sb->s_op->write_inode(inode, NULL);
|
||||
if (err)
|
||||
goto out_unlock;
|
||||
/*
|
||||
|
@ -1039,7 +1039,7 @@ static int ubifs_writepage(struct page *page, struct writeback_control *wbc)
|
|||
kunmap_atomic(kaddr, KM_USER0);
|
||||
|
||||
if (i_size > synced_i_size) {
|
||||
err = inode->i_sb->s_op->write_inode(inode, 1);
|
||||
err = inode->i_sb->s_op->write_inode(inode, NULL);
|
||||
if (err)
|
||||
goto out_unlock;
|
||||
}
|
||||
|
@ -1242,7 +1242,7 @@ static int do_setattr(struct ubifs_info *c, struct inode *inode,
|
|||
if (release)
|
||||
ubifs_release_budget(c, &req);
|
||||
if (IS_SYNC(inode))
|
||||
err = inode->i_sb->s_op->write_inode(inode, 1);
|
||||
err = inode->i_sb->s_op->write_inode(inode, NULL);
|
||||
return err;
|
||||
|
||||
out:
|
||||
|
@ -1316,7 +1316,7 @@ int ubifs_fsync(struct file *file, struct dentry *dentry, int datasync)
|
|||
* the inode unless this is a 'datasync()' call.
|
||||
*/
|
||||
if (!datasync || (inode->i_state & I_DIRTY_DATASYNC)) {
|
||||
err = inode->i_sb->s_op->write_inode(inode, 1);
|
||||
err = inode->i_sb->s_op->write_inode(inode, NULL);
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
|
|
|
@ -283,7 +283,7 @@ static void ubifs_destroy_inode(struct inode *inode)
|
|||
/*
|
||||
* Note, Linux write-back code calls this without 'i_mutex'.
|
||||
*/
|
||||
static int ubifs_write_inode(struct inode *inode, int wait)
|
||||
static int ubifs_write_inode(struct inode *inode, struct writeback_control *wbc)
|
||||
{
|
||||
int err = 0;
|
||||
struct ubifs_info *c = inode->i_sb->s_fs_info;
|
||||
|
|
|
@ -1373,12 +1373,12 @@ static mode_t udf_convert_permissions(struct fileEntry *fe)
|
|||
return mode;
|
||||
}
|
||||
|
||||
int udf_write_inode(struct inode *inode, int sync)
|
||||
int udf_write_inode(struct inode *inode, struct writeback_control *wbc)
|
||||
{
|
||||
int ret;
|
||||
|
||||
lock_kernel();
|
||||
ret = udf_update_inode(inode, sync);
|
||||
ret = udf_update_inode(inode, wbc->sync_mode == WB_SYNC_ALL);
|
||||
unlock_kernel();
|
||||
|
||||
return ret;
|
||||
|
|
|
@ -142,7 +142,7 @@ extern void udf_truncate(struct inode *);
|
|||
extern void udf_read_inode(struct inode *);
|
||||
extern void udf_delete_inode(struct inode *);
|
||||
extern void udf_clear_inode(struct inode *);
|
||||
extern int udf_write_inode(struct inode *, int);
|
||||
extern int udf_write_inode(struct inode *, struct writeback_control *wbc);
|
||||
extern long udf_block_map(struct inode *, sector_t);
|
||||
extern int udf_extend_file(struct inode *, struct extent_position *,
|
||||
struct kernel_long_ad *, sector_t);
|
||||
|
|
|
@ -36,6 +36,7 @@
|
|||
#include <linux/mm.h>
|
||||
#include <linux/smp_lock.h>
|
||||
#include <linux/buffer_head.h>
|
||||
#include <linux/writeback.h>
|
||||
|
||||
#include "ufs_fs.h"
|
||||
#include "ufs.h"
|
||||
|
@ -890,11 +891,11 @@ static int ufs_update_inode(struct inode * inode, int do_sync)
|
|||
return 0;
|
||||
}
|
||||
|
||||
int ufs_write_inode (struct inode * inode, int wait)
|
||||
int ufs_write_inode(struct inode *inode, struct writeback_control *wbc)
|
||||
{
|
||||
int ret;
|
||||
lock_kernel();
|
||||
ret = ufs_update_inode (inode, wait);
|
||||
ret = ufs_update_inode(inode, wbc->sync_mode == WB_SYNC_ALL);
|
||||
unlock_kernel();
|
||||
return ret;
|
||||
}
|
||||
|
|
|
@ -106,7 +106,7 @@ extern struct inode * ufs_new_inode (struct inode *, int);
|
|||
|
||||
/* inode.c */
|
||||
extern struct inode *ufs_iget(struct super_block *, unsigned long);
|
||||
extern int ufs_write_inode (struct inode *, int);
|
||||
extern int ufs_write_inode (struct inode *, struct writeback_control *);
|
||||
extern int ufs_sync_inode (struct inode *);
|
||||
extern void ufs_delete_inode (struct inode *);
|
||||
extern struct buffer_head * ufs_bread (struct inode *, unsigned, int, int *);
|
||||
|
|
|
@ -1063,7 +1063,7 @@ xfs_log_inode(
|
|||
STATIC int
|
||||
xfs_fs_write_inode(
|
||||
struct inode *inode,
|
||||
int sync)
|
||||
struct writeback_control *wbc)
|
||||
{
|
||||
struct xfs_inode *ip = XFS_I(inode);
|
||||
struct xfs_mount *mp = ip->i_mount;
|
||||
|
@ -1074,11 +1074,7 @@ xfs_fs_write_inode(
|
|||
if (XFS_FORCED_SHUTDOWN(mp))
|
||||
return XFS_ERROR(EIO);
|
||||
|
||||
if (sync) {
|
||||
error = xfs_wait_on_pages(ip, 0, -1);
|
||||
if (error)
|
||||
goto out;
|
||||
|
||||
if (wbc->sync_mode == WB_SYNC_ALL) {
|
||||
/*
|
||||
* Make sure the inode has hit stable storage. By using the
|
||||
* log and the fsync transactions we reduce the IOs we have
|
||||
|
|
|
@ -877,7 +877,7 @@ int ext3_get_blocks_handle(handle_t *handle, struct inode *inode,
|
|||
int create);
|
||||
|
||||
extern struct inode *ext3_iget(struct super_block *, unsigned long);
|
||||
extern int ext3_write_inode (struct inode *, int);
|
||||
extern int ext3_write_inode (struct inode *, struct writeback_control *);
|
||||
extern int ext3_setattr (struct dentry *, struct iattr *);
|
||||
extern void ext3_delete_inode (struct inode *);
|
||||
extern int ext3_sync_inode (handle_t *, struct inode *);
|
||||
|
|
|
@ -1557,7 +1557,7 @@ struct super_operations {
|
|||
void (*destroy_inode)(struct inode *);
|
||||
|
||||
void (*dirty_inode) (struct inode *);
|
||||
int (*write_inode) (struct inode *, int);
|
||||
int (*write_inode) (struct inode *, struct writeback_control *wbc);
|
||||
void (*drop_inode) (struct inode *);
|
||||
void (*delete_inode) (struct inode *);
|
||||
void (*put_super) (struct super_block *);
|
||||
|
|
|
@ -2034,7 +2034,7 @@ void reiserfs_read_locked_inode(struct inode *inode,
|
|||
int reiserfs_find_actor(struct inode *inode, void *p);
|
||||
int reiserfs_init_locked_inode(struct inode *inode, void *p);
|
||||
void reiserfs_delete_inode(struct inode *inode);
|
||||
int reiserfs_write_inode(struct inode *inode, int);
|
||||
int reiserfs_write_inode(struct inode *inode, struct writeback_control *wbc);
|
||||
int reiserfs_get_block(struct inode *inode, sector_t block,
|
||||
struct buffer_head *bh_result, int create);
|
||||
struct dentry *reiserfs_fh_to_dentry(struct super_block *sb, struct fid *fid,
|
||||
|
|
Loading…
Reference in New Issue
Block a user