From d5624b2d4baf509ad8d6037a0d9cabf9cd5ab1c5 Mon Sep 17 00:00:00 2001 From: Pranith Kumar K Date: Wed, 25 Feb 2015 11:37:57 +0530 Subject: libglusterfs: Moved common functions as utils in syncop/common-utils These will be used by both afr and ec. Moved syncop_dirfd, syncop_ftw, syncop_dir_scan functions also into syncop-utils.c Change-Id: I467253c74a346e1e292d36a8c1a035775c3aa670 BUG: 1177601 Signed-off-by: Pranith Kumar K Reviewed-on: http://review.gluster.org/9740 Reviewed-by: Krutika Dhananjay Reviewed-by: Anuradha Talur Reviewed-by: Ravishankar N Tested-by: Gluster Build System Reviewed-by: Vijay Bellur --- libglusterfs/src/syncop.c | 166 ---------------------------------------------- 1 file changed, 166 deletions(-) (limited to 'libglusterfs/src/syncop.c') diff --git a/libglusterfs/src/syncop.c b/libglusterfs/src/syncop.c index f571a2ae8bd..a4250330dfd 100644 --- a/libglusterfs/src/syncop.c +++ b/libglusterfs/src/syncop.c @@ -2422,169 +2422,3 @@ syncop_inodelk (xlator_t *subvol, const char *volume, loc_t *loc, int32_t cmd, return args.op_ret; } - -int -syncop_dirfd (xlator_t *subvol, loc_t *loc, fd_t **fd, int pid) -{ - int ret = 0; - fd_t *dirfd = NULL; - - if (!fd) - return -EINVAL; - - dirfd = fd_create (loc->inode, pid); - if (!dirfd) { - gf_log (subvol->name, GF_LOG_ERROR, - "fd_create of %s failed: %s", - uuid_utoa (loc->gfid), strerror(errno)); - ret = -errno; - goto out; - } - - ret = syncop_opendir (subvol, loc, dirfd); - if (ret) { - /* - * On Linux, if the brick was not updated, opendir will - * fail. We therefore use backward compatible code - * that violate the standards by reusing offsets - * in seekdir() from different DIR *, but it works on Linux. - * - * On other systems it never worked, hence we do not need - * to provide backward-compatibility. - */ -#ifdef GF_LINUX_HOST_OS - fd_unref (dirfd); - dirfd = fd_anonymous (loc->inode); - if (!dirfd) { - gf_log(subvol->name, GF_LOG_ERROR, - "fd_anonymous of %s failed: %s", - uuid_utoa (loc->gfid), strerror(errno)); - ret = -errno; - goto out; - } - ret = 0; -#else /* GF_LINUX_HOST_OS */ - fd_unref (dirfd); - gf_log (subvol->name, GF_LOG_ERROR, - "opendir of %s failed: %s", - uuid_utoa (loc->gfid), strerror(errno)); - goto out; -#endif /* GF_LINUX_HOST_OS */ - } -out: - if (ret == 0) - *fd = dirfd; - return ret; -} - -int -syncop_ftw (xlator_t *subvol, loc_t *loc, int pid, void *data, - int (*fn) (xlator_t *subvol, gf_dirent_t *entry, loc_t *parent, - void *data)) -{ - loc_t child_loc = {0, }; - fd_t *fd = NULL; - uint64_t offset = 0; - gf_dirent_t *entry = NULL; - int ret = 0; - gf_dirent_t entries; - - ret = syncop_dirfd (subvol, loc, &fd, pid); - if (ret) - goto out; - - INIT_LIST_HEAD (&entries.list); - - while ((ret = syncop_readdirp (subvol, fd, 131072, offset, 0, - &entries))) { - if (ret < 0) - break; - - if (ret > 0) { - /* If the entries are only '.', and '..' then ret - * value will be non-zero. so set it to zero here. */ - ret = 0; - } - list_for_each_entry (entry, &entries.list, list) { - offset = entry->d_off; - - if (!strcmp (entry->d_name, ".") || - !strcmp (entry->d_name, "..")) - continue; - - gf_link_inode_from_dirent (NULL, fd->inode, entry); - - ret = fn (subvol, entry, loc, data); - if (ret) - break; - - if (entry->d_stat.ia_type == IA_IFDIR) { - child_loc.inode = inode_ref (entry->inode); - uuid_copy (child_loc.gfid, entry->inode->gfid); - ret = syncop_ftw (subvol, &child_loc, - pid, data, fn); - loc_wipe (&child_loc); - if (ret) - break; - } - } - - gf_dirent_free (&entries); - if (ret) - break; - } - -out: - if (fd) - fd_unref (fd); - return ret; -} - -int -syncop_dir_scan (xlator_t *subvol, loc_t *loc, int pid, void *data, - int (*fn) (xlator_t *subvol, gf_dirent_t *entry, loc_t *parent, - void *data)) -{ - fd_t *fd = NULL; - uint64_t offset = 0; - gf_dirent_t *entry = NULL; - int ret = 0; - gf_dirent_t entries; - - ret = syncop_dirfd (subvol, loc, &fd, pid); - if (ret) - goto out; - - INIT_LIST_HEAD (&entries.list); - - while ((ret = syncop_readdir (subvol, fd, 131072, offset, &entries))) { - if (ret < 0) - break; - - if (ret > 0) { - /* If the entries are only '.', and '..' then ret - * value will be non-zero. so set it to zero here. */ - ret = 0; - } - - list_for_each_entry (entry, &entries.list, list) { - offset = entry->d_off; - - if (!strcmp (entry->d_name, ".") || - !strcmp (entry->d_name, "..")) - continue; - - ret = fn (subvol, entry, loc, data); - if (ret) - break; - } - gf_dirent_free (&entries); - if (ret) - break; - } - -out: - if (fd) - fd_unref (fd); - return ret; -} -- cgit