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:
Shehjar Tikoo 2009-07-31 12:38:36 +00:00 committed by Anand V. Avati
parent 2f8a834e7b
commit b63f69cdf4
2 changed files with 9 additions and 3 deletions

View File

@ -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 {

View File

@ -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) {