diff options
| author | Anand Avati <avati@redhat.com> | 2013-03-25 12:18:13 -0700 | 
|---|---|---|
| committer | Anand Avati <avati@redhat.com> | 2013-03-29 12:07:40 -0700 | 
| commit | fdb05c6f84054ca640e3da1c19ea7d536d2751e0 (patch) | |
| tree | 2e1f020f7a92c9212c7a0550957c8a7a2ab34abe | |
| parent | 0b81f2801b7a72130d86c88da938f288430cd3e5 (diff) | |
storage/posix: honor O_SYNC and O_DSYNC sent in @flags of writev()
Historic bug - posix_writev() has been inspecting pfd->flushwrites for
performing fsync() after write, instead of @flags for O_SYNC|O_DSYNC.
pfd->flushwrites was never set anywhere and is unused completely. This
is behavior from the time before anonymous FD where open() had @wbflags
param. This is a leftover from that cleanup.
Change-Id: Id9bfe562a60db4eb3bd0a7705bdba91f2df2f3ec
BUG: 916372
Signed-off-by: Anand Avati <avati@redhat.com>
Reviewed-on: http://review.gluster.org/4738
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Pranith Kumar Karampuri <pkarampu@redhat.com>
| -rw-r--r-- | xlators/storage/posix/src/posix.c | 14 | ||||
| -rw-r--r-- | xlators/storage/posix/src/posix.h | 1 | 
2 files changed, 10 insertions, 5 deletions
diff --git a/xlators/storage/posix/src/posix.c b/xlators/storage/posix/src/posix.c index 04b5f9bbce7..9465e1d6893 100644 --- a/xlators/storage/posix/src/posix.c +++ b/xlators/storage/posix/src/posix.c @@ -2147,10 +2147,16 @@ posix_writev (call_frame_t *frame, xlator_t *this, fd_t *fd,                   * the file we wrote to                   */ -                if (pfd->flushwrites) { -                        /* NOTE: ignore the error, if one occurs at this -                         * point */ -                        fsync (_fd); +                if (flags & (O_SYNC|O_DSYNC)) { +                        ret = fsync (_fd); +			if (ret) { +				gf_log (this->name, GF_LOG_ERROR, +					"fsync() in writev on fd %d failed: %s", +					_fd, strerror (errno)); +				op_ret = -1; +				op_errno = errno; +				goto out; +			}                  }                  ret = posix_fdstat (this, _fd, &postop); diff --git a/xlators/storage/posix/src/posix.h b/xlators/storage/posix/src/posix.h index 4703a1fd432..58f445c699a 100644 --- a/xlators/storage/posix/src/posix.h +++ b/xlators/storage/posix/src/posix.h @@ -57,7 +57,6 @@ struct posix_fd {  	int     fd;      /* fd returned by the kernel */  	int32_t flags;   /* flags for open/creat      */  	DIR *   dir;     /* handle returned by the kernel */ -        int     flushwrites;          int     odirect;          struct list_head list; /* to add to the janitor list */  };  | 
