Skip to content

Commit

Permalink
Linux: syncfs(2) should sync all open files
Browse files Browse the repository at this point in the history
While debugging problem with data not being synced on umount, we've
noticed that even syncfs(2) doesn't help to get the data written
out. It is because it doesn't actually sync any of the live znodes.

Signed-off-by: Pavel Snajdr <[email protected]>
  • Loading branch information
snajpa committed Nov 28, 2024
1 parent 0ffa6f3 commit 5666433
Showing 1 changed file with 13 additions and 1 deletion.
14 changes: 13 additions & 1 deletion module/os/linux/zfs/zpl_super.c
Original file line number Diff line number Diff line change
Expand Up @@ -109,11 +109,23 @@ zpl_sync_fs(struct super_block *sb, int wait)
{
fstrans_cookie_t cookie;
cred_t *cr = CRED();
znode_t *zp;
zfsvfs_t *zfsvfs = sb->s_fs_info;
int error;

crhold(cr);
cookie = spl_fstrans_mark();
error = -zfs_sync(sb, wait, cr);
mutex_enter(&zfsvfs->z_znodes_lock);
for (zp = list_head(&zfsvfs->z_all_znodes); zp;
zp = list_next(&zfsvfs->z_all_znodes, zp)) {
if (zp->z_sa_hdl)
error = -zfs_fsync(zp, wait, cr);
if (error != 0)
break;
}
mutex_exit(&zfsvfs->z_znodes_lock);
if (error == 0)
error = -zfs_sync(sb, wait, cr);
spl_fstrans_unmark(cookie);
crfree(cr);
ASSERT3S(error, <=, 0);
Expand Down

0 comments on commit 5666433

Please sign in to comment.