diff options
Diffstat (limited to 'xlators')
| -rw-r--r-- | xlators/cluster/afr/src/afr-transaction.c | 3 | ||||
| -rw-r--r-- | xlators/features/shard/src/shard.c | 11 | ||||
| -rw-r--r-- | xlators/nfs/server/src/nfs-fops.c | 16 | ||||
| -rw-r--r-- | xlators/nfs/server/src/nfs3.c | 18 | ||||
| -rw-r--r-- | xlators/protocol/server/src/server-resolve.c | 2 | ||||
| -rw-r--r-- | xlators/storage/posix/src/posix-helpers.c | 1 | 
6 files changed, 30 insertions, 21 deletions
diff --git a/xlators/cluster/afr/src/afr-transaction.c b/xlators/cluster/afr/src/afr-transaction.c index 24af6290098..0953ed9ddec 100644 --- a/xlators/cluster/afr/src/afr-transaction.c +++ b/xlators/cluster/afr/src/afr-transaction.c @@ -2171,7 +2171,8 @@ afr_transaction_start (call_frame_t *frame, xlator_t *this)          if (!local->transaction.eager_lock_on && local->loc.inode) {                  fd = fd_lookup (local->loc.inode, frame->root->pid);                  if (fd == NULL) -                        fd = fd_lookup_anonymous (local->loc.inode); +                        fd = fd_lookup_anonymous (local->loc.inode, +                                                  GF_ANON_FD_FLAGS);                  if (fd) {                          afr_delayed_changelog_wake_up (this, fd); diff --git a/xlators/features/shard/src/shard.c b/xlators/features/shard/src/shard.c index 0967f734ea1..754987c229d 100644 --- a/xlators/features/shard/src/shard.c +++ b/xlators/features/shard/src/shard.c @@ -3651,6 +3651,7 @@ shard_common_inode_write_do (call_frame_t *frame, xlator_t *this)          shard_local_t  *local             = NULL;          struct iovec   *vec               = NULL;          gf_boolean_t    wind_failed       = _gf_false; +        gf_boolean_t    odirect           = _gf_false;          off_t           orig_offset       = 0;          off_t           shard_offset      = 0;          off_t           vec_offset        = 0; @@ -3681,6 +3682,9 @@ shard_common_inode_write_do (call_frame_t *frame, xlator_t *this)                  return 0;          } +        if ((fd->flags & O_DIRECT) && (local->fop == GF_FOP_WRITE)) +                odirect = _gf_true; +          while (cur_block <= last_block) {                  if (wind_failed) {                          shard_common_inode_write_do_cbk (frame, @@ -3738,6 +3742,13 @@ shard_common_inode_write_do (call_frame_t *frame, xlator_t *this)                                                                   NULL, NULL);                                  goto next;                          } + +                        if (local->fop == GF_FOP_WRITE) { +                                if (odirect) +                                        local->flags = O_DIRECT; +                                else +                                        local->flags = GF_ANON_FD_FLAGS; +                        }                  }                  shard_common_inode_write_wind (frame, this, anon_fd, diff --git a/xlators/nfs/server/src/nfs-fops.c b/xlators/nfs/server/src/nfs-fops.c index 52fdd9796c3..f6361f02161 100644 --- a/xlators/nfs/server/src/nfs-fops.c +++ b/xlators/nfs/server/src/nfs-fops.c @@ -1382,6 +1382,8 @@ nfs_fop_write (xlator_t *nfsx, xlator_t *xl, nfs_user_t *nfu, fd_t *fd,          call_frame_t            *frame = NULL;          int                     ret = -EFAULT;          struct nfs_fop_local    *nfl = NULL; +        int flags = 0; +        nfs3_call_state_t       *cs = local;          if ((!nfsx) || (!xl) || (!fd) || (!vector) || (!nfu) || (!srciobref))                  return ret; @@ -1399,8 +1401,20 @@ nfs_fop_write (xlator_t *nfsx, xlator_t *xl, nfs_user_t *nfu, fd_t *fd,          iobref_add (nfl->iobref, srciob);  */ + +        switch (cs->writetype) { +        case UNSTABLE: +                break; +        case DATA_SYNC: +                flags |= O_DSYNC; +                break; +        case FILE_SYNC: +                flags |= O_SYNC; +                break; +        } +          STACK_WIND_COOKIE (frame, nfs_fop_writev_cbk, xl, xl,xl->fops->writev, -                           fd, vector, count, offset, fd->flags, srciobref, NULL); +                           fd, vector, count, offset, flags, srciobref, NULL);          ret = 0;  err:          if (ret < 0) { diff --git a/xlators/nfs/server/src/nfs3.c b/xlators/nfs/server/src/nfs3.c index f9e679d7e7e..64287c5b1bd 100644 --- a/xlators/nfs/server/src/nfs3.c +++ b/xlators/nfs/server/src/nfs3.c @@ -2241,24 +2241,6 @@ nfs3_write_resume (void *carg)          cs->fd = fd;    /* Gets unrefd when the call state is wiped. */ -/* -  enum stable_how { -  UNSTABLE = 0, -  DATA_SYNC = 1, -  FILE_SYNC = 2, -  }; -*/ -	switch (cs->writetype) { -	case UNSTABLE: -		break; -	case DATA_SYNC: -		fd->flags |= O_DSYNC; -		break; -	case FILE_SYNC: -		fd->flags |= O_SYNC; -		break; -	} -          ret = __nfs3_write_resume (cs);          if (ret < 0)                  stat = nfs3_errno_to_nfsstat3 (-ret); diff --git a/xlators/protocol/server/src/server-resolve.c b/xlators/protocol/server/src/server-resolve.c index 3257c6c701c..3e1411250b8 100644 --- a/xlators/protocol/server/src/server-resolve.c +++ b/xlators/protocol/server/src/server-resolve.c @@ -453,7 +453,7 @@ resolve_anonfd_simple (call_frame_t *frame)          ret = 0; -        state->fd = fd_anonymous (inode); +        state->fd = fd_anonymous_with_flags (inode, state->flags);  out:          if (inode)                  inode_unref (inode); diff --git a/xlators/storage/posix/src/posix-helpers.c b/xlators/storage/posix/src/posix-helpers.c index 7a5a241fbb1..d953db249a0 100644 --- a/xlators/storage/posix/src/posix-helpers.c +++ b/xlators/storage/posix/src/posix-helpers.c @@ -1686,6 +1686,7 @@ __posix_fd_ctx_get (fd_t *fd, xlator_t *this, struct posix_fd **pfd_p)          pfd->fd = _fd;          pfd->dir = dir; +        pfd->flags = fd->flags;          ret = __fd_ctx_set (fd, this, (uint64_t) (long) pfd);          if (ret != 0) {  | 
