summaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2017-09-06 17:11:03 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2017-09-06 17:11:03 -0400
commitec3604c7a5aae8953545b0d05495357009a960e5 (patch)
treedd3927047b90048231d924fc151a9d1881f7b8cd /fs
parent066dea8c30ae7d8e061145bcf5422ce0773582eb (diff)
parent6d4b51241394664fffbf68ea86c96d2699344583 (diff)
Merge tag 'wberr-v4.14-1' of git://git.kernel.org/pub/scm/linux/kernel/git/jlayton/linux
Pull writeback error handling updates from Jeff Layton: "This pile continues the work from last cycle on better tracking writeback errors. In v4.13 we added some basic errseq_t infrastructure and converted a few filesystems to use it. This set continues refining that infrastructure, adds documentation, and converts most of the other filesystems to use it. The main exception at this point is the NFS client" * tag 'wberr-v4.14-1' of git://git.kernel.org/pub/scm/linux/kernel/git/jlayton/linux: ecryptfs: convert to file_write_and_wait in ->fsync mm: remove optimizations based on i_size in mapping writeback waits fs: convert a pile of fsync routines to errseq_t based reporting gfs2: convert to errseq_t based writeback error reporting for fsync fs: convert sync_file_range to use errseq_t based error-tracking mm: add file_fdatawait_range and file_write_and_wait fuse: convert to errseq_t based error tracking for fsync mm: consolidate dax / non-dax checks for writeback Documentation: add some docs for errseq_t errseq: rename __errseq_set to errseq_set
Diffstat (limited to 'fs')
-rw-r--r--fs/9p/vfs_file.c4
-rw-r--r--fs/affs/file.c2
-rw-r--r--fs/afs/write.c2
-rw-r--r--fs/cifs/file.c4
-rw-r--r--fs/ecryptfs/file.c2
-rw-r--r--fs/exofs/file.c2
-rw-r--r--fs/f2fs/file.c2
-rw-r--r--fs/fuse/file.c6
-rw-r--r--fs/gfs2/file.c6
-rw-r--r--fs/hfs/inode.c2
-rw-r--r--fs/hfsplus/inode.c2
-rw-r--r--fs/hostfs/hostfs_kern.c2
-rw-r--r--fs/hpfs/file.c2
-rw-r--r--fs/jffs2/file.c2
-rw-r--r--fs/jfs/file.c2
-rw-r--r--fs/ncpfs/file.c2
-rw-r--r--fs/ntfs/dir.c2
-rw-r--r--fs/ntfs/file.c2
-rw-r--r--fs/ocfs2/file.c2
-rw-r--r--fs/reiserfs/dir.c2
-rw-r--r--fs/reiserfs/file.c2
-rw-r--r--fs/sync.c4
-rw-r--r--fs/ubifs/file.c2
23 files changed, 31 insertions, 29 deletions
diff --git a/fs/9p/vfs_file.c b/fs/9p/vfs_file.c
index 43c242e17132..03c9e325bfbc 100644
--- a/fs/9p/vfs_file.c
+++ b/fs/9p/vfs_file.c
@@ -445,7 +445,7 @@ static int v9fs_file_fsync(struct file *filp, loff_t start, loff_t end,
445 struct p9_wstat wstat; 445 struct p9_wstat wstat;
446 int retval; 446 int retval;
447 447
448 retval = filemap_write_and_wait_range(inode->i_mapping, start, end); 448 retval = file_write_and_wait_range(filp, start, end);
449 if (retval) 449 if (retval)
450 return retval; 450 return retval;
451 451
@@ -468,7 +468,7 @@ int v9fs_file_fsync_dotl(struct file *filp, loff_t start, loff_t end,
468 struct inode *inode = filp->f_mapping->host; 468 struct inode *inode = filp->f_mapping->host;
469 int retval; 469 int retval;
470 470
471 retval = filemap_write_and_wait_range(inode->i_mapping, start, end); 471 retval = file_write_and_wait_range(filp, start, end);
472 if (retval) 472 if (retval)
473 return retval; 473 return retval;
474 474
diff --git a/fs/affs/file.c b/fs/affs/file.c
index 196ee7f6fdc4..00331810f690 100644
--- a/fs/affs/file.c
+++ b/fs/affs/file.c
@@ -954,7 +954,7 @@ int affs_file_fsync(struct file *filp, loff_t start, loff_t end, int datasync)
954 struct inode *inode = filp->f_mapping->host; 954 struct inode *inode = filp->f_mapping->host;
955 int ret, err; 955 int ret, err;
956 956
957 err = filemap_write_and_wait_range(inode->i_mapping, start, end); 957 err = file_write_and_wait_range(filp, start, end);
958 if (err) 958 if (err)
959 return err; 959 return err;
960 960
diff --git a/fs/afs/write.c b/fs/afs/write.c
index 2d2fccd5044b..106e43db1115 100644
--- a/fs/afs/write.c
+++ b/fs/afs/write.c
@@ -714,7 +714,7 @@ int afs_fsync(struct file *file, loff_t start, loff_t end, int datasync)
714 vnode->fid.vid, vnode->fid.vnode, file, 714 vnode->fid.vid, vnode->fid.vnode, file,
715 datasync); 715 datasync);
716 716
717 ret = filemap_write_and_wait_range(inode->i_mapping, start, end); 717 ret = file_write_and_wait_range(file, start, end);
718 if (ret) 718 if (ret)
719 return ret; 719 return ret;
720 inode_lock(inode); 720 inode_lock(inode);
diff --git a/fs/cifs/file.c b/fs/cifs/file.c
index bc09df6b473a..0786f19d288f 100644
--- a/fs/cifs/file.c
+++ b/fs/cifs/file.c
@@ -2329,7 +2329,7 @@ int cifs_strict_fsync(struct file *file, loff_t start, loff_t end,
2329 struct inode *inode = file_inode(file); 2329 struct inode *inode = file_inode(file);
2330 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb); 2330 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
2331 2331
2332 rc = filemap_write_and_wait_range(inode->i_mapping, start, end); 2332 rc = file_write_and_wait_range(file, start, end);
2333 if (rc) 2333 if (rc)
2334 return rc; 2334 return rc;
2335 inode_lock(inode); 2335 inode_lock(inode);
@@ -2371,7 +2371,7 @@ int cifs_fsync(struct file *file, loff_t start, loff_t end, int datasync)
2371 struct cifs_sb_info *cifs_sb = CIFS_FILE_SB(file); 2371 struct cifs_sb_info *cifs_sb = CIFS_FILE_SB(file);
2372 struct inode *inode = file->f_mapping->host; 2372 struct inode *inode = file->f_mapping->host;
2373 2373
2374 rc = filemap_write_and_wait_range(inode->i_mapping, start, end); 2374 rc = file_write_and_wait_range(file, start, end);
2375 if (rc) 2375 if (rc)
2376 return rc; 2376 return rc;
2377 inode_lock(inode); 2377 inode_lock(inode);
diff --git a/fs/ecryptfs/file.c b/fs/ecryptfs/file.c
index ca4e83750214..c74ed3ca3372 100644
--- a/fs/ecryptfs/file.c
+++ b/fs/ecryptfs/file.c
@@ -328,7 +328,7 @@ ecryptfs_fsync(struct file *file, loff_t start, loff_t end, int datasync)
328{ 328{
329 int rc; 329 int rc;
330 330
331 rc = filemap_write_and_wait(file->f_mapping); 331 rc = file_write_and_wait(file);
332 if (rc) 332 if (rc)
333 return rc; 333 return rc;
334 334
diff --git a/fs/exofs/file.c b/fs/exofs/file.c
index 28645f0640f7..a94594ea2aa3 100644
--- a/fs/exofs/file.c
+++ b/fs/exofs/file.c
@@ -48,7 +48,7 @@ static int exofs_file_fsync(struct file *filp, loff_t start, loff_t end,
48 struct inode *inode = filp->f_mapping->host; 48 struct inode *inode = filp->f_mapping->host;
49 int ret; 49 int ret;
50 50
51 ret = filemap_write_and_wait_range(inode->i_mapping, start, end); 51 ret = file_write_and_wait_range(filp, start, end);
52 if (ret) 52 if (ret)
53 return ret; 53 return ret;
54 54
diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c
index 2706130c261b..843a0d99f7ea 100644
--- a/fs/f2fs/file.c
+++ b/fs/f2fs/file.c
@@ -206,7 +206,7 @@ static int f2fs_do_sync_file(struct file *file, loff_t start, loff_t end,
206 /* if fdatasync is triggered, let's do in-place-update */ 206 /* if fdatasync is triggered, let's do in-place-update */
207 if (datasync || get_dirty_pages(inode) <= SM_I(sbi)->min_fsync_blocks) 207 if (datasync || get_dirty_pages(inode) <= SM_I(sbi)->min_fsync_blocks)
208 set_inode_flag(inode, FI_NEED_IPU); 208 set_inode_flag(inode, FI_NEED_IPU);
209 ret = filemap_write_and_wait_range(inode->i_mapping, start, end); 209 ret = file_write_and_wait_range(file, start, end);
210 clear_inode_flag(inode, FI_NEED_IPU); 210 clear_inode_flag(inode, FI_NEED_IPU);
211 211
212 if (ret) { 212 if (ret) {
diff --git a/fs/fuse/file.c b/fs/fuse/file.c
index 0273029b1220..d66789804287 100644
--- a/fs/fuse/file.c
+++ b/fs/fuse/file.c
@@ -457,7 +457,7 @@ int fuse_fsync_common(struct file *file, loff_t start, loff_t end,
457 * wait for all outstanding writes, before sending the FSYNC 457 * wait for all outstanding writes, before sending the FSYNC
458 * request. 458 * request.
459 */ 459 */
460 err = filemap_write_and_wait_range(inode->i_mapping, start, end); 460 err = file_write_and_wait_range(file, start, end);
461 if (err) 461 if (err)
462 goto out; 462 goto out;
463 463
@@ -465,10 +465,10 @@ int fuse_fsync_common(struct file *file, loff_t start, loff_t end,
465 465
466 /* 466 /*
467 * Due to implementation of fuse writeback 467 * Due to implementation of fuse writeback
468 * filemap_write_and_wait_range() does not catch errors. 468 * file_write_and_wait_range() does not catch errors.
469 * We have to do this directly after fuse_sync_writes() 469 * We have to do this directly after fuse_sync_writes()
470 */ 470 */
471 err = filemap_check_errors(file->f_mapping); 471 err = file_check_and_advance_wb_err(file);
472 if (err) 472 if (err)
473 goto out; 473 goto out;
474 474
diff --git a/fs/gfs2/file.c b/fs/gfs2/file.c
index bb48074be019..33a0cb5701a3 100644
--- a/fs/gfs2/file.c
+++ b/fs/gfs2/file.c
@@ -668,12 +668,14 @@ static int gfs2_fsync(struct file *file, loff_t start, loff_t end,
668 if (ret) 668 if (ret)
669 return ret; 669 return ret;
670 if (gfs2_is_jdata(ip)) 670 if (gfs2_is_jdata(ip))
671 filemap_write_and_wait(mapping); 671 ret = file_write_and_wait(file);
672 if (ret)
673 return ret;
672 gfs2_ail_flush(ip->i_gl, 1); 674 gfs2_ail_flush(ip->i_gl, 1);
673 } 675 }
674 676
675 if (mapping->nrpages) 677 if (mapping->nrpages)
676 ret = filemap_fdatawait_range(mapping, start, end); 678 ret = file_fdatawait_range(file, start, end);
677 679
678 return ret ? ret : ret1; 680 return ret ? ret : ret1;
679} 681}
diff --git a/fs/hfs/inode.c b/fs/hfs/inode.c
index bfbba799430f..2538b49cc349 100644
--- a/fs/hfs/inode.c
+++ b/fs/hfs/inode.c
@@ -656,7 +656,7 @@ static int hfs_file_fsync(struct file *filp, loff_t start, loff_t end,
656 struct super_block * sb; 656 struct super_block * sb;
657 int ret, err; 657 int ret, err;
658 658
659 ret = filemap_write_and_wait_range(inode->i_mapping, start, end); 659 ret = file_write_and_wait_range(filp, start, end);
660 if (ret) 660 if (ret)
661 return ret; 661 return ret;
662 inode_lock(inode); 662 inode_lock(inode);
diff --git a/fs/hfsplus/inode.c b/fs/hfsplus/inode.c
index e8638d528195..4f26b6877130 100644
--- a/fs/hfsplus/inode.c
+++ b/fs/hfsplus/inode.c
@@ -283,7 +283,7 @@ int hfsplus_file_fsync(struct file *file, loff_t start, loff_t end,
283 struct hfsplus_sb_info *sbi = HFSPLUS_SB(inode->i_sb); 283 struct hfsplus_sb_info *sbi = HFSPLUS_SB(inode->i_sb);
284 int error = 0, error2; 284 int error = 0, error2;
285 285
286 error = filemap_write_and_wait_range(inode->i_mapping, start, end); 286 error = file_write_and_wait_range(file, start, end);
287 if (error) 287 if (error)
288 return error; 288 return error;
289 inode_lock(inode); 289 inode_lock(inode);
diff --git a/fs/hostfs/hostfs_kern.c b/fs/hostfs/hostfs_kern.c
index e61261a7417e..c148e7f4f451 100644
--- a/fs/hostfs/hostfs_kern.c
+++ b/fs/hostfs/hostfs_kern.c
@@ -374,7 +374,7 @@ static int hostfs_fsync(struct file *file, loff_t start, loff_t end,
374 struct inode *inode = file->f_mapping->host; 374 struct inode *inode = file->f_mapping->host;
375 int ret; 375 int ret;
376 376
377 ret = filemap_write_and_wait_range(inode->i_mapping, start, end); 377 ret = file_write_and_wait_range(file, start, end);
378 if (ret) 378 if (ret)
379 return ret; 379 return ret;
380 380
diff --git a/fs/hpfs/file.c b/fs/hpfs/file.c
index b3be1b5a62e2..f26138425b16 100644
--- a/fs/hpfs/file.c
+++ b/fs/hpfs/file.c
@@ -24,7 +24,7 @@ int hpfs_file_fsync(struct file *file, loff_t start, loff_t end, int datasync)
24 struct inode *inode = file->f_mapping->host; 24 struct inode *inode = file->f_mapping->host;
25 int ret; 25 int ret;
26 26
27 ret = filemap_write_and_wait_range(file->f_mapping, start, end); 27 ret = file_write_and_wait_range(file, start, end);
28 if (ret) 28 if (ret)
29 return ret; 29 return ret;
30 return sync_blockdev(inode->i_sb->s_bdev); 30 return sync_blockdev(inode->i_sb->s_bdev);
diff --git a/fs/jffs2/file.c b/fs/jffs2/file.c
index c12476e309c6..bd0428bebe9b 100644
--- a/fs/jffs2/file.c
+++ b/fs/jffs2/file.c
@@ -35,7 +35,7 @@ int jffs2_fsync(struct file *filp, loff_t start, loff_t end, int datasync)
35 struct jffs2_sb_info *c = JFFS2_SB_INFO(inode->i_sb); 35 struct jffs2_sb_info *c = JFFS2_SB_INFO(inode->i_sb);
36 int ret; 36 int ret;
37 37
38 ret = filemap_write_and_wait_range(inode->i_mapping, start, end); 38 ret = file_write_and_wait_range(filp, start, end);
39 if (ret) 39 if (ret)
40 return ret; 40 return ret;
41 41
diff --git a/fs/jfs/file.c b/fs/jfs/file.c
index 739492c7a3fd..36665fd37095 100644
--- a/fs/jfs/file.c
+++ b/fs/jfs/file.c
@@ -34,7 +34,7 @@ int jfs_fsync(struct file *file, loff_t start, loff_t end, int datasync)
34 struct inode *inode = file->f_mapping->host; 34 struct inode *inode = file->f_mapping->host;
35 int rc = 0; 35 int rc = 0;
36 36
37 rc = filemap_write_and_wait_range(inode->i_mapping, start, end); 37 rc = file_write_and_wait_range(file, start, end);
38 if (rc) 38 if (rc)
39 return rc; 39 return rc;
40 40
diff --git a/fs/ncpfs/file.c b/fs/ncpfs/file.c
index 76965e772264..a06c07619ee6 100644
--- a/fs/ncpfs/file.c
+++ b/fs/ncpfs/file.c
@@ -23,7 +23,7 @@
23 23
24static int ncp_fsync(struct file *file, loff_t start, loff_t end, int datasync) 24static int ncp_fsync(struct file *file, loff_t start, loff_t end, int datasync)
25{ 25{
26 return filemap_write_and_wait_range(file->f_mapping, start, end); 26 return file_write_and_wait_range(file, start, end);
27} 27}
28 28
29/* 29/*
diff --git a/fs/ntfs/dir.c b/fs/ntfs/dir.c
index 0ee19ecc982d..1a24be9e8405 100644
--- a/fs/ntfs/dir.c
+++ b/fs/ntfs/dir.c
@@ -1506,7 +1506,7 @@ static int ntfs_dir_fsync(struct file *filp, loff_t start, loff_t end,
1506 1506
1507 ntfs_debug("Entering for inode 0x%lx.", vi->i_ino); 1507 ntfs_debug("Entering for inode 0x%lx.", vi->i_ino);
1508 1508
1509 err = filemap_write_and_wait_range(vi->i_mapping, start, end); 1509 err = file_write_and_wait_range(filp, start, end);
1510 if (err) 1510 if (err)
1511 return err; 1511 return err;
1512 inode_lock(vi); 1512 inode_lock(vi);
diff --git a/fs/ntfs/file.c b/fs/ntfs/file.c
index c4f68c338735..331910fa8442 100644
--- a/fs/ntfs/file.c
+++ b/fs/ntfs/file.c
@@ -1989,7 +1989,7 @@ static int ntfs_file_fsync(struct file *filp, loff_t start, loff_t end,
1989 1989
1990 ntfs_debug("Entering for inode 0x%lx.", vi->i_ino); 1990 ntfs_debug("Entering for inode 0x%lx.", vi->i_ino);
1991 1991
1992 err = filemap_write_and_wait_range(vi->i_mapping, start, end); 1992 err = file_write_and_wait_range(filp, start, end);
1993 if (err) 1993 if (err)
1994 return err; 1994 return err;
1995 inode_lock(vi); 1995 inode_lock(vi);
diff --git a/fs/ocfs2/file.c b/fs/ocfs2/file.c
index bfeb647459d9..66e59d3163ea 100644
--- a/fs/ocfs2/file.c
+++ b/fs/ocfs2/file.c
@@ -196,7 +196,7 @@ static int ocfs2_sync_file(struct file *file, loff_t start, loff_t end,
196 if (ocfs2_is_hard_readonly(osb) || ocfs2_is_soft_readonly(osb)) 196 if (ocfs2_is_hard_readonly(osb) || ocfs2_is_soft_readonly(osb))
197 return -EROFS; 197 return -EROFS;
198 198
199 err = filemap_write_and_wait_range(inode->i_mapping, start, end); 199 err = file_write_and_wait_range(file, start, end);
200 if (err) 200 if (err)
201 return err; 201 return err;
202 202
diff --git a/fs/reiserfs/dir.c b/fs/reiserfs/dir.c
index 45aa05e2232f..5b50689d8539 100644
--- a/fs/reiserfs/dir.c
+++ b/fs/reiserfs/dir.c
@@ -34,7 +34,7 @@ static int reiserfs_dir_fsync(struct file *filp, loff_t start, loff_t end,
34 struct inode *inode = filp->f_mapping->host; 34 struct inode *inode = filp->f_mapping->host;
35 int err; 35 int err;
36 36
37 err = filemap_write_and_wait_range(inode->i_mapping, start, end); 37 err = file_write_and_wait_range(filp, start, end);
38 if (err) 38 if (err)
39 return err; 39 return err;
40 40
diff --git a/fs/reiserfs/file.c b/fs/reiserfs/file.c
index b396eb09f288..843aadcc123c 100644
--- a/fs/reiserfs/file.c
+++ b/fs/reiserfs/file.c
@@ -154,7 +154,7 @@ static int reiserfs_sync_file(struct file *filp, loff_t start, loff_t end,
154 int err; 154 int err;
155 int barrier_done; 155 int barrier_done;
156 156
157 err = filemap_write_and_wait_range(inode->i_mapping, start, end); 157 err = file_write_and_wait_range(filp, start, end);
158 if (err) 158 if (err)
159 return err; 159 return err;
160 160
diff --git a/fs/sync.c b/fs/sync.c
index 2a54c1f22035..27d6b8bbcb6a 100644
--- a/fs/sync.c
+++ b/fs/sync.c
@@ -342,7 +342,7 @@ SYSCALL_DEFINE4(sync_file_range, int, fd, loff_t, offset, loff_t, nbytes,
342 342
343 ret = 0; 343 ret = 0;
344 if (flags & SYNC_FILE_RANGE_WAIT_BEFORE) { 344 if (flags & SYNC_FILE_RANGE_WAIT_BEFORE) {
345 ret = filemap_fdatawait_range(mapping, offset, endbyte); 345 ret = file_fdatawait_range(f.file, offset, endbyte);
346 if (ret < 0) 346 if (ret < 0)
347 goto out_put; 347 goto out_put;
348 } 348 }
@@ -355,7 +355,7 @@ SYSCALL_DEFINE4(sync_file_range, int, fd, loff_t, offset, loff_t, nbytes,
355 } 355 }
356 356
357 if (flags & SYNC_FILE_RANGE_WAIT_AFTER) 357 if (flags & SYNC_FILE_RANGE_WAIT_AFTER)
358 ret = filemap_fdatawait_range(mapping, offset, endbyte); 358 ret = file_fdatawait_range(f.file, offset, endbyte);
359 359
360out_put: 360out_put:
361 fdput(f); 361 fdput(f);
diff --git a/fs/ubifs/file.c b/fs/ubifs/file.c
index 8cad0b19b404..f90a466ea5db 100644
--- a/fs/ubifs/file.c
+++ b/fs/ubifs/file.c
@@ -1337,7 +1337,7 @@ int ubifs_fsync(struct file *file, loff_t start, loff_t end, int datasync)
1337 */ 1337 */
1338 return 0; 1338 return 0;
1339 1339
1340 err = filemap_write_and_wait_range(inode->i_mapping, start, end); 1340 err = file_write_and_wait_range(file, start, end);
1341 if (err) 1341 if (err)
1342 return err; 1342 return err;
1343 inode_lock(inode); 1343 inode_lock(inode);