]> Pileus Git - ~andy/linux/blob - fs/sync.c
b3d2a001293f429b980141d680e555b26309dd2b
[~andy/linux] / fs / sync.c
1 /*
2  * High-level sync()-related operations
3  */
4
5 #include <linux/kernel.h>
6 #include <linux/file.h>
7 #include <linux/fs.h>
8 #include <linux/slab.h>
9 #include <linux/export.h>
10 #include <linux/namei.h>
11 #include <linux/sched.h>
12 #include <linux/writeback.h>
13 #include <linux/syscalls.h>
14 #include <linux/linkage.h>
15 #include <linux/pagemap.h>
16 #include <linux/quotaops.h>
17 #include <linux/backing-dev.h>
18 #include "internal.h"
19
20 #define VALID_FLAGS (SYNC_FILE_RANGE_WAIT_BEFORE|SYNC_FILE_RANGE_WRITE| \
21                         SYNC_FILE_RANGE_WAIT_AFTER)
22
23 /*
24  * Do the filesystem syncing work. For simple filesystems
25  * writeback_inodes_sb(sb) just dirties buffers with inodes so we have to
26  * submit IO for these buffers via __sync_blockdev(). This also speeds up the
27  * wait == 1 case since in that case write_inode() functions do
28  * sync_dirty_buffer() and thus effectively write one block at a time.
29  */
30 static int __sync_filesystem(struct super_block *sb, int wait)
31 {
32         if (sb->s_qcop && sb->s_qcop->quota_sync)
33                 sb->s_qcop->quota_sync(sb, -1, wait);
34
35         if (wait)
36                 sync_inodes_sb(sb);
37         else
38                 writeback_inodes_sb(sb, WB_REASON_SYNC);
39
40         if (sb->s_op->sync_fs)
41                 sb->s_op->sync_fs(sb, wait);
42         return __sync_blockdev(sb->s_bdev, wait);
43 }
44
45 /*
46  * Write out and wait upon all dirty data associated with this
47  * superblock.  Filesystem data as well as the underlying block
48  * device.  Takes the superblock lock.
49  */
50 int sync_filesystem(struct super_block *sb)
51 {
52         int ret;
53
54         /*
55          * We need to be protected against the filesystem going from
56          * r/o to r/w or vice versa.
57          */
58         WARN_ON(!rwsem_is_locked(&sb->s_umount));
59
60         /*
61          * No point in syncing out anything if the filesystem is read-only.
62          */
63         if (sb->s_flags & MS_RDONLY)
64                 return 0;
65
66         ret = __sync_filesystem(sb, 0);
67         if (ret < 0)
68                 return ret;
69         return __sync_filesystem(sb, 1);
70 }
71 EXPORT_SYMBOL_GPL(sync_filesystem);
72
73 static void sync_one_sb(struct super_block *sb, void *arg)
74 {
75         if (!(sb->s_flags & MS_RDONLY))
76                 __sync_filesystem(sb, *(int *)arg);
77 }
78 /*
79  * Sync all the data for all the filesystems (called by sys_sync() and
80  * emergency sync)
81  */
82 static void sync_filesystems(int wait)
83 {
84         iterate_supers(sync_one_sb, &wait);
85 }
86
87 /*
88  * sync everything.  Start out by waking pdflush, because that writes back
89  * all queues in parallel.
90  */
91 SYSCALL_DEFINE0(sync)
92 {
93         wakeup_flusher_threads(0, WB_REASON_SYNC);
94         sync_filesystems(0);
95         sync_filesystems(1);
96         if (unlikely(laptop_mode))
97                 laptop_sync_completion();
98         return 0;
99 }
100
101 static void do_sync_work(struct work_struct *work)
102 {
103         /*
104          * Sync twice to reduce the possibility we skipped some inodes / pages
105          * because they were temporarily locked
106          */
107         sync_filesystems(0);
108         sync_filesystems(0);
109         printk("Emergency Sync complete\n");
110         kfree(work);
111 }
112
113 void emergency_sync(void)
114 {
115         struct work_struct *work;
116
117         work = kmalloc(sizeof(*work), GFP_ATOMIC);
118         if (work) {
119                 INIT_WORK(work, do_sync_work);
120                 schedule_work(work);
121         }
122 }
123
124 /*
125  * sync a single super
126  */
127 SYSCALL_DEFINE1(syncfs, int, fd)
128 {
129         struct file *file;
130         struct super_block *sb;
131         int ret;
132         int fput_needed;
133
134         file = fget_light(fd, &fput_needed);
135         if (!file)
136                 return -EBADF;
137         sb = file->f_dentry->d_sb;
138
139         down_read(&sb->s_umount);
140         ret = sync_filesystem(sb);
141         up_read(&sb->s_umount);
142
143         fput_light(file, fput_needed);
144         return ret;
145 }
146
147 /**
148  * vfs_fsync_range - helper to sync a range of data & metadata to disk
149  * @file:               file to sync
150  * @start:              offset in bytes of the beginning of data range to sync
151  * @end:                offset in bytes of the end of data range (inclusive)
152  * @datasync:           perform only datasync
153  *
154  * Write back data in range @start..@end and metadata for @file to disk.  If
155  * @datasync is set only metadata needed to access modified file data is
156  * written.
157  */
158 int vfs_fsync_range(struct file *file, loff_t start, loff_t end, int datasync)
159 {
160         if (!file->f_op || !file->f_op->fsync)
161                 return -EINVAL;
162         return file->f_op->fsync(file, start, end, datasync);
163 }
164 EXPORT_SYMBOL(vfs_fsync_range);
165
166 /**
167  * vfs_fsync - perform a fsync or fdatasync on a file
168  * @file:               file to sync
169  * @datasync:           only perform a fdatasync operation
170  *
171  * Write back data and metadata for @file to disk.  If @datasync is
172  * set only metadata needed to access modified file data is written.
173  */
174 int vfs_fsync(struct file *file, int datasync)
175 {
176         return vfs_fsync_range(file, 0, LLONG_MAX, datasync);
177 }
178 EXPORT_SYMBOL(vfs_fsync);
179
180 static int do_fsync(unsigned int fd, int datasync)
181 {
182         struct file *file;
183         int ret = -EBADF;
184         int fput_needed;
185
186         file = fget_light(fd, &fput_needed);
187         if (file) {
188                 ret = vfs_fsync(file, datasync);
189                 fput_light(file, fput_needed);
190         }
191         return ret;
192 }
193
194 SYSCALL_DEFINE1(fsync, unsigned int, fd)
195 {
196         return do_fsync(fd, 0);
197 }
198
199 SYSCALL_DEFINE1(fdatasync, unsigned int, fd)
200 {
201         return do_fsync(fd, 1);
202 }
203
204 /**
205  * generic_write_sync - perform syncing after a write if file / inode is sync
206  * @file:       file to which the write happened
207  * @pos:        offset where the write started
208  * @count:      length of the write
209  *
210  * This is just a simple wrapper about our general syncing function.
211  */
212 int generic_write_sync(struct file *file, loff_t pos, loff_t count)
213 {
214         if (!(file->f_flags & O_DSYNC) && !IS_SYNC(file->f_mapping->host))
215                 return 0;
216         return vfs_fsync_range(file, pos, pos + count - 1,
217                                (file->f_flags & __O_SYNC) ? 0 : 1);
218 }
219 EXPORT_SYMBOL(generic_write_sync);
220
221 /*
222  * sys_sync_file_range() permits finely controlled syncing over a segment of
223  * a file in the range offset .. (offset+nbytes-1) inclusive.  If nbytes is
224  * zero then sys_sync_file_range() will operate from offset out to EOF.
225  *
226  * The flag bits are:
227  *
228  * SYNC_FILE_RANGE_WAIT_BEFORE: wait upon writeout of all pages in the range
229  * before performing the write.
230  *
231  * SYNC_FILE_RANGE_WRITE: initiate writeout of all those dirty pages in the
232  * range which are not presently under writeback. Note that this may block for
233  * significant periods due to exhaustion of disk request structures.
234  *
235  * SYNC_FILE_RANGE_WAIT_AFTER: wait upon writeout of all pages in the range
236  * after performing the write.
237  *
238  * Useful combinations of the flag bits are:
239  *
240  * SYNC_FILE_RANGE_WAIT_BEFORE|SYNC_FILE_RANGE_WRITE: ensures that all pages
241  * in the range which were dirty on entry to sys_sync_file_range() are placed
242  * under writeout.  This is a start-write-for-data-integrity operation.
243  *
244  * SYNC_FILE_RANGE_WRITE: start writeout of all dirty pages in the range which
245  * are not presently under writeout.  This is an asynchronous flush-to-disk
246  * operation.  Not suitable for data integrity operations.
247  *
248  * SYNC_FILE_RANGE_WAIT_BEFORE (or SYNC_FILE_RANGE_WAIT_AFTER): wait for
249  * completion of writeout of all pages in the range.  This will be used after an
250  * earlier SYNC_FILE_RANGE_WAIT_BEFORE|SYNC_FILE_RANGE_WRITE operation to wait
251  * for that operation to complete and to return the result.
252  *
253  * SYNC_FILE_RANGE_WAIT_BEFORE|SYNC_FILE_RANGE_WRITE|SYNC_FILE_RANGE_WAIT_AFTER:
254  * a traditional sync() operation.  This is a write-for-data-integrity operation
255  * which will ensure that all pages in the range which were dirty on entry to
256  * sys_sync_file_range() are committed to disk.
257  *
258  *
259  * SYNC_FILE_RANGE_WAIT_BEFORE and SYNC_FILE_RANGE_WAIT_AFTER will detect any
260  * I/O errors or ENOSPC conditions and will return those to the caller, after
261  * clearing the EIO and ENOSPC flags in the address_space.
262  *
263  * It should be noted that none of these operations write out the file's
264  * metadata.  So unless the application is strictly performing overwrites of
265  * already-instantiated disk blocks, there are no guarantees here that the data
266  * will be available after a crash.
267  */
268 SYSCALL_DEFINE(sync_file_range)(int fd, loff_t offset, loff_t nbytes,
269                                 unsigned int flags)
270 {
271         int ret;
272         struct file *file;
273         struct address_space *mapping;
274         loff_t endbyte;                 /* inclusive */
275         int fput_needed;
276         umode_t i_mode;
277
278         ret = -EINVAL;
279         if (flags & ~VALID_FLAGS)
280                 goto out;
281
282         endbyte = offset + nbytes;
283
284         if ((s64)offset < 0)
285                 goto out;
286         if ((s64)endbyte < 0)
287                 goto out;
288         if (endbyte < offset)
289                 goto out;
290
291         if (sizeof(pgoff_t) == 4) {
292                 if (offset >= (0x100000000ULL << PAGE_CACHE_SHIFT)) {
293                         /*
294                          * The range starts outside a 32 bit machine's
295                          * pagecache addressing capabilities.  Let it "succeed"
296                          */
297                         ret = 0;
298                         goto out;
299                 }
300                 if (endbyte >= (0x100000000ULL << PAGE_CACHE_SHIFT)) {
301                         /*
302                          * Out to EOF
303                          */
304                         nbytes = 0;
305                 }
306         }
307
308         if (nbytes == 0)
309                 endbyte = LLONG_MAX;
310         else
311                 endbyte--;              /* inclusive */
312
313         ret = -EBADF;
314         file = fget_light(fd, &fput_needed);
315         if (!file)
316                 goto out;
317
318         i_mode = file->f_path.dentry->d_inode->i_mode;
319         ret = -ESPIPE;
320         if (!S_ISREG(i_mode) && !S_ISBLK(i_mode) && !S_ISDIR(i_mode) &&
321                         !S_ISLNK(i_mode))
322                 goto out_put;
323
324         mapping = file->f_mapping;
325         if (!mapping) {
326                 ret = -EINVAL;
327                 goto out_put;
328         }
329
330         ret = 0;
331         if (flags & SYNC_FILE_RANGE_WAIT_BEFORE) {
332                 ret = filemap_fdatawait_range(mapping, offset, endbyte);
333                 if (ret < 0)
334                         goto out_put;
335         }
336
337         if (flags & SYNC_FILE_RANGE_WRITE) {
338                 ret = filemap_fdatawrite_range(mapping, offset, endbyte);
339                 if (ret < 0)
340                         goto out_put;
341         }
342
343         if (flags & SYNC_FILE_RANGE_WAIT_AFTER)
344                 ret = filemap_fdatawait_range(mapping, offset, endbyte);
345
346 out_put:
347         fput_light(file, fput_needed);
348 out:
349         return ret;
350 }
351 #ifdef CONFIG_HAVE_SYSCALL_WRAPPERS
352 asmlinkage long SyS_sync_file_range(long fd, loff_t offset, loff_t nbytes,
353                                     long flags)
354 {
355         return SYSC_sync_file_range((int) fd, offset, nbytes,
356                                     (unsigned int) flags);
357 }
358 SYSCALL_ALIAS(sys_sync_file_range, SyS_sync_file_range);
359 #endif
360
361 /* It would be nice if people remember that not all the world's an i386
362    when they introduce new system calls */
363 SYSCALL_DEFINE(sync_file_range2)(int fd, unsigned int flags,
364                                  loff_t offset, loff_t nbytes)
365 {
366         return sys_sync_file_range(fd, offset, nbytes, flags);
367 }
368 #ifdef CONFIG_HAVE_SYSCALL_WRAPPERS
369 asmlinkage long SyS_sync_file_range2(long fd, long flags,
370                                      loff_t offset, loff_t nbytes)
371 {
372         return SYSC_sync_file_range2((int) fd, (unsigned int) flags,
373                                      offset, nbytes);
374 }
375 SYSCALL_ALIAS(sys_sync_file_range2, SyS_sync_file_range2);
376 #endif