diff options
-rwxr-xr-x | libglusterfsclient/src/libglusterfsclient.c | 44 |
1 files changed, 19 insertions, 25 deletions
diff --git a/libglusterfsclient/src/libglusterfsclient.c b/libglusterfsclient/src/libglusterfsclient.c index 29ef163dfd2..095edaa7cf7 100755 --- a/libglusterfsclient/src/libglusterfsclient.c +++ b/libglusterfsclient/src/libglusterfsclient.c @@ -3294,19 +3294,29 @@ libgf_client_readdir (libglusterfs_client_ctx_t *ctx, op_ret = stub->args.readdir_cbk.op_ret; errno = stub->args.readdir_cbk.op_errno; + /* Someday we'll support caching the multiple entries returned + * from the server, till then, the logic below only extracts + * one entry depending on the previous offset given above. + */ if (op_ret > 0) { list_for_each_entry (entry, &stub->args.readdir_cbk.entries.list, list) { entry_size = offsetof (struct dirent, d_name) + strlen (entry->d_name) + 1; - - if ((size < entry_size) || (count == num_entries)) { - if (*offset == entry->d_off) - count--; - else - break; - } + + /* If the offset requested matches the offset of the current + * entry, it means that we need to search + * further for entry with the required offset. + */ + if (*offset == entry->d_off) + continue; + + /* If we cannot fit more data into the given buffer, or + * if we've extracted the requested number of entries, well, + * break. */ + if ((size < entry_size) || (count == num_entries)) + break; size -= entry_size; @@ -3326,24 +3336,8 @@ libgf_client_readdir (libglusterfs_client_ctx_t *ctx, dirp->d_name[dirp->d_reclen] = '\0'; dirp = (struct dirent *) (((char *) dirp) + entry_size); - /* 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. - * - * FIXME2: This offset value check is somewhat - * better than not having any support for - * multiple entry extraction. Suppose we're - * reading a large directory. - */ - if (*offset == entry->d_off) - continue; - else { - *offset = dirp->d_off = entry->d_off; - break; - } - - break; + *offset = entry->d_off; + count++; } } |