Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 17 Aug 2016 22:20:40 +0200
From:      Jilles Tjoelker <jilles@stack.nl>
To:        Konstantin Belousov <kib@FreeBSD.org>
Cc:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   Re: svn commit: r304176 - in head: include lib/libc/sys sys/compat/freebsd32 sys/kern
Message-ID:  <20160817202040.GA21263@stack.nl>
In-Reply-To: <201608151908.u7FJ8phh091939@repo.freebsd.org>
References:  <201608151908.u7FJ8phh091939@repo.freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On Mon, Aug 15, 2016 at 07:08:51PM +0000, Konstantin Belousov wrote:
> Author: kib
> Date: Mon Aug 15 19:08:51 2016
> New Revision: 304176
> URL: https://svnweb.freebsd.org/changeset/base/304176

> Log:
>   Add an implementation of fdatasync(2).

>   The syscall is a trivial wrapper around new VOP_FDATASYNC(), sharing
>   code with fsync(2).  For all filesystems, this commit provides the
>   implementation which delegates the work of VOP_FDATASYNC() to
>   VOP_FSYNC().  This is functionally correct but not efficient.

>   This is not yet POSIX-compliant implementation, because it does not
>   ensure that queued AIO requests are completed before returning.

>   Reviewed by:	mckusick
>   Discussed with:	avg (ZFS), jhb (AIO part)
>   Tested by:	pho
>   Sponsored by:	The FreeBSD Foundation
>   MFC after:	2 weeks
>   Differential revision:	https://reviews.freebsd.org/D7471

> Modified:
>   head/include/unistd.h
>   head/lib/libc/sys/Symbol.map
>   head/sys/compat/freebsd32/syscalls.master
>   head/sys/kern/syscalls.master
>   head/sys/kern/vfs_default.c
>   head/sys/kern/vfs_syscalls.c
>   head/sys/kern/vnode_if.src

> Modified: head/include/unistd.h
> ==============================================================================
> --- head/include/unistd.h	Mon Aug 15 19:05:41 2016	(r304175)
> +++ head/include/unistd.h	Mon Aug 15 19:08:51 2016	(r304176)
> @@ -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

Apparently these functions were added closely enough in time that they
can stay together here :)

> [snip]
> Modified: head/sys/kern/vfs_syscalls.c
> ==============================================================================
> --- head/sys/kern/vfs_syscalls.c	Mon Aug 15 19:05:41 2016	(r304175)
> +++ head/sys/kern/vfs_syscalls.c	Mon Aug 15 19:08:51 2016	(r304176)
> @@ -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 */;

Under the _POSIX_SYNCHRONIZED_IO option, completing outstanding I/O
requests is in fact required for fsync() as well. The fdatasync()
function is completely under the _POSIX_SYNCHRONIZED_IO option.

We do not implement this option, but keeping fdatasync()'s guarantees a
subset of fsync()'s guarantees seems sensible.

> +#endif
>  	error = vn_start_write(vp, &mp, V_WAIT | PCATCH);
>  	if (error != 0)
>  		goto drop;
> [snip]
> Modified: head/sys/kern/vnode_if.src
> ==============================================================================
> --- head/sys/kern/vnode_if.src	Mon Aug 15 19:05:41 2016	(r304175)
> +++ head/sys/kern/vnode_if.src	Mon Aug 15 19:08:51 2016	(r304176)
> @@ -703,6 +703,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,

A waitfor parameter like in vop_fsync may be useful to implement
aio_fsync(O_DSYNC) later on.

-- 
Jilles Tjoelker



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