From 7eb61fb44986fc834a19d9f38754f1be54d07e09 Mon Sep 17 00:00:00 2001 From: Shehjar Tikoo Date: Tue, 5 May 2009 15:59:03 +0530 Subject: libglusterfsclient: Conform'ify glusterfs_readdir This commit does two things: 1. Changes glusterfs_readdir prototype to conform to the POSIX readdir(). 2. Uses a 1024-byte value instead of sizeof(struct dirent) for the @size for libgf_client_readdir. This allows even larger names to fit into a single readdir request to the server. Signed-off-by: Anand V. Avati --- libglusterfsclient/src/libglusterfsclient.c | 42 ++++++++++++++++++----------- libglusterfsclient/src/libglusterfsclient.h | 11 +++----- 2 files changed, 31 insertions(+), 22 deletions(-) (limited to 'libglusterfsclient') diff --git a/libglusterfsclient/src/libglusterfsclient.c b/libglusterfsclient/src/libglusterfsclient.c index e3447498..6639356a 100755 --- a/libglusterfsclient/src/libglusterfsclient.c +++ b/libglusterfsclient/src/libglusterfsclient.c @@ -49,6 +49,7 @@ #define LIBGF_XL_NAME "libglusterfsclient" #define LIBGLUSTERFS_INODE_TABLE_LRU_LIMIT 1000 //14057 +#define LIBGF_READDIR_BLOCK 1024 static inline xlator_t * libglusterfs_graph (xlator_t *graph); @@ -3212,6 +3213,12 @@ libgf_client_readdir (libglusterfs_client_ctx_t *ctx, dirp = (struct dirent *) (((char *) dirp) + entry_size); count++; + /* FIXME: Someday, we'll enable processing + * more than one dirent. The reason we should + * break here is that the offset must not be + * updated beyond one entry. + */ + break; } } @@ -3219,17 +3226,18 @@ libgf_client_readdir (libglusterfs_client_ctx_t *ctx, return op_ret; } -int -glusterfs_readdir (glusterfs_dir_t fd, - struct dirent *dirp, - unsigned int count) +static struct dirent __libgf_dirent; + +struct dirent * +glusterfs_readdir (glusterfs_dir_t dirfd) { int op_ret = -1; libglusterfs_client_ctx_t *ctx = NULL; off_t offset = 0; libglusterfs_client_fd_ctx_t *fd_ctx = NULL; + struct dirent *dirp = NULL; - fd_ctx = libgf_get_fd_ctx (fd); + fd_ctx = libgf_get_fd_ctx (dirfd); if (!fd_ctx) { errno = EBADF; goto out; @@ -3242,20 +3250,24 @@ glusterfs_readdir (glusterfs_dir_t fd, } pthread_mutex_unlock (&fd_ctx->lock); - op_ret = libgf_client_readdir (ctx, (fd_t *)fd, dirp, sizeof (*dirp), - &offset, 1); + dirp = &__libgf_dirent; + memset (dirp, 0, sizeof (struct dirent)); + op_ret = libgf_client_readdir (ctx, (fd_t *)dirfd, dirp, + LIBGF_READDIR_BLOCK, &offset, 1); - if (op_ret > 0) { - pthread_mutex_lock (&fd_ctx->lock); - { - fd_ctx->offset = offset; - } - pthread_mutex_unlock (&fd_ctx->lock); - op_ret = 1; + if (op_ret <= 0) { + dirp = NULL; + goto out; } + pthread_mutex_lock (&fd_ctx->lock); + { + fd_ctx->offset = offset; + } + pthread_mutex_unlock (&fd_ctx->lock); + out: - return op_ret; + return dirp; } diff --git a/libglusterfsclient/src/libglusterfsclient.h b/libglusterfsclient/src/libglusterfsclient.h index ae0d86a0..1c2441b2 100755 --- a/libglusterfsclient/src/libglusterfsclient.h +++ b/libglusterfsclient/src/libglusterfsclient.h @@ -607,15 +607,12 @@ glusterfs_rmdir (const char *path); * * @fd : The handle of the directory to be read. This handle * is the one returned by opendir. - * @dirp : The pointer to the array of directory entries into - * which the directory data will be stored. - * @count : Number of directory entries to be read. * - * Returns 0 on success and -1 on error with errno set appropriately. + * Returns the directory entry on success and NULL pointer on error + * with errno set appropriately. */ -int -glusterfs_readdir (glusterfs_dir_t fd, struct dirent *dirp, - unsigned int count); +struct dirent * +glusterfs_readdir (glusterfs_dir_t dirfd); -- cgit