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