diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2009-12-17 08:31:01 -0800 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-12-17 08:31:01 -0800 |
commit | b8a7f3cd7e8212e5c572178ff3b5a514861036a5 (patch) | |
tree | f88fd0fc83a466a6d5781f90e7ed76cb2fa0f5d7 /fs/sync.c | |
parent | a377d181e65241344dd95aa4a42c477477be03f1 (diff) | |
parent | eaff8079d4f1016a12e34ab323737314f24127dd (diff) |
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs-2.6
* 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs-2.6:
kill I_LOCK
fold do_sync_file_range into sys_sync_file_range
fix up O_SYNC comments
VFS/fsstack: handle 32-bit smp + preempt + large files in fsstack_copy_inode_size
fsstack/ecryptfs: remove unused get_nlinks param to fsstack_copy_attr_all
vfs: remove extraneous NULL d_inode check from do_filp_open
fs: no games with DCACHE_UNHASHED
fs: anon_inodes implement dname
dio: fix use-after-free
Diffstat (limited to 'fs/sync.c')
-rw-r--r-- | fs/sync.c | 59 |
1 files changed, 23 insertions, 36 deletions
diff --git a/fs/sync.c b/fs/sync.c index 36752a68348..418727a2a23 100644 --- a/fs/sync.c +++ b/fs/sync.c @@ -355,6 +355,7 @@ SYSCALL_DEFINE(sync_file_range)(int fd, loff_t offset, loff_t nbytes, { int ret; struct file *file; + struct address_space *mapping; loff_t endbyte; /* inclusive */ int fput_needed; umode_t i_mode; @@ -405,7 +406,28 @@ SYSCALL_DEFINE(sync_file_range)(int fd, loff_t offset, loff_t nbytes, !S_ISLNK(i_mode)) goto out_put; - ret = do_sync_mapping_range(file->f_mapping, offset, endbyte, flags); + mapping = file->f_mapping; + if (!mapping) { + ret = -EINVAL; + goto out_put; + } + + ret = 0; + if (flags & SYNC_FILE_RANGE_WAIT_BEFORE) { + ret = filemap_fdatawait_range(mapping, offset, endbyte); + if (ret < 0) + goto out_put; + } + + if (flags & SYNC_FILE_RANGE_WRITE) { + ret = filemap_fdatawrite_range(mapping, offset, endbyte); + if (ret < 0) + goto out_put; + } + + if (flags & SYNC_FILE_RANGE_WAIT_AFTER) + ret = filemap_fdatawait_range(mapping, offset, endbyte); + out_put: fput_light(file, fput_needed); out: @@ -437,38 +459,3 @@ asmlinkage long SyS_sync_file_range2(long fd, long flags, } SYSCALL_ALIAS(sys_sync_file_range2, SyS_sync_file_range2); #endif - -/* - * `endbyte' is inclusive - */ -int do_sync_mapping_range(struct address_space *mapping, loff_t offset, - loff_t endbyte, unsigned int flags) -{ - int ret; - - if (!mapping) { - ret = -EINVAL; - goto out; - } - - ret = 0; - if (flags & SYNC_FILE_RANGE_WAIT_BEFORE) { - ret = filemap_fdatawait_range(mapping, offset, endbyte); - if (ret < 0) - goto out; - } - - if (flags & SYNC_FILE_RANGE_WRITE) { - ret = __filemap_fdatawrite_range(mapping, offset, endbyte, - WB_SYNC_ALL); - if (ret < 0) - goto out; - } - - if (flags & SYNC_FILE_RANGE_WAIT_AFTER) { - ret = filemap_fdatawait_range(mapping, offset, endbyte); - } -out: - return ret; -} -EXPORT_SYMBOL_GPL(do_sync_mapping_range); |