svn commit: r361785 - in head/sys/ufs: ffs ufs
Konstantin Belousov
kib at FreeBSD.org
Thu Jun 4 12:23:16 UTC 2020
Author: kib
Date: Thu Jun 4 12:23:15 2020
New Revision: 361785
URL: https://svnweb.freebsd.org/changeset/base/361785
Log:
UFS: write inode block for fdatasync(2) if pointers in inode where allocated
The fdatasync() description in POSIX specifies that
all I/O operations shall be completed as defined for synchronized I/O
data integrity completion.
and then the explanation of Synchronized I/O Data Integrity Completion says
The write is complete only when the data specified in the write
request is successfully transferred and all file system
information required to retrieve the data is successfully
transferred.
For UFS this means that all pointers must be on disk. Indirect
pointers already contribute to the list of dirty data blocks, so only
direct blocks and root pointers to indirect blocks, both of which
reside in the inode block, should be taken care of. In ffs_balloc(),
mark the inode with the new flag IN_IBLKDATA that specifies that
ffs_syncvnode(DATA_ONLY) needs a call to ffs_update() to flush the
inode block.
Reviewed by: mckusick
Discussed with: tmunro
Sponsored by: The FreeBSD Foundation
MFC after: 1 week
Differential revision: https://reviews.freebsd.org/D25072
Modified:
head/sys/ufs/ffs/ffs_balloc.c
head/sys/ufs/ffs/ffs_inode.c
head/sys/ufs/ffs/ffs_vnops.c
head/sys/ufs/ufs/inode.h
Modified: head/sys/ufs/ffs/ffs_balloc.c
==============================================================================
--- head/sys/ufs/ffs/ffs_balloc.c Thu Jun 4 09:06:03 2020 (r361784)
+++ head/sys/ufs/ffs/ffs_balloc.c Thu Jun 4 12:23:15 2020 (r361785)
@@ -224,7 +224,7 @@ ffs_balloc_ufs1(struct vnode *vp, off_t startoffset, i
nsize, 0, bp);
}
dp->di_db[lbn] = dbtofsb(fs, bp->b_blkno);
- UFS_INODE_SET_FLAG(ip, IN_CHANGE | IN_UPDATE);
+ UFS_INODE_SET_FLAG(ip, IN_CHANGE | IN_UPDATE | IN_IBLKDATA);
*bpp = bp;
return (0);
}
@@ -280,7 +280,7 @@ ffs_balloc_ufs1(struct vnode *vp, off_t startoffset, i
}
allocib = &dp->di_ib[indirs[0].in_off];
*allocib = nb;
- UFS_INODE_SET_FLAG(ip, IN_CHANGE | IN_UPDATE);
+ UFS_INODE_SET_FLAG(ip, IN_CHANGE | IN_UPDATE | IN_IBLKDATA);
}
/*
* Fetch through the indirect blocks, allocating as necessary.
@@ -721,7 +721,7 @@ ffs_balloc_ufs2(struct vnode *vp, off_t startoffset, i
nsize, 0, bp);
}
dp->di_extb[lbn] = dbtofsb(fs, bp->b_blkno);
- UFS_INODE_SET_FLAG(ip, IN_CHANGE);
+ UFS_INODE_SET_FLAG(ip, IN_CHANGE | IN_IBLKDATA);
*bpp = bp;
return (0);
}
@@ -750,7 +750,8 @@ ffs_balloc_ufs2(struct vnode *vp, off_t startoffset, i
ip->i_size = smalllblktosize(fs, nb + 1);
dp->di_size = ip->i_size;
dp->di_db[nb] = dbtofsb(fs, bp->b_blkno);
- UFS_INODE_SET_FLAG(ip, IN_CHANGE | IN_UPDATE);
+ UFS_INODE_SET_FLAG(ip, IN_CHANGE | IN_UPDATE |
+ IN_IBLKDATA);
if (flags & IO_SYNC)
bwrite(bp);
else
@@ -820,7 +821,7 @@ ffs_balloc_ufs2(struct vnode *vp, off_t startoffset, i
nsize, 0, bp);
}
dp->di_db[lbn] = dbtofsb(fs, bp->b_blkno);
- UFS_INODE_SET_FLAG(ip, IN_CHANGE | IN_UPDATE);
+ UFS_INODE_SET_FLAG(ip, IN_CHANGE | IN_UPDATE | IN_IBLKDATA);
*bpp = bp;
return (0);
}
@@ -877,7 +878,7 @@ ffs_balloc_ufs2(struct vnode *vp, off_t startoffset, i
}
allocib = &dp->di_ib[indirs[0].in_off];
*allocib = nb;
- UFS_INODE_SET_FLAG(ip, IN_CHANGE | IN_UPDATE);
+ UFS_INODE_SET_FLAG(ip, IN_CHANGE | IN_UPDATE | IN_IBLKDATA);
}
/*
* Fetch through the indirect blocks, allocating as necessary.
Modified: head/sys/ufs/ffs/ffs_inode.c
==============================================================================
--- head/sys/ufs/ffs/ffs_inode.c Thu Jun 4 09:06:03 2020 (r361784)
+++ head/sys/ufs/ffs/ffs_inode.c Thu Jun 4 12:23:15 2020 (r361785)
@@ -94,7 +94,7 @@ ffs_update(vp, waitfor)
ip = VTOI(vp);
if ((ip->i_flag & IN_MODIFIED) == 0 && waitfor == 0)
return (0);
- ip->i_flag &= ~(IN_LAZYACCESS | IN_LAZYMOD | IN_MODIFIED);
+ ip->i_flag &= ~(IN_LAZYACCESS | IN_LAZYMOD | IN_MODIFIED | IN_IBLKDATA);
fs = ITOFS(ip);
if (fs->fs_ronly && ITOUMP(ip)->um_fsckpid == 0)
return (0);
Modified: head/sys/ufs/ffs/ffs_vnops.c
==============================================================================
--- head/sys/ufs/ffs/ffs_vnops.c Thu Jun 4 09:06:03 2020 (r361784)
+++ head/sys/ufs/ffs/ffs_vnops.c Thu Jun 4 12:23:15 2020 (r361785)
@@ -416,6 +416,8 @@ next:
error = ffs_update(vp, 1);
if (DOINGSUJ(vp))
softdep_journal_fsync(VTOI(vp));
+ } else if ((ip->i_flags & IN_IBLKDATA) != 0) {
+ error = ffs_update(vp, 1);
}
return (error);
}
Modified: head/sys/ufs/ufs/inode.h
==============================================================================
--- head/sys/ufs/ufs/inode.h Thu Jun 4 09:06:03 2020 (r361784)
+++ head/sys/ufs/ufs/inode.h Thu Jun 4 12:23:15 2020 (r361785)
@@ -129,13 +129,13 @@ struct inode {
suspension finished */
#define IN_EA_LOCKED 0x0080
#define IN_EA_LOCKWAIT 0x0100
-
#define IN_TRUNCATED 0x0200 /* Journaled truncation pending. */
-
#define IN_UFS2 0x0400 /* UFS2 vs UFS1 */
+#define IN_IBLKDATA 0x0800 /* datasync requires inode block
+ update */
#define PRINT_INODE_FLAGS "\20\20b16\17b15\16b14\15b13" \
- "\14b12\13is_ufs2\12truncated\11ea_lockwait\10ea_locked" \
+ "\14iblkdata\13is_ufs2\12truncated\11ea_lockwait\10ea_locked" \
"\7lazyaccess\6lazymod\5needsync\4modified\3update\2change\1access"
#define UFS_INODE_FLAG_LAZY_MASK \
More information about the svn-src-all
mailing list