diff options
Diffstat (limited to 'api')
-rw-r--r-- | api/src/glfs-fops.c | 31 | ||||
-rw-r--r-- | api/src/glfs.h | 3 |
2 files changed, 26 insertions, 8 deletions
diff --git a/api/src/glfs-fops.c b/api/src/glfs-fops.c index 74d0daf99ae..3ce930f2745 100644 --- a/api/src/glfs-fops.c +++ b/api/src/glfs-fops.c @@ -1421,7 +1421,7 @@ gf_dirent_to_dirent (gf_dirent_t *gf_dirent, struct dirent *dirent) int -glfd_entry_refresh (struct glfs_fd *glfd) +glfd_entry_refresh (struct glfs_fd *glfd, int plus) { xlator_t *subvol = NULL; gf_dirent_t entries; @@ -1437,8 +1437,12 @@ glfd_entry_refresh (struct glfs_fd *glfd) INIT_LIST_HEAD (&entries.list); INIT_LIST_HEAD (&old.list); - ret = syncop_readdir (subvol, glfd->fd, 131072, glfd->offset, - &entries); + if (plus) + ret = syncop_readdirp (subvol, glfd->fd, 131072, glfd->offset, + NULL, &entries); + else + ret = syncop_readdir (subvol, glfd->fd, 131072, glfd->offset, + &entries); if (ret >= 0) { /* spurious errno is dangerous for glfd_entry_next() */ errno = 0; @@ -1457,13 +1461,13 @@ glfd_entry_refresh (struct glfs_fd *glfd) gf_dirent_t * -glfd_entry_next (struct glfs_fd *glfd) +glfd_entry_next (struct glfs_fd *glfd, int plus) { gf_dirent_t *entry = NULL; int ret = -1; if (!glfd->offset || !glfd->next) { - ret = glfd_entry_refresh (glfd); + ret = glfd_entry_refresh (glfd, plus); if (ret < 0) return NULL; } @@ -1484,7 +1488,8 @@ glfd_entry_next (struct glfs_fd *glfd) int -glfs_readdir_r (struct glfs_fd *glfd, struct dirent *buf, struct dirent **res) +glfs_readdirplus_r (struct glfs_fd *glfd, struct stat *stat, struct dirent *buf, + struct dirent **res) { int ret = 0; gf_dirent_t *entry = NULL; @@ -1498,7 +1503,7 @@ glfs_readdir_r (struct glfs_fd *glfd, struct dirent *buf, struct dirent **res) } errno = 0; - entry = glfd_entry_next (glfd); + entry = glfd_entry_next (glfd, !!stat); if (errno) ret = -1; @@ -1509,14 +1514,24 @@ glfs_readdir_r (struct glfs_fd *glfd, struct dirent *buf, struct dirent **res) *res = NULL; } - if (entry) + if (entry) { gf_dirent_to_dirent (entry, buf); + if (stat) + iatt_to_stat (&entry->d_stat, stat); + } out: return ret; } int +glfs_readdir_r (struct glfs_fd *glfd, struct dirent *buf, struct dirent **res) +{ + return glfs_readdirplus_r (glfd, 0, buf, res); +} + + +int glfs_statvfs (struct glfs *fs, const char *path, struct statvfs *buf) { int ret = -1; diff --git a/api/src/glfs.h b/api/src/glfs.h index 7ff31dd62e3..06849d0c731 100644 --- a/api/src/glfs.h +++ b/api/src/glfs.h @@ -387,6 +387,9 @@ glfs_fd_t *glfs_opendir (glfs_t *fs, const char *path); int glfs_readdir_r (glfs_fd_t *fd, struct dirent *dirent, struct dirent **result); +int glfs_readdirplus_r (glfs_fd_t *fd, struct stat *stat, struct dirent *dirent, + struct dirent **result); + long glfs_telldir (glfs_fd_t *fd); void glfs_seekdir (glfs_fd_t *fd, long offset); |