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
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to