Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 29 Aug 2016 05:15:43 +0000 (UTC)
From:      Konstantin Belousov <kib@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-11@freebsd.org
Subject:   svn commit: r304977 - in stable/11: include lib/libc/sys sys/compat/freebsd32 sys/kern
Message-ID:  <201608290515.u7T5FhPf046667@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: kib
Date: Mon Aug 29 05:15:43 2016
New Revision: 304977
URL: https://svnweb.freebsd.org/changeset/base/304977

Log:
  MFC r304176:
  Add a trivial implementation of fdatasync(2).

Modified:
  stable/11/include/unistd.h
  stable/11/lib/libc/sys/Symbol.map
  stable/11/sys/compat/freebsd32/syscalls.master
  stable/11/sys/kern/syscalls.master
  stable/11/sys/kern/vfs_default.c
  stable/11/sys/kern/vfs_syscalls.c
  stable/11/sys/kern/vnode_if.src
Directory Properties:
  stable/11/   (props changed)

Modified: stable/11/include/unistd.h
==============================================================================
--- stable/11/include/unistd.h	Mon Aug 29 05:08:53 2016	(r304976)
+++ stable/11/include/unistd.h	Mon Aug 29 05:15:43 2016	(r304977)
@@ -384,6 +384,7 @@ extern int optind, opterr, optopt;
 /* ISO/IEC 9945-1: 1996 */
 #if __POSIX_VISIBLE >= 199506 || __XSI_VISIBLE
 int	 fsync(int);
+int	 fdatasync(int);
 
 /*
  * ftruncate() was in the POSIX Realtime Extension (it's used for shared

Modified: stable/11/lib/libc/sys/Symbol.map
==============================================================================
--- stable/11/lib/libc/sys/Symbol.map	Mon Aug 29 05:08:53 2016	(r304976)
+++ stable/11/lib/libc/sys/Symbol.map	Mon Aug 29 05:15:43 2016	(r304977)
@@ -398,6 +398,10 @@ FBSD_1.4 {
 	recvmmsg;
 };
 
+FBSD_1.5 {
+	 fdatasync;
+};
+
 FBSDprivate_1.0 {
 	___acl_aclcheck_fd;
 	__sys___acl_aclcheck_fd;
@@ -588,6 +592,8 @@ FBSDprivate_1.0 {
 	__sys_fstatfs;
 	_fsync;
 	__sys_fsync;
+	_fdatasync;
+	__sys_fdatasync;
 	_futimes;
 	__sys_futimes;
 	_getaudit;

Modified: stable/11/sys/compat/freebsd32/syscalls.master
==============================================================================
--- stable/11/sys/compat/freebsd32/syscalls.master	Mon Aug 29 05:08:53 2016	(r304976)
+++ stable/11/sys/compat/freebsd32/syscalls.master	Mon Aug 29 05:15:43 2016	(r304977)
@@ -1081,3 +1081,4 @@
 549	AUE_NULL	NOPROTO	{ int numa_setaffinity(cpuwhich_t which, \
 				    id_t id, \
 				    const struct vm_domain_policy *policy); }
+550	AUE_FSYNC	NOPROTO	{ int fdatasync(int fd); }

Modified: stable/11/sys/kern/syscalls.master
==============================================================================
--- stable/11/sys/kern/syscalls.master	Mon Aug 29 05:08:53 2016	(r304976)
+++ stable/11/sys/kern/syscalls.master	Mon Aug 29 05:15:43 2016	(r304977)
@@ -993,8 +993,9 @@
 				    id_t id, \
 				    struct vm_domain_policy_entry *policy); }
 549	AUE_NULL	STD	{ int numa_setaffinity(cpuwhich_t which, \
-				    id_t id, \
-				    const struct vm_domain_policy_entry *policy); }
+				    id_t id, const struct \
+				    vm_domain_policy_entry *policy); }
+550	AUE_FSYNC	STD	{ int fdatasync(int fd); }
 
 ; Please copy any additions and changes to the following compatability tables:
 ; sys/compat/freebsd32/syscalls.master

Modified: stable/11/sys/kern/vfs_default.c
==============================================================================
--- stable/11/sys/kern/vfs_default.c	Mon Aug 29 05:08:53 2016	(r304976)
+++ stable/11/sys/kern/vfs_default.c	Mon Aug 29 05:15:43 2016	(r304977)
@@ -83,6 +83,7 @@ static int vop_stdset_text(struct vop_se
 static int vop_stdunset_text(struct vop_unset_text_args *ap);
 static int vop_stdget_writecount(struct vop_get_writecount_args *ap);
 static int vop_stdadd_writecount(struct vop_add_writecount_args *ap);
+static int vop_stdfdatasync(struct vop_fdatasync_args *ap);
 static int vop_stdgetpages_async(struct vop_getpages_async_args *ap);
 
 /*
@@ -111,6 +112,7 @@ struct vop_vector default_vnodeops = {
 	.vop_bmap =		vop_stdbmap,
 	.vop_close =		VOP_NULL,
 	.vop_fsync =		VOP_NULL,
+	.vop_fdatasync =	vop_stdfdatasync,
 	.vop_getpages =		vop_stdgetpages,
 	.vop_getpages_async =	vop_stdgetpages_async,
 	.vop_getwritemount = 	vop_stdgetwritemount,
@@ -726,6 +728,13 @@ loop2:
 	return (error);
 }
 
+static int
+vop_stdfdatasync(struct vop_fdatasync_args *ap)
+{
+
+	return (VOP_FSYNC(ap->a_vp, MNT_WAIT, ap->a_td));
+}
+
 /* XXX Needs good comment and more info in the manpage (VOP_GETPAGES(9)). */
 int
 vop_stdgetpages(ap)

Modified: stable/11/sys/kern/vfs_syscalls.c
==============================================================================
--- stable/11/sys/kern/vfs_syscalls.c	Mon Aug 29 05:08:53 2016	(r304976)
+++ stable/11/sys/kern/vfs_syscalls.c	Mon Aug 29 05:15:43 2016	(r304977)
@@ -3354,20 +3354,8 @@ freebsd6_ftruncate(struct thread *td, st
 }
 #endif
 
-/*
- * Sync an open file.
- */
-#ifndef _SYS_SYSPROTO_H_
-struct fsync_args {
-	int	fd;
-};
-#endif
-int
-sys_fsync(td, uap)
-	struct thread *td;
-	struct fsync_args /* {
-		int fd;
-	} */ *uap;
+static int
+kern_fsync(struct thread *td, int fd, bool fullsync)
 {
 	struct vnode *vp;
 	struct mount *mp;
@@ -3375,11 +3363,15 @@ sys_fsync(td, uap)
 	cap_rights_t rights;
 	int error, lock_flags;
 
-	AUDIT_ARG_FD(uap->fd);
-	error = getvnode(td, uap->fd, cap_rights_init(&rights, CAP_FSYNC), &fp);
+	AUDIT_ARG_FD(fd);
+	error = getvnode(td, fd, cap_rights_init(&rights, CAP_FSYNC), &fp);
 	if (error != 0)
 		return (error);
 	vp = fp->f_vnode;
+#if 0
+	if (!fullsync)
+		/* XXXKIB: compete outstanding aio writes */;
+#endif
 	error = vn_start_write(vp, &mp, V_WAIT | PCATCH);
 	if (error != 0)
 		goto drop;
@@ -3396,8 +3388,7 @@ sys_fsync(td, uap)
 		vm_object_page_clean(vp->v_object, 0, 0, 0);
 		VM_OBJECT_WUNLOCK(vp->v_object);
 	}
-	error = VOP_FSYNC(vp, MNT_WAIT, td);
-
+	error = fullsync ? VOP_FSYNC(vp, MNT_WAIT, td) : VOP_FDATASYNC(vp, td);
 	VOP_UNLOCK(vp, 0);
 	vn_finished_write(mp);
 drop:
@@ -3406,6 +3397,28 @@ drop:
 }
 
 /*
+ * Sync an open file.
+ */
+#ifndef _SYS_SYSPROTO_H_
+struct fsync_args {
+	int	fd;
+};
+#endif
+int
+sys_fsync(struct thread *td, struct fsync_args *uap)
+{
+
+	return (kern_fsync(td, uap->fd, true));
+}
+
+int
+sys_fdatasync(struct thread *td, struct fdatasync_args *uap)
+{
+
+	return (kern_fsync(td, uap->fd, false));
+}
+
+/*
  * Rename files.  Source and destination must either both be directories, or
  * both not be directories.  If target is a directory, it must be empty.
  */

Modified: stable/11/sys/kern/vnode_if.src
==============================================================================
--- stable/11/sys/kern/vnode_if.src	Mon Aug 29 05:08:53 2016	(r304976)
+++ stable/11/sys/kern/vnode_if.src	Mon Aug 29 05:15:43 2016	(r304977)
@@ -707,6 +707,14 @@ vop_add_writecount {
 	IN int inc;
 };
 
+%% fdatasync	vp	L L L
+
+vop_fdatasync {
+	IN struct vnode *vp;
+	IN struct thread *td;
+};
+
+
 # The VOPs below are spares at the end of the table to allow new VOPs to be
 # added in stable branches without breaking the KBI.  New VOPs in HEAD should
 # be added above these spares.  When merging a new VOP to a stable branch,



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201608290515.u7T5FhPf046667>