diff options
| author | Krutika Dhananjay <kdhananj@redhat.com> | 2016-05-02 16:51:10 +0530 | 
|---|---|---|
| committer | Jeff Darcy <jdarcy@redhat.com> | 2016-06-16 09:04:10 -0700 | 
| commit | 9af36b95976d4e54859c9b60bd2e711518b3be6e (patch) | |
| tree | 98b4c7fa8b0c96cfabce8d59b1df34e64f9d6a44 /xlators | |
| parent | 650459c4178eff6fba82351d044c995ab7d046b1 (diff) | |
core, shard: Make shards inherit main file's O_DIRECT flag if present
        Backport of: http://review.gluster.org/14191
If the application opens a file with O_DIRECT, the shards'
anon fds would also need to inherit the flag. Towards this,
shard xl would be passing the odirect flag in the @flags parameter
to the WRITEV fop. This will be used in anon fd resolution
and subsequent opening by posix xl.
Change-Id: I3a0593fa46cc25e390a5762a0354b469c2a1532d
BUG: 1342903
Signed-off-by: Krutika Dhananjay <kdhananj@redhat.com>
Reviewed-on: http://review.gluster.org/14663
Smoke: Gluster Build System <jenkins@build.gluster.org>
CentOS-regression: Gluster Build System <jenkins@build.gluster.org>
NetBSD-regression: NetBSD Build System <jenkins@build.gluster.org>
Reviewed-by: Jeff Darcy <jdarcy@redhat.com>
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 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) {  | 
