Blame view

fs/sync.c 9.94 KB
b24413180   Greg Kroah-Hartman   License cleanup: ...
1
  // SPDX-License-Identifier: GPL-2.0
f79e2abb9   Andrew Morton   [PATCH] sys_sync_...
2
3
4
5
6
7
8
  /*
   * High-level sync()-related operations
   */
  
  #include <linux/kernel.h>
  #include <linux/file.h>
  #include <linux/fs.h>
5a0e3ad6a   Tejun Heo   include cleanup: ...
9
  #include <linux/slab.h>
630d9c472   Paul Gortmaker   fs: reduce the us...
10
  #include <linux/export.h>
b7ed78f56   Sage Weil   introduce sys_syn...
11
  #include <linux/namei.h>
914e26379   Al Viro   [PATCH] severing ...
12
  #include <linux/sched.h>
f79e2abb9   Andrew Morton   [PATCH] sys_sync_...
13
14
15
16
  #include <linux/writeback.h>
  #include <linux/syscalls.h>
  #include <linux/linkage.h>
  #include <linux/pagemap.h>
cf9a2ae8d   David Howells   [PATCH] BLOCK: Mo...
17
  #include <linux/quotaops.h>
5129a469a   Jörn Engel   Catch filesystems...
18
  #include <linux/backing-dev.h>
5a3e5cb8e   Jan Kara   vfs: Fix sys_sync...
19
  #include "internal.h"
f79e2abb9   Andrew Morton   [PATCH] sys_sync_...
20
21
22
  
  #define VALID_FLAGS (SYNC_FILE_RANGE_WAIT_BEFORE|SYNC_FILE_RANGE_WRITE| \
  			SYNC_FILE_RANGE_WAIT_AFTER)
c15c54f5f   Jan Kara   vfs: Move syncing...
23
  /*
d8a8559cd   Jens Axboe   writeback: get ri...
24
25
26
27
28
   * Do the filesystem syncing work. For simple filesystems
   * writeback_inodes_sb(sb) just dirties buffers with inodes so we have to
   * submit IO for these buffers via __sync_blockdev(). This also speeds up the
   * wait == 1 case since in that case write_inode() functions do
   * sync_dirty_buffer() and thus effectively write one block at a time.
c15c54f5f   Jan Kara   vfs: Move syncing...
29
   */
0dc83bd30   Jan Kara   Revert "writeback...
30
  static int __sync_filesystem(struct super_block *sb, int wait)
c15c54f5f   Jan Kara   vfs: Move syncing...
31
  {
5fb324ad2   Christoph Hellwig   quota: move code ...
32
  	if (wait)
0dc83bd30   Jan Kara   Revert "writeback...
33
  		sync_inodes_sb(sb);
5fb324ad2   Christoph Hellwig   quota: move code ...
34
  	else
0e175a183   Curt Wohlgemuth   writeback: Add a ...
35
  		writeback_inodes_sb(sb, WB_REASON_SYNC);
5fb324ad2   Christoph Hellwig   quota: move code ...
36

c15c54f5f   Jan Kara   vfs: Move syncing...
37
38
39
40
41
42
43
44
45
46
  	if (sb->s_op->sync_fs)
  		sb->s_op->sync_fs(sb, wait);
  	return __sync_blockdev(sb->s_bdev, wait);
  }
  
  /*
   * Write out and wait upon all dirty data associated with this
   * superblock.  Filesystem data as well as the underlying block
   * device.  Takes the superblock lock.
   */
60b0680fa   Jan Kara   vfs: Rename fsync...
47
  int sync_filesystem(struct super_block *sb)
c15c54f5f   Jan Kara   vfs: Move syncing...
48
49
  {
  	int ret;
5af7926ff   Christoph Hellwig   enforce ->sync_fs...
50
51
52
53
54
55
56
57
58
  	/*
  	 * We need to be protected against the filesystem going from
  	 * r/o to r/w or vice versa.
  	 */
  	WARN_ON(!rwsem_is_locked(&sb->s_umount));
  
  	/*
  	 * No point in syncing out anything if the filesystem is read-only.
  	 */
bc98a42c1   David Howells   VFS: Convert sb->...
59
  	if (sb_rdonly(sb))
5af7926ff   Christoph Hellwig   enforce ->sync_fs...
60
  		return 0;
0dc83bd30   Jan Kara   Revert "writeback...
61
  	ret = __sync_filesystem(sb, 0);
c15c54f5f   Jan Kara   vfs: Move syncing...
62
63
  	if (ret < 0)
  		return ret;
0dc83bd30   Jan Kara   Revert "writeback...
64
  	return __sync_filesystem(sb, 1);
c15c54f5f   Jan Kara   vfs: Move syncing...
65
  }
10096fb10   Anton Altaparmakov   Export sync_files...
66
  EXPORT_SYMBOL(sync_filesystem);
c15c54f5f   Jan Kara   vfs: Move syncing...
67

b3de65310   Jan Kara   vfs: Reorder oper...
68
  static void sync_inodes_one_sb(struct super_block *sb, void *arg)
01a05b337   Al Viro   new helper: itera...
69
  {
bc98a42c1   David Howells   VFS: Convert sb->...
70
  	if (!sb_rdonly(sb))
0dc83bd30   Jan Kara   Revert "writeback...
71
  		sync_inodes_sb(sb);
01a05b337   Al Viro   new helper: itera...
72
  }
b3de65310   Jan Kara   vfs: Reorder oper...
73

b3de65310   Jan Kara   vfs: Reorder oper...
74
75
  static void sync_fs_one_sb(struct super_block *sb, void *arg)
  {
bc98a42c1   David Howells   VFS: Convert sb->...
76
  	if (!sb_rdonly(sb) && sb->s_op->sync_fs)
b3de65310   Jan Kara   vfs: Reorder oper...
77
78
  		sb->s_op->sync_fs(sb, *(int *)arg);
  }
d0e91b13e   Jan Kara   vfs: Remove unnec...
79
  static void fdatawrite_one_bdev(struct block_device *bdev, void *arg)
b3de65310   Jan Kara   vfs: Reorder oper...
80
  {
d0e91b13e   Jan Kara   vfs: Remove unnec...
81
  	filemap_fdatawrite(bdev->bd_inode->i_mapping);
a8c7176b6   Jan Kara   vfs: Make sys_syn...
82
  }
d0e91b13e   Jan Kara   vfs: Remove unnec...
83
  static void fdatawait_one_bdev(struct block_device *bdev, void *arg)
a8c7176b6   Jan Kara   vfs: Make sys_syn...
84
  {
aa750fd71   Junichi Nomura   mm/filemap.c: mak...
85
86
87
88
89
90
  	/*
  	 * We keep the error status of individual mapping so that
  	 * applications can catch the writeback error using fsync(2).
  	 * See filemap_fdatawait_keep_errors() for details.
  	 */
  	filemap_fdatawait_keep_errors(bdev->bd_inode->i_mapping);
c15c54f5f   Jan Kara   vfs: Move syncing...
91
  }
3beab0b42   Zhang, Yanmin   sys_sync(): fix 1...
92
  /*
4ea425b63   Jan Kara   vfs: Avoid unnece...
93
94
95
96
97
98
99
100
   * Sync everything. We start by waking flusher threads so that most of
   * writeback runs on all devices in parallel. Then we sync all inodes reliably
   * which effectively also waits for all flusher threads to finish doing
   * writeback. At this point all data is on disk so metadata should be stable
   * and we tell filesystems to sync their metadata via ->sync_fs() calls.
   * Finally, we writeout all block devices because some filesystems (e.g. ext2)
   * just write metadata (such as inodes or bitmaps) to block device page cache
   * and do not sync it on their own in ->sync_fs().
3beab0b42   Zhang, Yanmin   sys_sync(): fix 1...
101
   */
70f68ee81   Dominik Brodowski   fs: add ksys_sync...
102
  void ksys_sync(void)
cf9a2ae8d   David Howells   [PATCH] BLOCK: Mo...
103
  {
b3de65310   Jan Kara   vfs: Reorder oper...
104
  	int nowait = 0, wait = 1;
9ba4b2dfa   Jens Axboe   fs: kill 'nr_page...
105
  	wakeup_flusher_threads(WB_REASON_SYNC);
0dc83bd30   Jan Kara   Revert "writeback...
106
  	iterate_supers(sync_inodes_one_sb, NULL);
4ea425b63   Jan Kara   vfs: Avoid unnece...
107
  	iterate_supers(sync_fs_one_sb, &nowait);
b3de65310   Jan Kara   vfs: Reorder oper...
108
  	iterate_supers(sync_fs_one_sb, &wait);
d0e91b13e   Jan Kara   vfs: Remove unnec...
109
110
  	iterate_bdevs(fdatawrite_one_bdev, NULL);
  	iterate_bdevs(fdatawait_one_bdev, NULL);
cf9a2ae8d   David Howells   [PATCH] BLOCK: Mo...
111
112
  	if (unlikely(laptop_mode))
  		laptop_sync_completion();
70f68ee81   Dominik Brodowski   fs: add ksys_sync...
113
114
115
116
117
  }
  
  SYSCALL_DEFINE0(sync)
  {
  	ksys_sync();
cf9a2ae8d   David Howells   [PATCH] BLOCK: Mo...
118
119
  	return 0;
  }
a2a9537ac   Jens Axboe   Get rid of pdflus...
120
121
  static void do_sync_work(struct work_struct *work)
  {
b3de65310   Jan Kara   vfs: Reorder oper...
122
  	int nowait = 0;
5cee5815d   Jan Kara   vfs: Make sys_syn...
123
124
125
126
  	/*
  	 * Sync twice to reduce the possibility we skipped some inodes / pages
  	 * because they were temporarily locked
  	 */
b3de65310   Jan Kara   vfs: Reorder oper...
127
128
  	iterate_supers(sync_inodes_one_sb, &nowait);
  	iterate_supers(sync_fs_one_sb, &nowait);
d0e91b13e   Jan Kara   vfs: Remove unnec...
129
  	iterate_bdevs(fdatawrite_one_bdev, NULL);
b3de65310   Jan Kara   vfs: Reorder oper...
130
131
  	iterate_supers(sync_inodes_one_sb, &nowait);
  	iterate_supers(sync_fs_one_sb, &nowait);
d0e91b13e   Jan Kara   vfs: Remove unnec...
132
  	iterate_bdevs(fdatawrite_one_bdev, NULL);
5cee5815d   Jan Kara   vfs: Make sys_syn...
133
134
  	printk("Emergency Sync complete
  ");
a2a9537ac   Jens Axboe   Get rid of pdflus...
135
136
  	kfree(work);
  }
cf9a2ae8d   David Howells   [PATCH] BLOCK: Mo...
137
138
  void emergency_sync(void)
  {
a2a9537ac   Jens Axboe   Get rid of pdflus...
139
140
141
142
143
144
145
  	struct work_struct *work;
  
  	work = kmalloc(sizeof(*work), GFP_ATOMIC);
  	if (work) {
  		INIT_WORK(work, do_sync_work);
  		schedule_work(work);
  	}
cf9a2ae8d   David Howells   [PATCH] BLOCK: Mo...
146
  }
b7ed78f56   Sage Weil   introduce sys_syn...
147
148
149
150
151
  /*
   * sync a single super
   */
  SYSCALL_DEFINE1(syncfs, int, fd)
  {
2903ff019   Al Viro   switch simple cas...
152
  	struct fd f = fdget(fd);
b7ed78f56   Sage Weil   introduce sys_syn...
153
154
  	struct super_block *sb;
  	int ret;
b7ed78f56   Sage Weil   introduce sys_syn...
155

2903ff019   Al Viro   switch simple cas...
156
  	if (!f.file)
b7ed78f56   Sage Weil   introduce sys_syn...
157
  		return -EBADF;
b583043e9   Al Viro   kill f_dentry uses
158
  	sb = f.file->f_path.dentry->d_sb;
b7ed78f56   Sage Weil   introduce sys_syn...
159
160
161
162
  
  	down_read(&sb->s_umount);
  	ret = sync_filesystem(sb);
  	up_read(&sb->s_umount);
2903ff019   Al Viro   switch simple cas...
163
  	fdput(f);
b7ed78f56   Sage Weil   introduce sys_syn...
164
165
  	return ret;
  }
4c728ef58   Christoph Hellwig   add a vfs_fsync h...
166
  /**
148f948ba   Jan Kara   vfs: Introduce ne...
167
   * vfs_fsync_range - helper to sync a range of data & metadata to disk
4c728ef58   Christoph Hellwig   add a vfs_fsync h...
168
   * @file:		file to sync
148f948ba   Jan Kara   vfs: Introduce ne...
169
170
171
   * @start:		offset in bytes of the beginning of data range to sync
   * @end:		offset in bytes of the end of data range (inclusive)
   * @datasync:		perform only datasync
4c728ef58   Christoph Hellwig   add a vfs_fsync h...
172
   *
148f948ba   Jan Kara   vfs: Introduce ne...
173
174
175
   * Write back data in range @start..@end and metadata for @file to disk.  If
   * @datasync is set only metadata needed to access modified file data is
   * written.
4c728ef58   Christoph Hellwig   add a vfs_fsync h...
176
   */
8018ab057   Christoph Hellwig   sanitize vfs_fsyn...
177
  int vfs_fsync_range(struct file *file, loff_t start, loff_t end, int datasync)
cf9a2ae8d   David Howells   [PATCH] BLOCK: Mo...
178
  {
0ae45f63d   Theodore Ts'o   vfs: add support ...
179
  	struct inode *inode = file->f_mapping->host;
72c2d5319   Al Viro   file->f_op is nev...
180
  	if (!file->f_op->fsync)
02c24a821   Josef Bacik   fs: push i_mutex ...
181
  		return -EINVAL;
0d07e5573   Christoph Hellwig   fs: don't clear I...
182
  	if (!datasync && (inode->i_state & I_DIRTY_TIME))
0ae45f63d   Theodore Ts'o   vfs: add support ...
183
  		mark_inode_dirty_sync(inode);
0f41074a6   Jeff Layton   fs: remove call_f...
184
  	return file->f_op->fsync(file, start, end, datasync);
cf9a2ae8d   David Howells   [PATCH] BLOCK: Mo...
185
  }
148f948ba   Jan Kara   vfs: Introduce ne...
186
187
188
189
190
  EXPORT_SYMBOL(vfs_fsync_range);
  
  /**
   * vfs_fsync - perform a fsync or fdatasync on a file
   * @file:		file to sync
148f948ba   Jan Kara   vfs: Introduce ne...
191
192
193
194
   * @datasync:		only perform a fdatasync operation
   *
   * Write back data and metadata for @file to disk.  If @datasync is
   * set only metadata needed to access modified file data is written.
148f948ba   Jan Kara   vfs: Introduce ne...
195
   */
8018ab057   Christoph Hellwig   sanitize vfs_fsyn...
196
  int vfs_fsync(struct file *file, int datasync)
148f948ba   Jan Kara   vfs: Introduce ne...
197
  {
8018ab057   Christoph Hellwig   sanitize vfs_fsyn...
198
  	return vfs_fsync_range(file, 0, LLONG_MAX, datasync);
148f948ba   Jan Kara   vfs: Introduce ne...
199
  }
4c728ef58   Christoph Hellwig   add a vfs_fsync h...
200
  EXPORT_SYMBOL(vfs_fsync);
cf9a2ae8d   David Howells   [PATCH] BLOCK: Mo...
201

4c728ef58   Christoph Hellwig   add a vfs_fsync h...
202
  static int do_fsync(unsigned int fd, int datasync)
cf9a2ae8d   David Howells   [PATCH] BLOCK: Mo...
203
  {
2903ff019   Al Viro   switch simple cas...
204
  	struct fd f = fdget(fd);
cf9a2ae8d   David Howells   [PATCH] BLOCK: Mo...
205
  	int ret = -EBADF;
2903ff019   Al Viro   switch simple cas...
206
207
208
  	if (f.file) {
  		ret = vfs_fsync(f.file, datasync);
  		fdput(f);
cf9a2ae8d   David Howells   [PATCH] BLOCK: Mo...
209
210
211
  	}
  	return ret;
  }
a5f8fa9e9   Heiko Carstens   [CVE-2009-0029] S...
212
  SYSCALL_DEFINE1(fsync, unsigned int, fd)
cf9a2ae8d   David Howells   [PATCH] BLOCK: Mo...
213
  {
4c728ef58   Christoph Hellwig   add a vfs_fsync h...
214
  	return do_fsync(fd, 0);
cf9a2ae8d   David Howells   [PATCH] BLOCK: Mo...
215
  }
a5f8fa9e9   Heiko Carstens   [CVE-2009-0029] S...
216
  SYSCALL_DEFINE1(fdatasync, unsigned int, fd)
cf9a2ae8d   David Howells   [PATCH] BLOCK: Mo...
217
  {
4c728ef58   Christoph Hellwig   add a vfs_fsync h...
218
  	return do_fsync(fd, 1);
cf9a2ae8d   David Howells   [PATCH] BLOCK: Mo...
219
220
221
  }
  
  /*
f79e2abb9   Andrew Morton   [PATCH] sys_sync_...
222
223
224
225
226
227
228
229
230
231
   * sys_sync_file_range() permits finely controlled syncing over a segment of
   * a file in the range offset .. (offset+nbytes-1) inclusive.  If nbytes is
   * zero then sys_sync_file_range() will operate from offset out to EOF.
   *
   * The flag bits are:
   *
   * SYNC_FILE_RANGE_WAIT_BEFORE: wait upon writeout of all pages in the range
   * before performing the write.
   *
   * SYNC_FILE_RANGE_WRITE: initiate writeout of all those dirty pages in the
cce770815   Pavel Machek   SYNC_FILE_RANGE_W...
232
233
   * range which are not presently under writeback. Note that this may block for
   * significant periods due to exhaustion of disk request structures.
f79e2abb9   Andrew Morton   [PATCH] sys_sync_...
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
   *
   * SYNC_FILE_RANGE_WAIT_AFTER: wait upon writeout of all pages in the range
   * after performing the write.
   *
   * Useful combinations of the flag bits are:
   *
   * SYNC_FILE_RANGE_WAIT_BEFORE|SYNC_FILE_RANGE_WRITE: ensures that all pages
   * in the range which were dirty on entry to sys_sync_file_range() are placed
   * under writeout.  This is a start-write-for-data-integrity operation.
   *
   * SYNC_FILE_RANGE_WRITE: start writeout of all dirty pages in the range which
   * are not presently under writeout.  This is an asynchronous flush-to-disk
   * operation.  Not suitable for data integrity operations.
   *
   * SYNC_FILE_RANGE_WAIT_BEFORE (or SYNC_FILE_RANGE_WAIT_AFTER): wait for
   * completion of writeout of all pages in the range.  This will be used after an
   * earlier SYNC_FILE_RANGE_WAIT_BEFORE|SYNC_FILE_RANGE_WRITE operation to wait
   * for that operation to complete and to return the result.
   *
   * SYNC_FILE_RANGE_WAIT_BEFORE|SYNC_FILE_RANGE_WRITE|SYNC_FILE_RANGE_WAIT_AFTER:
   * a traditional sync() operation.  This is a write-for-data-integrity operation
   * which will ensure that all pages in the range which were dirty on entry to
   * sys_sync_file_range() are committed to disk.
   *
   *
   * SYNC_FILE_RANGE_WAIT_BEFORE and SYNC_FILE_RANGE_WAIT_AFTER will detect any
   * I/O errors or ENOSPC conditions and will return those to the caller, after
   * clearing the EIO and ENOSPC flags in the address_space.
   *
   * It should be noted that none of these operations write out the file's
   * metadata.  So unless the application is strictly performing overwrites of
   * already-instantiated disk blocks, there are no guarantees here that the data
   * will be available after a crash.
   */
806cbae12   Dominik Brodowski   fs: add ksys_sync...
268
269
  int ksys_sync_file_range(int fd, loff_t offset, loff_t nbytes,
  			 unsigned int flags)
f79e2abb9   Andrew Morton   [PATCH] sys_sync_...
270
271
  {
  	int ret;
2903ff019   Al Viro   switch simple cas...
272
  	struct fd f;
7a0ad10c3   Christoph Hellwig   fold do_sync_file...
273
  	struct address_space *mapping;
f79e2abb9   Andrew Morton   [PATCH] sys_sync_...
274
  	loff_t endbyte;			/* inclusive */
f79e2abb9   Andrew Morton   [PATCH] sys_sync_...
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
  	umode_t i_mode;
  
  	ret = -EINVAL;
  	if (flags & ~VALID_FLAGS)
  		goto out;
  
  	endbyte = offset + nbytes;
  
  	if ((s64)offset < 0)
  		goto out;
  	if ((s64)endbyte < 0)
  		goto out;
  	if (endbyte < offset)
  		goto out;
  
  	if (sizeof(pgoff_t) == 4) {
09cbfeaf1   Kirill A. Shutemov   mm, fs: get rid o...
291
  		if (offset >= (0x100000000ULL << PAGE_SHIFT)) {
f79e2abb9   Andrew Morton   [PATCH] sys_sync_...
292
293
294
295
296
297
298
  			/*
  			 * The range starts outside a 32 bit machine's
  			 * pagecache addressing capabilities.  Let it "succeed"
  			 */
  			ret = 0;
  			goto out;
  		}
09cbfeaf1   Kirill A. Shutemov   mm, fs: get rid o...
299
  		if (endbyte >= (0x100000000ULL << PAGE_SHIFT)) {
f79e2abb9   Andrew Morton   [PATCH] sys_sync_...
300
301
302
303
304
305
306
307
  			/*
  			 * Out to EOF
  			 */
  			nbytes = 0;
  		}
  	}
  
  	if (nbytes == 0)
111ebb6e6   OGAWA Hirofumi   [PATCH] writeback...
308
  		endbyte = LLONG_MAX;
f79e2abb9   Andrew Morton   [PATCH] sys_sync_...
309
310
311
312
  	else
  		endbyte--;		/* inclusive */
  
  	ret = -EBADF;
2903ff019   Al Viro   switch simple cas...
313
314
  	f = fdget(fd);
  	if (!f.file)
f79e2abb9   Andrew Morton   [PATCH] sys_sync_...
315
  		goto out;
496ad9aa8   Al Viro   new helper: file_...
316
  	i_mode = file_inode(f.file)->i_mode;
f79e2abb9   Andrew Morton   [PATCH] sys_sync_...
317
318
319
320
  	ret = -ESPIPE;
  	if (!S_ISREG(i_mode) && !S_ISBLK(i_mode) && !S_ISDIR(i_mode) &&
  			!S_ISLNK(i_mode))
  		goto out_put;
2903ff019   Al Viro   switch simple cas...
321
  	mapping = f.file->f_mapping;
7a0ad10c3   Christoph Hellwig   fold do_sync_file...
322
323
  	ret = 0;
  	if (flags & SYNC_FILE_RANGE_WAIT_BEFORE) {
6454568d9   Jeff Layton   fs: convert sync_...
324
  		ret = file_fdatawait_range(f.file, offset, endbyte);
7a0ad10c3   Christoph Hellwig   fold do_sync_file...
325
326
327
328
329
  		if (ret < 0)
  			goto out_put;
  	}
  
  	if (flags & SYNC_FILE_RANGE_WRITE) {
23d012709   Jan Kara   fs/sync.c: make s...
330
331
  		ret = __filemap_fdatawrite_range(mapping, offset, endbyte,
  						 WB_SYNC_NONE);
7a0ad10c3   Christoph Hellwig   fold do_sync_file...
332
333
334
335
336
  		if (ret < 0)
  			goto out_put;
  	}
  
  	if (flags & SYNC_FILE_RANGE_WAIT_AFTER)
6454568d9   Jeff Layton   fs: convert sync_...
337
  		ret = file_fdatawait_range(f.file, offset, endbyte);
7a0ad10c3   Christoph Hellwig   fold do_sync_file...
338

f79e2abb9   Andrew Morton   [PATCH] sys_sync_...
339
  out_put:
2903ff019   Al Viro   switch simple cas...
340
  	fdput(f);
f79e2abb9   Andrew Morton   [PATCH] sys_sync_...
341
342
343
  out:
  	return ret;
  }
806cbae12   Dominik Brodowski   fs: add ksys_sync...
344
345
346
347
348
  SYSCALL_DEFINE4(sync_file_range, int, fd, loff_t, offset, loff_t, nbytes,
  				unsigned int, flags)
  {
  	return ksys_sync_file_range(fd, offset, nbytes, flags);
  }
edd5cd4a9   David Woodhouse   Introduce fixed s...
349
350
  /* It would be nice if people remember that not all the world's an i386
     when they introduce new system calls */
4a0fd5bf0   Al Viro   teach SYSCALL_DEF...
351
352
  SYSCALL_DEFINE4(sync_file_range2, int, fd, unsigned int, flags,
  				 loff_t, offset, loff_t, nbytes)
edd5cd4a9   David Woodhouse   Introduce fixed s...
353
  {
806cbae12   Dominik Brodowski   fs: add ksys_sync...
354
  	return ksys_sync_file_range(fd, offset, nbytes, flags);
edd5cd4a9   David Woodhouse   Introduce fixed s...
355
  }