Message ID | 164316350055.2600168.13687764982467881652.stgit@magnolia (mailing list archive) |
---|---|
State | Superseded, archived |
Headers | show |
Series | vfs: actually return fs errors from ->sync_fs | expand |
On Tue 25-01-22 18:18:20, Darrick J. Wong wrote: > From: Darrick J. Wong <djwong@kernel.org> > > Strangely, sync_filesystem ignores the return code from the ->sync_fs > call, which means that syscalls like syncfs(2) never see the error. > This doesn't seem right, so fix that. > > Signed-off-by: Darrick J. Wong <djwong@kernel.org> Looks good. Feel free to add: Reviewed-by: Jan Kara <jack@suse.cz> Honza > --- > fs/sync.c | 18 ++++++++++++------ > 1 file changed, 12 insertions(+), 6 deletions(-) > > > diff --git a/fs/sync.c b/fs/sync.c > index 3ce8e2137f31..c7690016453e 100644 > --- a/fs/sync.c > +++ b/fs/sync.c > @@ -29,7 +29,7 @@ > */ > int sync_filesystem(struct super_block *sb) > { > - int ret; > + int ret = 0; > > /* > * We need to be protected against the filesystem going from > @@ -52,15 +52,21 @@ int sync_filesystem(struct super_block *sb) > * at a time. > */ > writeback_inodes_sb(sb, WB_REASON_SYNC); > - if (sb->s_op->sync_fs) > - sb->s_op->sync_fs(sb, 0); > + if (sb->s_op->sync_fs) { > + ret = sb->s_op->sync_fs(sb, 0); > + if (ret) > + return ret; > + } > ret = sync_blockdev_nowait(sb->s_bdev); > - if (ret < 0) > + if (ret) > return ret; > > sync_inodes_sb(sb); > - if (sb->s_op->sync_fs) > - sb->s_op->sync_fs(sb, 1); > + if (sb->s_op->sync_fs) { > + ret = sb->s_op->sync_fs(sb, 1); > + if (ret) > + return ret; > + } > return sync_blockdev(sb->s_bdev); > } > EXPORT_SYMBOL(sync_filesystem); >
Looks good,
Reviewed-by: Christoph Hellwig <hch@lst.de>
diff --git a/fs/sync.c b/fs/sync.c index 3ce8e2137f31..c7690016453e 100644 --- a/fs/sync.c +++ b/fs/sync.c @@ -29,7 +29,7 @@ */ int sync_filesystem(struct super_block *sb) { - int ret; + int ret = 0; /* * We need to be protected against the filesystem going from @@ -52,15 +52,21 @@ int sync_filesystem(struct super_block *sb) * at a time. */ writeback_inodes_sb(sb, WB_REASON_SYNC); - if (sb->s_op->sync_fs) - sb->s_op->sync_fs(sb, 0); + if (sb->s_op->sync_fs) { + ret = sb->s_op->sync_fs(sb, 0); + if (ret) + return ret; + } ret = sync_blockdev_nowait(sb->s_bdev); - if (ret < 0) + if (ret) return ret; sync_inodes_sb(sb); - if (sb->s_op->sync_fs) - sb->s_op->sync_fs(sb, 1); + if (sb->s_op->sync_fs) { + ret = sb->s_op->sync_fs(sb, 1); + if (ret) + return ret; + } return sync_blockdev(sb->s_bdev); } EXPORT_SYMBOL(sync_filesystem);