0001
0002
0003
0004
0005
0006 #include <linux/blkdev.h>
0007 #include <linux/kernel.h>
0008 #include <linux/file.h>
0009 #include <linux/fs.h>
0010 #include <linux/slab.h>
0011 #include <linux/export.h>
0012 #include <linux/namei.h>
0013 #include <linux/sched.h>
0014 #include <linux/writeback.h>
0015 #include <linux/syscalls.h>
0016 #include <linux/linkage.h>
0017 #include <linux/pagemap.h>
0018 #include <linux/quotaops.h>
0019 #include <linux/backing-dev.h>
0020 #include "internal.h"
0021
0022 #define VALID_FLAGS (SYNC_FILE_RANGE_WAIT_BEFORE|SYNC_FILE_RANGE_WRITE| \
0023 SYNC_FILE_RANGE_WAIT_AFTER)
0024
0025
0026
0027
0028
0029
0030 int sync_filesystem(struct super_block *sb)
0031 {
0032 int ret = 0;
0033
0034
0035
0036
0037
0038 WARN_ON(!rwsem_is_locked(&sb->s_umount));
0039
0040
0041
0042
0043 if (sb_rdonly(sb))
0044 return 0;
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054 writeback_inodes_sb(sb, WB_REASON_SYNC);
0055 if (sb->s_op->sync_fs) {
0056 ret = sb->s_op->sync_fs(sb, 0);
0057 if (ret)
0058 return ret;
0059 }
0060 ret = sync_blockdev_nowait(sb->s_bdev);
0061 if (ret)
0062 return ret;
0063
0064 sync_inodes_sb(sb);
0065 if (sb->s_op->sync_fs) {
0066 ret = sb->s_op->sync_fs(sb, 1);
0067 if (ret)
0068 return ret;
0069 }
0070 return sync_blockdev(sb->s_bdev);
0071 }
0072 EXPORT_SYMBOL(sync_filesystem);
0073
0074 static void sync_inodes_one_sb(struct super_block *sb, void *arg)
0075 {
0076 if (!sb_rdonly(sb))
0077 sync_inodes_sb(sb);
0078 }
0079
0080 static void sync_fs_one_sb(struct super_block *sb, void *arg)
0081 {
0082 if (!sb_rdonly(sb) && !(sb->s_iflags & SB_I_SKIP_SYNC) &&
0083 sb->s_op->sync_fs)
0084 sb->s_op->sync_fs(sb, *(int *)arg);
0085 }
0086
0087
0088
0089
0090
0091
0092
0093
0094
0095
0096
0097 void ksys_sync(void)
0098 {
0099 int nowait = 0, wait = 1;
0100
0101 wakeup_flusher_threads(WB_REASON_SYNC);
0102 iterate_supers(sync_inodes_one_sb, NULL);
0103 iterate_supers(sync_fs_one_sb, &nowait);
0104 iterate_supers(sync_fs_one_sb, &wait);
0105 sync_bdevs(false);
0106 sync_bdevs(true);
0107 if (unlikely(laptop_mode))
0108 laptop_sync_completion();
0109 }
0110
0111 SYSCALL_DEFINE0(sync)
0112 {
0113 ksys_sync();
0114 return 0;
0115 }
0116
0117 static void do_sync_work(struct work_struct *work)
0118 {
0119 int nowait = 0;
0120
0121
0122
0123
0124
0125 iterate_supers(sync_inodes_one_sb, &nowait);
0126 iterate_supers(sync_fs_one_sb, &nowait);
0127 sync_bdevs(false);
0128 iterate_supers(sync_inodes_one_sb, &nowait);
0129 iterate_supers(sync_fs_one_sb, &nowait);
0130 sync_bdevs(false);
0131 printk("Emergency Sync complete\n");
0132 kfree(work);
0133 }
0134
0135 void emergency_sync(void)
0136 {
0137 struct work_struct *work;
0138
0139 work = kmalloc(sizeof(*work), GFP_ATOMIC);
0140 if (work) {
0141 INIT_WORK(work, do_sync_work);
0142 schedule_work(work);
0143 }
0144 }
0145
0146
0147
0148
0149 SYSCALL_DEFINE1(syncfs, int, fd)
0150 {
0151 struct fd f = fdget(fd);
0152 struct super_block *sb;
0153 int ret, ret2;
0154
0155 if (!f.file)
0156 return -EBADF;
0157 sb = f.file->f_path.dentry->d_sb;
0158
0159 down_read(&sb->s_umount);
0160 ret = sync_filesystem(sb);
0161 up_read(&sb->s_umount);
0162
0163 ret2 = errseq_check_and_advance(&sb->s_wb_err, &f.file->f_sb_err);
0164
0165 fdput(f);
0166 return ret ? ret : ret2;
0167 }
0168
0169
0170
0171
0172
0173
0174
0175
0176
0177
0178
0179
0180 int vfs_fsync_range(struct file *file, loff_t start, loff_t end, int datasync)
0181 {
0182 struct inode *inode = file->f_mapping->host;
0183
0184 if (!file->f_op->fsync)
0185 return -EINVAL;
0186 if (!datasync && (inode->i_state & I_DIRTY_TIME))
0187 mark_inode_dirty_sync(inode);
0188 return file->f_op->fsync(file, start, end, datasync);
0189 }
0190 EXPORT_SYMBOL(vfs_fsync_range);
0191
0192
0193
0194
0195
0196
0197
0198
0199
0200 int vfs_fsync(struct file *file, int datasync)
0201 {
0202 return vfs_fsync_range(file, 0, LLONG_MAX, datasync);
0203 }
0204 EXPORT_SYMBOL(vfs_fsync);
0205
0206 static int do_fsync(unsigned int fd, int datasync)
0207 {
0208 struct fd f = fdget(fd);
0209 int ret = -EBADF;
0210
0211 if (f.file) {
0212 ret = vfs_fsync(f.file, datasync);
0213 fdput(f);
0214 }
0215 return ret;
0216 }
0217
0218 SYSCALL_DEFINE1(fsync, unsigned int, fd)
0219 {
0220 return do_fsync(fd, 0);
0221 }
0222
0223 SYSCALL_DEFINE1(fdatasync, unsigned int, fd)
0224 {
0225 return do_fsync(fd, 1);
0226 }
0227
0228 int sync_file_range(struct file *file, loff_t offset, loff_t nbytes,
0229 unsigned int flags)
0230 {
0231 int ret;
0232 struct address_space *mapping;
0233 loff_t endbyte;
0234 umode_t i_mode;
0235
0236 ret = -EINVAL;
0237 if (flags & ~VALID_FLAGS)
0238 goto out;
0239
0240 endbyte = offset + nbytes;
0241
0242 if ((s64)offset < 0)
0243 goto out;
0244 if ((s64)endbyte < 0)
0245 goto out;
0246 if (endbyte < offset)
0247 goto out;
0248
0249 if (sizeof(pgoff_t) == 4) {
0250 if (offset >= (0x100000000ULL << PAGE_SHIFT)) {
0251
0252
0253
0254
0255 ret = 0;
0256 goto out;
0257 }
0258 if (endbyte >= (0x100000000ULL << PAGE_SHIFT)) {
0259
0260
0261
0262 nbytes = 0;
0263 }
0264 }
0265
0266 if (nbytes == 0)
0267 endbyte = LLONG_MAX;
0268 else
0269 endbyte--;
0270
0271 i_mode = file_inode(file)->i_mode;
0272 ret = -ESPIPE;
0273 if (!S_ISREG(i_mode) && !S_ISBLK(i_mode) && !S_ISDIR(i_mode) &&
0274 !S_ISLNK(i_mode))
0275 goto out;
0276
0277 mapping = file->f_mapping;
0278 ret = 0;
0279 if (flags & SYNC_FILE_RANGE_WAIT_BEFORE) {
0280 ret = file_fdatawait_range(file, offset, endbyte);
0281 if (ret < 0)
0282 goto out;
0283 }
0284
0285 if (flags & SYNC_FILE_RANGE_WRITE) {
0286 int sync_mode = WB_SYNC_NONE;
0287
0288 if ((flags & SYNC_FILE_RANGE_WRITE_AND_WAIT) ==
0289 SYNC_FILE_RANGE_WRITE_AND_WAIT)
0290 sync_mode = WB_SYNC_ALL;
0291
0292 ret = __filemap_fdatawrite_range(mapping, offset, endbyte,
0293 sync_mode);
0294 if (ret < 0)
0295 goto out;
0296 }
0297
0298 if (flags & SYNC_FILE_RANGE_WAIT_AFTER)
0299 ret = file_fdatawait_range(file, offset, endbyte);
0300
0301 out:
0302 return ret;
0303 }
0304
0305
0306
0307
0308
0309
0310
0311
0312
0313
0314
0315
0316
0317
0318
0319
0320
0321
0322
0323
0324
0325
0326
0327
0328
0329
0330
0331
0332
0333
0334
0335
0336
0337
0338
0339
0340
0341
0342
0343
0344
0345
0346
0347
0348
0349
0350
0351
0352
0353
0354
0355 int ksys_sync_file_range(int fd, loff_t offset, loff_t nbytes,
0356 unsigned int flags)
0357 {
0358 int ret;
0359 struct fd f;
0360
0361 ret = -EBADF;
0362 f = fdget(fd);
0363 if (f.file)
0364 ret = sync_file_range(f.file, offset, nbytes, flags);
0365
0366 fdput(f);
0367 return ret;
0368 }
0369
0370 SYSCALL_DEFINE4(sync_file_range, int, fd, loff_t, offset, loff_t, nbytes,
0371 unsigned int, flags)
0372 {
0373 return ksys_sync_file_range(fd, offset, nbytes, flags);
0374 }
0375
0376 #if defined(CONFIG_COMPAT) && defined(__ARCH_WANT_COMPAT_SYNC_FILE_RANGE)
0377 COMPAT_SYSCALL_DEFINE6(sync_file_range, int, fd, compat_arg_u64_dual(offset),
0378 compat_arg_u64_dual(nbytes), unsigned int, flags)
0379 {
0380 return ksys_sync_file_range(fd, compat_arg_u64_glue(offset),
0381 compat_arg_u64_glue(nbytes), flags);
0382 }
0383 #endif
0384
0385
0386
0387 SYSCALL_DEFINE4(sync_file_range2, int, fd, unsigned int, flags,
0388 loff_t, offset, loff_t, nbytes)
0389 {
0390 return ksys_sync_file_range(fd, offset, nbytes, flags);
0391 }