c211c8d97e
Resolves: bz#1466129 bz#1475779 bz#1523216 bz#1535281 bz#1546941 Resolves: bz#1550315 bz#1550991 bz#1553677 bz#1554291 bz#1559452 Resolves: bz#1560955 bz#1562744 bz#1563692 bz#1565962 bz#1567110 Resolves: bz#1569457 Signed-off-by: Milind Changire <mchangir@redhat.com>
94 lines
3.7 KiB
Diff
94 lines
3.7 KiB
Diff
From 80efc701cb29684355cd133fbf29c14948772ba1 Mon Sep 17 00:00:00 2001
|
|
From: Susant Palai <spalai@redhat.com>
|
|
Date: Wed, 11 Apr 2018 23:14:02 +0530
|
|
Subject: [PATCH 229/236] fuse: do fd_resolve in fuse_getattr if fd is received
|
|
|
|
problem: With the current code, post graph switch the old fd is received for
|
|
fuse_getattr and since it is associated with old inode, it does not
|
|
have the inode ctx across xlators in new graph. Hence, dht
|
|
errored out saying "no layout" for fstat call. Hence the EINVAL.
|
|
|
|
Solution: if fd is passed, init and resolve fd to carry on getattr
|
|
|
|
test case:
|
|
- Created a single brick distributed volume
|
|
- Started untar
|
|
- Added a new-brick
|
|
|
|
Without this fix, untar used to abort with ERROR.
|
|
|
|
upstream patch: https://review.gluster.org/#/c/19849/
|
|
|
|
> Change-Id: I5805c463fb9a04ba5c24829b768127097ff8b9f9
|
|
> fixes: bz#1566207
|
|
> Signed-off-by: Susant Palai <spalai@redhat.com>
|
|
> (cherry picked from commit 87bcdd9465b140e0b9d33dadf3384e28b7b6ed9f)
|
|
|
|
Change-Id: I5805c463fb9a04ba5c24829b768127097ff8b9f9
|
|
BUG: 1563692
|
|
Signed-off-by: Susant Palai <spalai@redhat.com>
|
|
Reviewed-on: https://code.engineering.redhat.com/gerrit/136232
|
|
Tested-by: RHGS Build Bot <nigelb@redhat.com>
|
|
Reviewed-by: Sunil Kumar Heggodu Gopala Acharya <sheggodu@redhat.com>
|
|
---
|
|
xlators/cluster/dht/src/dht-inode-read.c | 4 ++--
|
|
xlators/mount/fuse/src/fuse-bridge.c | 13 ++++++++-----
|
|
2 files changed, 10 insertions(+), 7 deletions(-)
|
|
|
|
diff --git a/xlators/cluster/dht/src/dht-inode-read.c b/xlators/cluster/dht/src/dht-inode-read.c
|
|
index fa63fef..d1895eb 100644
|
|
--- a/xlators/cluster/dht/src/dht-inode-read.c
|
|
+++ b/xlators/cluster/dht/src/dht-inode-read.c
|
|
@@ -400,8 +400,8 @@ dht_fstat (call_frame_t *frame, xlator_t *this, fd_t *fd, dict_t *xdata)
|
|
|
|
layout = local->layout;
|
|
if (!layout) {
|
|
- gf_msg_debug (this->name, 0,
|
|
- "no layout for fd=%p", fd);
|
|
+ gf_msg (this->name, GF_LOG_ERROR, 0, 0,
|
|
+ "no layout for fd=%p", fd);
|
|
op_errno = EINVAL;
|
|
goto err;
|
|
}
|
|
diff --git a/xlators/mount/fuse/src/fuse-bridge.c b/xlators/mount/fuse/src/fuse-bridge.c
|
|
index 3e31eca..44697d2 100644
|
|
--- a/xlators/mount/fuse/src/fuse-bridge.c
|
|
+++ b/xlators/mount/fuse/src/fuse-bridge.c
|
|
@@ -893,7 +893,7 @@ fuse_root_lookup_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
|
|
void
|
|
fuse_getattr_resume (fuse_state_t *state)
|
|
{
|
|
- if (!state->loc.inode) {
|
|
+ if (!state->loc.inode && !(state->fd && state->fd->inode)) {
|
|
gf_log ("glusterfs-fuse", GF_LOG_ERROR,
|
|
"%"PRIu64": GETATTR %"PRIu64" (%s) resolution failed",
|
|
state->finh->unique, state->finh->nodeid,
|
|
@@ -904,9 +904,9 @@ fuse_getattr_resume (fuse_state_t *state)
|
|
return;
|
|
}
|
|
|
|
- if (!IA_ISDIR (state->loc.inode->ia_type)) {
|
|
- if (state->fd == NULL)
|
|
- state->fd = fd_lookup (state->loc.inode, state->finh->pid);
|
|
+ if (state->fd == NULL && !IA_ISDIR (state->loc.inode->ia_type)) {
|
|
+ state->fd = fd_lookup (state->loc.inode, state->finh->pid);
|
|
+
|
|
if (state->fd == NULL)
|
|
state->fd = fd_lookup (state->loc.inode, 0);
|
|
}
|
|
@@ -947,7 +947,10 @@ fuse_getattr (xlator_t *this, fuse_in_header_t *finh, void *msg)
|
|
state->fd = fd_ref ((fd_t *)fgi->fh);
|
|
#endif
|
|
|
|
- fuse_resolve_inode_init (state, &state->resolve, state->finh->nodeid);
|
|
+ if (state->fd)
|
|
+ fuse_resolve_fd_init (state, &state->resolve, state->fd);
|
|
+ else
|
|
+ fuse_resolve_inode_init (state, &state->resolve, state->finh->nodeid);
|
|
|
|
fuse_resolve_and_resume (state, fuse_getattr_resume);
|
|
}
|
|
--
|
|
1.8.3.1
|
|
|