mirror of
https://github.com/torvalds/linux.git
synced 2024-11-10 14:11:52 +00:00
New helper - simple_fsync()
writes associated buffers, then does sync_inode() to write the inode itself (and to make it clean). Depends on ->write_inode() honouring the second argument. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
337eb00a2c
commit
d5aacad548
25
fs/libfs.c
25
fs/libfs.c
@ -9,6 +9,8 @@
|
|||||||
#include <linux/vfs.h>
|
#include <linux/vfs.h>
|
||||||
#include <linux/mutex.h>
|
#include <linux/mutex.h>
|
||||||
#include <linux/exportfs.h>
|
#include <linux/exportfs.h>
|
||||||
|
#include <linux/writeback.h>
|
||||||
|
#include <linux/buffer_head.h>
|
||||||
|
|
||||||
#include <asm/uaccess.h>
|
#include <asm/uaccess.h>
|
||||||
|
|
||||||
@ -807,6 +809,29 @@ struct dentry *generic_fh_to_parent(struct super_block *sb, struct fid *fid,
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(generic_fh_to_parent);
|
EXPORT_SYMBOL_GPL(generic_fh_to_parent);
|
||||||
|
|
||||||
|
int simple_fsync(struct file *file, struct dentry *dentry, int datasync)
|
||||||
|
{
|
||||||
|
struct writeback_control wbc = {
|
||||||
|
.sync_mode = WB_SYNC_ALL,
|
||||||
|
.nr_to_write = 0, /* metadata-only; caller takes care of data */
|
||||||
|
};
|
||||||
|
struct inode *inode = dentry->d_inode;
|
||||||
|
int err;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = sync_mapping_buffers(inode->i_mapping);
|
||||||
|
if (!(inode->i_state & I_DIRTY))
|
||||||
|
return ret;
|
||||||
|
if (datasync && !(inode->i_state & I_DIRTY_DATASYNC))
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
err = sync_inode(inode, &wbc);
|
||||||
|
if (ret == 0)
|
||||||
|
ret = err;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(simple_fsync);
|
||||||
|
|
||||||
EXPORT_SYMBOL(dcache_dir_close);
|
EXPORT_SYMBOL(dcache_dir_close);
|
||||||
EXPORT_SYMBOL(dcache_dir_lseek);
|
EXPORT_SYMBOL(dcache_dir_lseek);
|
||||||
EXPORT_SYMBOL(dcache_dir_open);
|
EXPORT_SYMBOL(dcache_dir_open);
|
||||||
|
@ -2345,6 +2345,8 @@ extern void simple_release_fs(struct vfsmount **mount, int *count);
|
|||||||
extern ssize_t simple_read_from_buffer(void __user *to, size_t count,
|
extern ssize_t simple_read_from_buffer(void __user *to, size_t count,
|
||||||
loff_t *ppos, const void *from, size_t available);
|
loff_t *ppos, const void *from, size_t available);
|
||||||
|
|
||||||
|
extern int simple_fsync(struct file *, struct dentry *, int);
|
||||||
|
|
||||||
#ifdef CONFIG_MIGRATION
|
#ifdef CONFIG_MIGRATION
|
||||||
extern int buffer_migrate_page(struct address_space *,
|
extern int buffer_migrate_page(struct address_space *,
|
||||||
struct page *, struct page *);
|
struct page *, struct page *);
|
||||||
|
Loading…
Reference in New Issue
Block a user