Blame view

fs/sync.c 9.85 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
   */
5cee5815d   Jan Kara   vfs: Make sys_syn...
102
  SYSCALL_DEFINE0(sync)
cf9a2ae8d   David Howells   [PATCH] BLOCK: Mo...
103
  {
b3de65310   Jan Kara   vfs: Reorder oper...
104
  	int nowait = 0, wait = 1;
0e175a183   Curt Wohlgemuth   writeback: Add a ...
105
  	wakeup_flusher_threads(0, 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();
cf9a2ae8d   David Howells   [PATCH] BLOCK: Mo...
113
114
  	return 0;
  }
a2a9537ac   Jens Axboe   Get rid of pdflus...
115
116
  static void do_sync_work(struct work_struct *work)
  {
b3de65310   Jan Kara   vfs: Reorder oper...
117
  	int nowait = 0;
5cee5815d   Jan Kara   vfs: Make sys_syn...
118
119
120
121
  	/*
  	 * Sync twice to reduce the possibility we skipped some inodes / pages
  	 * because they were temporarily locked
  	 */
b3de65310   Jan Kara   vfs: Reorder oper...
122
123
  	iterate_supers(sync_inodes_one_sb, &nowait);
  	iterate_supers(sync_fs_one_sb, &nowait);
d0e91b13e   Jan Kara   vfs: Remove unnec...
124
  	iterate_bdevs(fdatawrite_one_bdev, NULL);
b3de65310   Jan Kara   vfs: Reorder oper...
125
126
  	iterate_supers(sync_inodes_one_sb, &nowait);
  	iterate_supers(sync_fs_one_sb, &nowait);
d0e91b13e   Jan Kara   vfs: Remove unnec...
127
  	iterate_bdevs(fdatawrite_one_bdev, NULL);
5cee5815d   Jan Kara   vfs: Make sys_syn...
128
129
  	printk("Emergency Sync complete
  ");
a2a9537ac   Jens Axboe   Get rid of pdflus...
130
131
  	kfree(work);
  }
cf9a2ae8d   David Howells   [PATCH] BLOCK: Mo...
132
133
  void emergency_sync(void)
  {
a2a9537ac   Jens Axboe   Get rid of pdflus...
134
135
136
137
138
139
140
  	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...
141
  }
b7ed78f56   Sage Weil   introduce sys_syn...
142
143
144
145
146
  /*
   * sync a single super
   */
  SYSCALL_DEFINE1(syncfs, int, fd)
  {
2903ff019   Al Viro   switch simple cas...
147
  	struct fd f = fdget(fd);
b7ed78f56   Sage Weil   introduce sys_syn...
148
149
  	struct super_block *sb;
  	int ret;
b7ed78f56   Sage Weil   introduce sys_syn...
150

2903ff019   Al Viro   switch simple cas...
151
  	if (!f.file)
b7ed78f56   Sage Weil   introduce sys_syn...
152
  		return -EBADF;
b583043e9   Al Viro   kill f_dentry uses
153
  	sb = f.file->f_path.dentry->d_sb;
b7ed78f56   Sage Weil   introduce sys_syn...
154
155
156
157
  
  	down_read(&sb->s_umount);
  	ret = sync_filesystem(sb);
  	up_read(&sb->s_umount);
2903ff019   Al Viro   switch simple cas...
158
  	fdput(f);
b7ed78f56   Sage Weil   introduce sys_syn...
159
160
  	return ret;
  }
4c728ef58   Christoph Hellwig   add a vfs_fsync h...
161
  /**
148f948ba   Jan Kara   vfs: Introduce ne...
162
   * vfs_fsync_range - helper to sync a range of data & metadata to disk
4c728ef58   Christoph Hellwig   add a vfs_fsync h...
163
   * @file:		file to sync
148f948ba   Jan Kara   vfs: Introduce ne...
164
165
166
   * @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...
167
   *
148f948ba   Jan Kara   vfs: Introduce ne...
168
169
170
   * 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...
171
   */
8018ab057   Christoph Hellwig   sanitize vfs_fsyn...
172
  int vfs_fsync_range(struct file *file, loff_t start, loff_t end, int datasync)
cf9a2ae8d   David Howells   [PATCH] BLOCK: Mo...
173
  {
0ae45f63d   Theodore Ts'o   vfs: add support ...
174
  	struct inode *inode = file->f_mapping->host;
72c2d5319   Al Viro   file->f_op is nev...
175
  	if (!file->f_op->fsync)
02c24a821   Josef Bacik   fs: push i_mutex ...
176
  		return -EINVAL;
0ae45f63d   Theodore Ts'o   vfs: add support ...
177
178
179
180
181
182
  	if (!datasync && (inode->i_state & I_DIRTY_TIME)) {
  		spin_lock(&inode->i_lock);
  		inode->i_state &= ~I_DIRTY_TIME;
  		spin_unlock(&inode->i_lock);
  		mark_inode_dirty_sync(inode);
  	}
0f41074a6   Jeff Layton   fs: remove call_f...
183
  	return file->f_op->fsync(file, start, end, datasync);
cf9a2ae8d   David Howells   [PATCH] BLOCK: Mo...
184
  }
148f948ba   Jan Kara   vfs: Introduce ne...
185
186
187
188
189
  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...
190
191
192
193
   * @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...
194
   */
8018ab057   Christoph Hellwig   sanitize vfs_fsyn...
195
  int vfs_fsync(struct file *file, int datasync)
148f948ba   Jan Kara   vfs: Introduce ne...
196
  {
8018ab057   Christoph Hellwig   sanitize vfs_fsyn...
197
  	return vfs_fsync_range(file, 0, LLONG_MAX, datasync);
148f948ba   Jan Kara   vfs: Introduce ne...
198
  }
4c728ef58   Christoph Hellwig   add a vfs_fsync h...
199
  EXPORT_SYMBOL(vfs_fsync);
cf9a2ae8d   David Howells   [PATCH] BLOCK: Mo...
200

4c728ef58   Christoph Hellwig   add a vfs_fsync h...
201
  static int do_fsync(unsigned int fd, int datasync)
cf9a2ae8d   David Howells   [PATCH] BLOCK: Mo...
202
  {
2903ff019   Al Viro   switch simple cas...
203
  	struct fd f = fdget(fd);
cf9a2ae8d   David Howells   [PATCH] BLOCK: Mo...
204
  	int ret = -EBADF;
2903ff019   Al Viro   switch simple cas...
205
206
207
  	if (f.file) {
  		ret = vfs_fsync(f.file, datasync);
  		fdput(f);
cf9a2ae8d   David Howells   [PATCH] BLOCK: Mo...
208
209
210
  	}
  	return ret;
  }
a5f8fa9e9   Heiko Carstens   [CVE-2009-0029] S...
211
  SYSCALL_DEFINE1(fsync, unsigned int, fd)
cf9a2ae8d   David Howells   [PATCH] BLOCK: Mo...
212
  {
4c728ef58   Christoph Hellwig   add a vfs_fsync h...
213
  	return do_fsync(fd, 0);
cf9a2ae8d   David Howells   [PATCH] BLOCK: Mo...
214
  }
a5f8fa9e9   Heiko Carstens   [CVE-2009-0029] S...
215
  SYSCALL_DEFINE1(fdatasync, unsigned int, fd)
cf9a2ae8d   David Howells   [PATCH] BLOCK: Mo...
216
  {
4c728ef58   Christoph Hellwig   add a vfs_fsync h...
217
  	return do_fsync(fd, 1);
cf9a2ae8d   David Howells   [PATCH] BLOCK: Mo...
218
219
220
  }
  
  /*
f79e2abb9   Andrew Morton   [PATCH] sys_sync_...
221
222
223
224
225
226
227
228
229
230
   * 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...
231
232
   * 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_...
233
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
   *
   * 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.
   */
4a0fd5bf0   Al Viro   teach SYSCALL_DEF...
267
268
  SYSCALL_DEFINE4(sync_file_range, int, fd, loff_t, offset, loff_t, nbytes,
  				unsigned int, flags)
f79e2abb9   Andrew Morton   [PATCH] sys_sync_...
269
270
  {
  	int ret;
2903ff019   Al Viro   switch simple cas...
271
  	struct fd f;
7a0ad10c3   Christoph Hellwig   fold do_sync_file...
272
  	struct address_space *mapping;
f79e2abb9   Andrew Morton   [PATCH] sys_sync_...
273
  	loff_t endbyte;			/* inclusive */
f79e2abb9   Andrew Morton   [PATCH] sys_sync_...
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
  	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...
290
  		if (offset >= (0x100000000ULL << PAGE_SHIFT)) {
f79e2abb9   Andrew Morton   [PATCH] sys_sync_...
291
292
293
294
295
296
297
  			/*
  			 * 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...
298
  		if (endbyte >= (0x100000000ULL << PAGE_SHIFT)) {
f79e2abb9   Andrew Morton   [PATCH] sys_sync_...
299
300
301
302
303
304
305
306
  			/*
  			 * Out to EOF
  			 */
  			nbytes = 0;
  		}
  	}
  
  	if (nbytes == 0)
111ebb6e6   OGAWA Hirofumi   [PATCH] writeback...
307
  		endbyte = LLONG_MAX;
f79e2abb9   Andrew Morton   [PATCH] sys_sync_...
308
309
310
311
  	else
  		endbyte--;		/* inclusive */
  
  	ret = -EBADF;
2903ff019   Al Viro   switch simple cas...
312
313
  	f = fdget(fd);
  	if (!f.file)
f79e2abb9   Andrew Morton   [PATCH] sys_sync_...
314
  		goto out;
496ad9aa8   Al Viro   new helper: file_...
315
  	i_mode = file_inode(f.file)->i_mode;
f79e2abb9   Andrew Morton   [PATCH] sys_sync_...
316
317
318
319
  	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...
320
  	mapping = f.file->f_mapping;
7a0ad10c3   Christoph Hellwig   fold do_sync_file...
321
322
  	ret = 0;
  	if (flags & SYNC_FILE_RANGE_WAIT_BEFORE) {
6454568d9   Jeff Layton   fs: convert sync_...
323
  		ret = file_fdatawait_range(f.file, offset, endbyte);
7a0ad10c3   Christoph Hellwig   fold do_sync_file...
324
325
326
327
328
  		if (ret < 0)
  			goto out_put;
  	}
  
  	if (flags & SYNC_FILE_RANGE_WRITE) {
23d012709   Jan Kara   fs/sync.c: make s...
329
330
  		ret = __filemap_fdatawrite_range(mapping, offset, endbyte,
  						 WB_SYNC_NONE);
7a0ad10c3   Christoph Hellwig   fold do_sync_file...
331
332
333
334
335
  		if (ret < 0)
  			goto out_put;
  	}
  
  	if (flags & SYNC_FILE_RANGE_WAIT_AFTER)
6454568d9   Jeff Layton   fs: convert sync_...
336
  		ret = file_fdatawait_range(f.file, offset, endbyte);
7a0ad10c3   Christoph Hellwig   fold do_sync_file...
337

f79e2abb9   Andrew Morton   [PATCH] sys_sync_...
338
  out_put:
2903ff019   Al Viro   switch simple cas...
339
  	fdput(f);
f79e2abb9   Andrew Morton   [PATCH] sys_sync_...
340
341
342
  out:
  	return ret;
  }
edd5cd4a9   David Woodhouse   Introduce fixed s...
343
344
  /* 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...
345
346
  SYSCALL_DEFINE4(sync_file_range2, int, fd, unsigned int, flags,
  				 loff_t, offset, loff_t, nbytes)
edd5cd4a9   David Woodhouse   Introduce fixed s...
347
348
349
  {
  	return sys_sync_file_range(fd, offset, nbytes, flags);
  }