libglusterfsclient: Bind fd on fd creation code paths
When an fd_t is fd_create'd, we need to call fd_bind on it to ensure that any fd_lookup on the inode gets us this fd. We're not doing this so translators like write-behind were not able to order path-based requests at all resulting in some fops like stat, which could be issued after a writev, overtaking a previous writev which is still being written-behind. Signed-off-by: Anand V. Avati <avati@dev.gluster.com> BUG: 179 (fileop reports miscompares on read tests) URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=179
This commit is contained in:
parent
2f8a834e7b
commit
b63f69cdf4
@ -49,6 +49,7 @@ typedef struct libglusterfs_client_ctx {
|
||||
* accessed through this context.
|
||||
*/
|
||||
dev_t fake_fsid;
|
||||
pid_t pid;
|
||||
}libglusterfs_client_ctx_t;
|
||||
|
||||
typedef struct signal_handler {
|
||||
|
@ -921,7 +921,7 @@ get_call_frame_for_req (libglusterfs_client_ctx_t *ctx, char d)
|
||||
|
||||
frame->root->uid = geteuid ();
|
||||
frame->root->gid = getegid ();
|
||||
frame->root->pid = getpid ();
|
||||
frame->root->pid = ctx->pid;
|
||||
frame->root->unique = ctx->counter++;
|
||||
|
||||
return frame;
|
||||
@ -998,6 +998,7 @@ glusterfs_init (glusterfs_init_params_t *init_ctx, uint32_t fakefsid)
|
||||
ctx->lookup_timeout = init_ctx->lookup_timeout;
|
||||
ctx->stat_timeout = init_ctx->stat_timeout;
|
||||
ctx->fake_fsid = fakefsid;
|
||||
ctx->pid = getpid ();
|
||||
pthread_mutex_init (&ctx->gf_ctx.lock, NULL);
|
||||
|
||||
pool = ctx->gf_ctx.pool = CALLOC (1, sizeof (call_pool_t));
|
||||
@ -2393,6 +2394,8 @@ libgf_client_open (libglusterfs_client_ctx_t *ctx,
|
||||
op_ret = stub->args.open_cbk.op_ret;
|
||||
errno = stub->args.open_cbk.op_errno;
|
||||
|
||||
if (op_ret != -1)
|
||||
fd_bind (fd);
|
||||
call_stub_destroy (stub);
|
||||
return op_ret;
|
||||
}
|
||||
@ -2486,6 +2489,8 @@ libgf_client_opendir (libglusterfs_client_ctx_t *ctx,
|
||||
|
||||
op_ret = stub->args.opendir_cbk.op_ret;
|
||||
errno = stub->args.opendir_cbk.op_errno;
|
||||
if (op_ret != -1)
|
||||
fd_bind (fd);
|
||||
|
||||
call_stub_destroy (stub);
|
||||
out:
|
||||
@ -2556,7 +2561,7 @@ glusterfs_glh_open (glusterfs_handle_t handle, const char *path, int flags,...)
|
||||
goto out;
|
||||
}
|
||||
|
||||
fd = fd_create (loc.inode, 0);
|
||||
fd = fd_create (loc.inode, ctx->pid);
|
||||
fd->flags = flags;
|
||||
|
||||
if ((flags & O_CREAT) == O_CREAT) {
|
||||
@ -5056,7 +5061,7 @@ glusterfs_glh_opendir (glusterfs_handle_t handle, const char *path)
|
||||
goto out;
|
||||
}
|
||||
|
||||
dirfd = fd_create (loc.inode, 0);
|
||||
dirfd = fd_create (loc.inode, ctx->pid);
|
||||
op_ret = libgf_client_opendir (ctx, &loc, dirfd);
|
||||
|
||||
if (op_ret == -1) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user