diff options
author | Jiffin Tony Thottan <jthottan@redhat.com> | 2015-06-25 15:04:18 +0530 |
---|---|---|
committer | Niels de Vos <ndevos@redhat.com> | 2015-06-28 00:53:27 -0700 |
commit | 49c4b7f750e94aee22d892a7171ed2ad291559e3 (patch) | |
tree | 6230ea3eef1502a8e09c32f3c0aa904d4336a188 /api/src/glfs-resolve.c | |
parent | 3da1a1cf339da77e47f71b245d4cac3f9dc1da38 (diff) |
gfapi : symlink resolution for glfs_object
Generally posix expects symlink should be resolved, before performing an
acl related operation. This patch introduces a new api glfs_h_resolve_symlink()
which will do the same.
backport of http://review.gluster.org/#/c/11410/1
>Change-Id: Ieee645154455a732edfb2c28834021bab4248810
>BUG: 1209735
>Signed-off-by: Jiffin Tony Thottan <jthottan@redhat.com>
Change-Id: I13a83f37a9e59418fd8eb4bf2d44f828515beabf
BUG: 1236269
Signed-off-by: Jiffin Tony Thottan <jthottan@redhat.com>
Reviewed-on: http://review.gluster.org/11438
Reviewed-by: Niels de Vos <ndevos@redhat.com>
Tested-by: NetBSD Build System <jenkins@build.gluster.org>
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Diffstat (limited to 'api/src/glfs-resolve.c')
-rw-r--r-- | api/src/glfs-resolve.c | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/api/src/glfs-resolve.c b/api/src/glfs-resolve.c index 60e285d3ae7..2767abf1c39 100644 --- a/api/src/glfs-resolve.c +++ b/api/src/glfs-resolve.c @@ -1026,3 +1026,40 @@ glfs_create_object (loc_t *loc, struct glfs_object **retobject) return 0; } + +struct glfs_object * +glfs_h_resolve_symlink (struct glfs *fs, struct glfs_object *object) +{ + + xlator_t *subvol = NULL; + loc_t sym_loc = {0,}; + struct iatt iatt = {0,}; + char *lpath = NULL; + int ret = 0; + struct glfs_object *target_object = NULL; + + subvol = glfs_active_subvol (fs); + if (!subvol) { + ret = -1; + errno = EIO; + goto out; + } + + ret = glfs_resolve_symlink (fs, subvol, object->inode, &lpath); + if (ret < 0) + goto out; + + ret = glfs_resolve_at (fs, subvol, NULL, lpath, + &sym_loc, &iatt, + /* always recurisvely follow while + following symlink + */ + 1, 0); + if (ret == 0) + ret = glfs_create_object (&sym_loc, &target_object); + +out: + loc_wipe (&sym_loc); + GF_FREE (lpath); + return target_object; +} |