diff options
| -rw-r--r-- | libglusterfs/src/fd.c | 41 | ||||
| -rw-r--r-- | libglusterfs/src/fd.h | 4 | ||||
| -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 | 
8 files changed, 66 insertions, 30 deletions
diff --git a/libglusterfs/src/fd.c b/libglusterfs/src/fd.c index 7d9a0cc1c5e..89ba357fc1e 100644 --- a/libglusterfs/src/fd.c +++ b/libglusterfs/src/fd.c @@ -749,7 +749,7 @@ fd_lookup_uint64 (inode_t *inode, uint64_t pid)  }  static fd_t * -__fd_lookup_anonymous (inode_t *inode) +__fd_lookup_anonymous (inode_t *inode, int32_t flags)  {          fd_t *iter_fd = NULL;          fd_t *fd = NULL; @@ -758,7 +758,7 @@ __fd_lookup_anonymous (inode_t *inode)                  return NULL;          list_for_each_entry (iter_fd, &inode->fd_list, inode_list) { -                if (iter_fd->anonymous) { +                if ((iter_fd->anonymous) && (flags == iter_fd->flags)) {                          fd = __fd_ref (iter_fd);                          break;                  } @@ -768,11 +768,11 @@ __fd_lookup_anonymous (inode_t *inode)  }  static fd_t * -__fd_anonymous (inode_t *inode) +__fd_anonymous (inode_t *inode, int32_t flags)  {          fd_t *fd = NULL; -        fd = __fd_lookup_anonymous (inode); +        fd = __fd_lookup_anonymous (inode, flags);          /* if (fd); then we already have increased the refcount in             __fd_lookup_anonymous(), so no need of one more fd_ref(). @@ -785,7 +785,7 @@ __fd_anonymous (inode_t *inode)                          return NULL;                  fd->anonymous = _gf_true; -                fd->flags = GF_ANON_FD_FLAGS; +                fd->flags = GF_ANON_FD_FLAGS|flags;                  __fd_bind (fd); @@ -803,7 +803,32 @@ fd_anonymous (inode_t *inode)          LOCK (&inode->lock);          { -                fd = __fd_anonymous (inode); +                fd = __fd_anonymous (inode, GF_ANON_FD_FLAGS); +        } +        UNLOCK (&inode->lock); + +        return fd; +} + +fd_t * +fd_anonymous_with_flags (inode_t *inode, int32_t flags) +{ +        fd_t *fd = NULL; + +        LOCK (&inode->lock); +        { +                if (flags == 0) +                        flags = GF_ANON_FD_FLAGS; +                /* If this API is ever called with O_SYNC or O_DSYNC in @flags, +                 * reset the bits associated with these flags before calling +                 * __fd_anonymous(). That way, posix will do the open() without +                 * these flags. And subsequently, posix_writev() (mostly) will +                 * do the write within inode->lock on an fd without O_SYNC or +                 * O_DSYNC and in its place to an fsync() outside of the locks +                 * to simulate the effect of using these flags. +                 */ +                flags &= (~(O_SYNC|O_DSYNC)); +                fd = __fd_anonymous (inode, flags);          }          UNLOCK (&inode->lock); @@ -811,7 +836,7 @@ fd_anonymous (inode_t *inode)  }  fd_t* -fd_lookup_anonymous (inode_t *inode) +fd_lookup_anonymous (inode_t *inode, int32_t flags)  {          fd_t *fd = NULL; @@ -823,7 +848,7 @@ fd_lookup_anonymous (inode_t *inode)          LOCK (&inode->lock);          { -                fd = __fd_lookup_anonymous (inode); +                fd = __fd_lookup_anonymous (inode, flags);          }          UNLOCK (&inode->lock);          return fd; diff --git a/libglusterfs/src/fd.h b/libglusterfs/src/fd.h index f4a8c444198..45c9303084f 100644 --- a/libglusterfs/src/fd.h +++ b/libglusterfs/src/fd.h @@ -138,11 +138,13 @@ fd_t *  fd_lookup_uint64 (struct _inode *inode, uint64_t pid);  fd_t* -fd_lookup_anonymous (inode_t *inode); +fd_lookup_anonymous (inode_t *inode, int32_t flags);  fd_t *  fd_anonymous (inode_t *inode); +fd_t * +fd_anonymous_with_flags (inode_t *inode, int32_t flags);  gf_boolean_t  fd_is_anonymous (fd_t *fd); diff --git a/xlators/cluster/afr/src/afr-transaction.c b/xlators/cluster/afr/src/afr-transaction.c index ea1f38652d1..a20be30d3ca 100644 --- a/xlators/cluster/afr/src/afr-transaction.c +++ b/xlators/cluster/afr/src/afr-transaction.c @@ -2095,7 +2095,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 d3e8ba330f4..c82fd0a31f1 100644 --- a/xlators/features/shard/src/shard.c +++ b/xlators/features/shard/src/shard.c @@ -3635,6 +3635,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; @@ -3665,6 +3666,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, @@ -3722,6 +3726,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 e5990a1e834..167f6b7e9f7 100644 --- a/xlators/nfs/server/src/nfs-fops.c +++ b/xlators/nfs/server/src/nfs-fops.c @@ -1386,6 +1386,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; @@ -1403,8 +1405,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 4035491359f..aa7af312b89 100644 --- a/xlators/nfs/server/src/nfs3.c +++ b/xlators/nfs/server/src/nfs3.c @@ -2245,24 +2245,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 26bf37e3308..4e6ec6a852a 100644 --- a/xlators/protocol/server/src/server-resolve.c +++ b/xlators/protocol/server/src/server-resolve.c @@ -458,7 +458,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 aaa9ac1ee29..731547b84dc 100644 --- a/xlators/storage/posix/src/posix-helpers.c +++ b/xlators/storage/posix/src/posix-helpers.c @@ -1690,6 +1690,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) {  | 
