From adb677be13e6b755c3eeb685759d2522f6c466a7 Mon Sep 17 00:00:00 2001 From: Shehjar Tikoo Date: Thu, 16 Apr 2009 23:53:24 -0700 Subject: libglusterfsclient: Replace dict-based fd ctx with array-based one Signed-off-by: Anand V. Avati --- libglusterfsclient/src/libglusterfsclient.c | 219 +++++++++++++--------------- 1 file changed, 105 insertions(+), 114 deletions(-) diff --git a/libglusterfsclient/src/libglusterfsclient.c b/libglusterfsclient/src/libglusterfsclient.c index bd8dd6a9a..8d337e7d2 100755 --- a/libglusterfsclient/src/libglusterfsclient.c +++ b/libglusterfsclient/src/libglusterfsclient.c @@ -96,17 +96,74 @@ libgf_client_forget (xlator_t *this, return 0; } +xlator_t * +libgf_fd_to_xlator (fd_t *fd) +{ + if (!fd) + return NULL; + + if (!fd->inode) + return NULL; + + if (!fd->inode->table) + return NULL; + + if (!fd->inode->table->xl) + return NULL; + + if (!fd->inode->table->xl->ctx) + return NULL; + + return fd->inode->table->xl->ctx->top; +} + +libglusterfs_client_fd_ctx_t * +libgf_get_fd_ctx (fd_t *fd) +{ + uint64_t ctxaddr = 0; + libglusterfs_client_fd_ctx_t *ctx = NULL; + + GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, fd, out); + + if (fd_ctx_get (fd, libgf_fd_to_xlator (fd) , &ctxaddr) == -1) + goto out; + + ctx = (libglusterfs_client_fd_ctx_t *)(long)ctxaddr; + +out: + return ctx; +} + +libglusterfs_client_fd_ctx_t * +libgf_alloc_fd_ctx (libglusterfs_client_ctx_t *ctx, fd_t *fd) +{ + libglusterfs_client_fd_ctx_t *fdctx = NULL; + uint64_t ctxaddr = 0; + + fdctx = CALLOC (1, sizeof (*fdctx)); + if (fdctx == NULL) { + gf_log (LIBGF_XL_NAME, GF_LOG_ERROR, + "memory allocation failure"); + fdctx = NULL; + goto out; + } + + pthread_mutex_init (&fdctx->lock, NULL); + fdctx->ctx = ctx; + ctxaddr = (uint64_t)fdctx; + + fd_ctx_set (fd, libgf_fd_to_xlator (fd), ctxaddr); + +out: + return fdctx; +} int32_t libgf_client_release (xlator_t *this, fd_t *fd) { libglusterfs_client_fd_ctx_t *fd_ctx = NULL; - data_t *fd_ctx_data = NULL; - - fd_ctx_data = dict_get (fd->ctx, LIBGF_XL_NAME); - - fd_ctx = data_to_ptr (fd_ctx_data); + fd_ctx = libgf_get_fd_ctx (fd); pthread_mutex_destroy (&fd_ctx->lock); return 0; @@ -118,11 +175,7 @@ libgf_client_releasedir (xlator_t *this, fd_t *fd) { libglusterfs_client_fd_ctx_t *fd_ctx = NULL; - data_t *fd_ctx_data = NULL; - - fd_ctx_data = dict_get (fd->ctx, LIBGF_XL_NAME); - - fd_ctx = data_to_ptr (fd_ctx_data); + fd_ctx = libgf_get_fd_ctx (fd); pthread_mutex_destroy (&fd_ctx->lock); return 0; @@ -527,6 +580,7 @@ glusterfs_init (glusterfs_init_params_t *init_ctx) return NULL; } graph = ctx->gf_ctx.graph; + ctx->gf_ctx.top = graph; trav = graph; while (trav) { @@ -1567,27 +1621,15 @@ op_over: } else { libglusterfs_client_fd_ctx_t *fd_ctx = NULL; libglusterfs_client_inode_ctx_t *inode_ctx = NULL; - data_t *ctx_data = NULL; - - ctx_data = dict_get (fd->ctx, LIBGF_XL_NAME); - if (!ctx_data) { - fd_ctx = CALLOC (1, sizeof (*fd_ctx)); - ERR_ABORT (fd_ctx); - pthread_mutex_init (&fd_ctx->lock, NULL); - } - - pthread_mutex_lock (&fd_ctx->lock); - { - fd_ctx->ctx = ctx; - } - pthread_mutex_unlock (&fd_ctx->lock); - if (!ctx_data) { - dict_set (fd->ctx, LIBGF_XL_NAME, - data_from_dynptr (fd_ctx, - sizeof (*fd_ctx))); + fd_ctx = libgf_get_fd_ctx (fd); + if (!fd_ctx) { + if (!libgf_alloc_fd_ctx (ctx, fd)) { + errno = EINVAL; + op_ret = -1; + goto out; + } } - if ((flags & O_TRUNC) && ((flags & O_RDWR) || (flags & O_WRONLY))) { uint64_t ptr = 0; @@ -1665,7 +1707,6 @@ int glusterfs_close (glusterfs_file_t fd) { int32_t op_ret = -1; - data_t *fd_ctx_data = NULL; libglusterfs_client_ctx_t *ctx = NULL; libglusterfs_client_fd_ctx_t *fd_ctx = NULL; @@ -1674,13 +1715,11 @@ glusterfs_close (glusterfs_file_t fd) goto out; } - fd_ctx_data = dict_get (((fd_t *) fd)->ctx, LIBGF_XL_NAME); - if (!fd_ctx_data) { + fd_ctx = libgf_get_fd_ctx (fd); + if (!fd_ctx) { errno = EBADF; - goto out; + goto out; } - - fd_ctx = data_to_ptr (fd_ctx_data); ctx = fd_ctx->ctx; op_ret = libgf_client_flush (ctx, (fd_t *)fd); @@ -1854,7 +1893,6 @@ glusterfs_fsetxattr (glusterfs_file_t fd, { int32_t op_ret = 0; fd_t *__fd = fd; - data_t *fd_ctx_data = NULL; libglusterfs_client_fd_ctx_t *fd_ctx = NULL; libglusterfs_client_ctx_t *ctx = NULL; @@ -1867,16 +1905,14 @@ glusterfs_fsetxattr (glusterfs_file_t fd, goto out; } - fd_ctx_data = dict_get (((fd_t *) fd)->ctx, LIBGF_XL_NAME); - if (!fd_ctx_data) { + fd_ctx = libgf_get_fd_ctx (fd); + if (!fd_ctx) { errno = EBADF; op_ret = -1; goto out; } - fd_ctx = data_to_ptr (fd_ctx_data); ctx = fd_ctx->ctx; - op_ret = libgf_client_fsetxattr (ctx, __fd, name, value, size, flags); @@ -1966,16 +2002,14 @@ glusterfs_fgetxattr (glusterfs_file_t fd, libglusterfs_client_ctx_t *ctx; fd_t *__fd = (fd_t *)fd; libglusterfs_client_fd_ctx_t *fd_ctx = NULL; - data_t *fd_ctx_data = NULL; - fd_ctx_data = dict_get (__fd->ctx, LIBGF_XL_NAME); - if (!fd_ctx_data) { + fd_ctx = libgf_get_fd_ctx (fd); + if (!fd_ctx) { errno = EBADF; op_ret = -1; goto out; } - fd_ctx = data_to_ptr (fd_ctx_data); ctx = fd_ctx->ctx; op_ret = libgf_client_fgetxattr (ctx, __fd, name, value, size); out: @@ -2096,21 +2130,18 @@ glusterfs_read (glusterfs_file_t fd, off_t offset = 0; libglusterfs_client_ctx_t *ctx = NULL; libglusterfs_client_fd_ctx_t *fd_ctx = NULL; - data_t *fd_ctx_data = NULL; if (fd == 0) { errno = EINVAL; goto out; } - fd_ctx_data = dict_get (((fd_t *) fd)->ctx, LIBGF_XL_NAME); - if (!fd_ctx_data) { + fd_ctx = libgf_get_fd_ctx (fd); + if (!fd_ctx) { errno = EBADF; goto out; } - fd_ctx = data_to_ptr (fd_ctx_data); - pthread_mutex_lock (&fd_ctx->lock); { ctx = fd_ctx->ctx; @@ -2207,21 +2238,18 @@ glusterfs_readv (glusterfs_file_t fd, const struct iovec *vec, int count) off_t offset = 0; libglusterfs_client_ctx_t *ctx = NULL; libglusterfs_client_fd_ctx_t *fd_ctx = NULL; - data_t *fd_ctx_data = NULL; if (!fd) { errno = EINVAL; goto out; } - fd_ctx_data = dict_get (((fd_t *) fd)->ctx, LIBGF_XL_NAME); - if (!fd_ctx_data) { + fd_ctx = libgf_get_fd_ctx (fd); + if (!fd_ctx) { errno = EBADF; goto out; } - fd_ctx = data_to_ptr (fd_ctx_data); - pthread_mutex_lock (&fd_ctx->lock); { ctx = fd_ctx->ctx; @@ -2254,21 +2282,18 @@ glusterfs_pread (glusterfs_file_t fd, int32_t op_ret = -1; libglusterfs_client_ctx_t *ctx = NULL; libglusterfs_client_fd_ctx_t *fd_ctx = NULL; - data_t *fd_ctx_data = NULL; if (!fd) { errno = EINVAL; goto out; } - fd_ctx_data = dict_get (((fd_t *) fd)->ctx, LIBGF_XL_NAME); - if (!fd_ctx_data) { + fd_ctx = libgf_get_fd_ctx (fd); + if (!fd_ctx) { errno = EBADF; goto out; } - fd_ctx = data_to_ptr (fd_ctx_data); - ctx = fd_ctx->ctx; op_ret = libgf_client_read (ctx, (fd_t *)fd, buf, count, offset); @@ -2330,21 +2355,18 @@ glusterfs_write (glusterfs_file_t fd, struct iovec vector; libglusterfs_client_ctx_t *ctx = NULL; libglusterfs_client_fd_ctx_t *fd_ctx = NULL; - data_t *fd_ctx_data = NULL; if (!fd) { errno = EINVAL; goto out; } - fd_ctx_data = dict_get (((fd_t *) fd)->ctx, LIBGF_XL_NAME); - if (!fd_ctx_data) { + fd_ctx = libgf_get_fd_ctx (fd); + if (!fd_ctx) { errno = EBADF; goto out; } - fd_ctx = data_to_ptr (fd_ctx_data); - ctx = fd_ctx->ctx; pthread_mutex_lock (&fd_ctx->lock); @@ -2384,22 +2406,18 @@ glusterfs_writev (glusterfs_file_t fd, off_t offset = 0; libglusterfs_client_ctx_t *ctx = NULL; libglusterfs_client_fd_ctx_t *fd_ctx = NULL; - data_t *fd_ctx_data = NULL; if (!fd) { errno = EINVAL; goto out; } - - fd_ctx_data = dict_get (((fd_t *) fd)->ctx, LIBGF_XL_NAME); - if (!fd_ctx_data) { + fd_ctx = libgf_get_fd_ctx (fd); + if (!fd_ctx) { errno = EBADF; goto out; } - fd_ctx = data_to_ptr (fd_ctx_data); - ctx = fd_ctx->ctx; pthread_mutex_lock (&fd_ctx->lock); @@ -2439,21 +2457,18 @@ glusterfs_pwrite (glusterfs_file_t fd, struct iovec vector; libglusterfs_client_ctx_t *ctx = NULL; libglusterfs_client_fd_ctx_t *fd_ctx = NULL; - data_t *fd_ctx_data = NULL; if (!fd) { errno = EINVAL; goto out; } - fd_ctx_data = dict_get (((fd_t *) fd)->ctx, LIBGF_XL_NAME); - if (!fd_ctx_data) { + fd_ctx = libgf_get_fd_ctx (fd); + if (!fd_ctx) { errno = EBADF; goto out; } - fd_ctx = data_to_ptr (fd_ctx_data); - ctx = fd_ctx->ctx; vector.iov_base = (void *)buf; @@ -2554,16 +2569,13 @@ glusterfs_readdir (glusterfs_dir_t fd, libglusterfs_client_ctx_t *ctx = NULL; off_t offset = 0; libglusterfs_client_fd_ctx_t *fd_ctx = NULL; - data_t *fd_ctx_data = NULL; - fd_ctx_data = dict_get (((fd_t *) fd)->ctx, LIBGF_XL_NAME); - if (!fd_ctx_data) { + fd_ctx = libgf_get_fd_ctx (fd); + if (!fd_ctx) { errno = EBADF; goto out; } - fd_ctx = data_to_ptr (fd_ctx_data); - pthread_mutex_lock (&fd_ctx->lock); { ctx = fd_ctx->ctx; @@ -2596,16 +2608,13 @@ glusterfs_getdents (glusterfs_file_t fd, struct dirent *dirp, libglusterfs_client_ctx_t *ctx = NULL; off_t offset = 0; libglusterfs_client_fd_ctx_t *fd_ctx = NULL; - data_t *fd_ctx_data = NULL; - fd_ctx_data = dict_get (((fd_t *) fd)->ctx, LIBGF_XL_NAME); - if (!fd_ctx_data) { + fd_ctx = libgf_get_fd_ctx (fd); + if (!fd_ctx) { errno = EBADF; goto out; } - fd_ctx = data_to_ptr (fd_ctx_data); - pthread_mutex_lock (&fd_ctx->lock); { ctx = fd_ctx->ctx; @@ -2660,11 +2669,7 @@ libglusterfs_readv_async_cbk (call_frame_t *frame, if (op_ret > 0) { libglusterfs_client_fd_ctx_t *fd_ctx = NULL; - data_t *fd_ctx_data = NULL; - - fd_ctx_data = dict_get (__fd->ctx, LIBGF_XL_NAME); - - fd_ctx = data_to_ptr (fd_ctx_data); + fd_ctx = libgf_get_fd_ctx (__fd); pthread_mutex_lock (&fd_ctx->lock); { fd_ctx->offset += op_ret; @@ -2704,7 +2709,6 @@ glusterfs_read_async (glusterfs_file_t fd, fd_t *__fd = (fd_t *)fd; libglusterfs_client_async_local_t *local = NULL; libglusterfs_client_fd_ctx_t *fd_ctx = NULL; - data_t *fd_ctx_data = NULL; int32_t op_ret = 0; local = CALLOC (1, sizeof (*local)); @@ -2713,15 +2717,13 @@ glusterfs_read_async (glusterfs_file_t fd, local->fop.readv_cbk.cbk = readv_cbk; local->cbk_data = cbk_data; - fd_ctx_data = dict_get (((fd_t *) fd)->ctx, LIBGF_XL_NAME); - if (!fd_ctx_data) { + fd_ctx = libgf_get_fd_ctx (fd); + if (!fd_ctx) { errno = EBADF; op_ret = -1; goto out; } - fd_ctx = data_to_ptr (fd_ctx_data); - ctx = fd_ctx->ctx; if (offset < 0) { @@ -2761,12 +2763,7 @@ libglusterfs_writev_async_cbk (call_frame_t *frame, if (op_ret > 0) { libglusterfs_client_fd_ctx_t *fd_ctx = NULL; - data_t *fd_ctx_data = NULL; - - fd_ctx_data = dict_get (fd->ctx, LIBGF_XL_NAME); - - fd_ctx = data_to_ptr (fd_ctx_data); - + fd_ctx = libgf_get_fd_ctx (fd); pthread_mutex_lock (&fd_ctx->lock); { fd_ctx->offset += op_ret; @@ -2794,7 +2791,6 @@ glusterfs_write_async (glusterfs_file_t fd, libglusterfs_client_ctx_t *ctx = NULL; libglusterfs_client_async_local_t *local = NULL; libglusterfs_client_fd_ctx_t *fd_ctx = NULL; - data_t *fd_ctx_data = NULL; int32_t op_ret = 0; struct iobref *iobref = NULL; @@ -2807,14 +2803,13 @@ glusterfs_write_async (glusterfs_file_t fd, vector.iov_base = (void *)buf; vector.iov_len = nbytes; - fd_ctx_data = dict_get (__fd->ctx, LIBGF_XL_NAME); - if (!fd_ctx_data) { + fd_ctx = libgf_get_fd_ctx (fd); + if (!fd_ctx) { errno = EBADF; op_ret = -1; goto out; } - fd_ctx = data_to_ptr (fd_ctx_data); ctx = fd_ctx->ctx; if (offset < 0) { @@ -2847,20 +2842,18 @@ glusterfs_lseek (glusterfs_file_t fd, off_t offset, int whence) off_t __offset = 0; int32_t op_ret = -1; fd_t *__fd = (fd_t *)fd; - data_t *fd_ctx_data = NULL; libglusterfs_client_fd_ctx_t *fd_ctx = NULL; libglusterfs_client_inode_ctx_t *inode_ctx = NULL; libglusterfs_client_ctx_t *ctx = NULL; xlator_t *this = NULL; - fd_ctx_data = dict_get (__fd->ctx, LIBGF_XL_NAME); - if (!fd_ctx_data) { - errno = EBADFD; + fd_ctx = libgf_get_fd_ctx (fd); + if (!fd_ctx) { + errno = EBADF; __offset = -1; goto out; } - fd_ctx = data_to_ptr (fd_ctx_data); ctx = fd_ctx->ctx; switch (whence) @@ -3173,17 +3166,15 @@ glusterfs_fstat (glusterfs_file_t fd, struct stat *buf) libglusterfs_client_ctx_t *ctx; fd_t *__fd = (fd_t *)fd; libglusterfs_client_fd_ctx_t *fd_ctx = NULL; - data_t *fd_ctx_data = NULL; int32_t op_ret = -1; - fd_ctx_data = dict_get (((fd_t *) fd)->ctx, LIBGF_XL_NAME); - if (!fd_ctx_data) { + fd_ctx = libgf_get_fd_ctx (fd); + if (!fd_ctx) { errno = EBADF; op_ret = -1; goto out; } - fd_ctx = data_to_ptr (fd_ctx_data); ctx = fd_ctx->ctx; op_ret = libgf_client_fstat (ctx, __fd, buf); -- cgit