From 5d3108d182877795eab118a448d1e21f021d7d9c Mon Sep 17 00:00:00 2001 From: Raghavendra G Date: Tue, 27 Mar 2012 15:05:15 +0530 Subject: libglusterfs/inode.c: add inode_resolve inode_resolve takes an itable and path as arguments and returns either NULL or the inode corresponding to the path Change-Id: Id42d62cce6b04dbfec7d606120b09a1e54ab484e BUG: 802905 Signed-off-by: Raghavendra G Reviewed-on: http://review.gluster.com/3021 Tested-by: Gluster Build System Reviewed-by: Raghavendra Bhat Reviewed-by: Mohammed Junaid Reviewed-by: Anand Avati --- libglusterfs/src/inode.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ libglusterfs/src/inode.h | 3 +++ 2 files changed, 47 insertions(+) (limited to 'libglusterfs') diff --git a/libglusterfs/src/inode.c b/libglusterfs/src/inode.c index 08bedf8fa..7a50fe228 100644 --- a/libglusterfs/src/inode.c +++ b/libglusterfs/src/inode.c @@ -660,6 +660,50 @@ inode_grep (inode_table_t *table, inode_t *parent, const char *name) return inode; } + +inode_t * +inode_resolve (inode_table_t *table, char *path) +{ + char *tmp = NULL, *bname = NULL, *str = NULL, *saveptr = NULL; + inode_t *inode = NULL, *parent = NULL; + + if ((path == NULL) || (table == NULL)) { + goto out; + } + + parent = inode_ref (table->root); + str = tmp = gf_strdup (path); + + while (1) { + bname = strtok_r (str, "/", &saveptr); + if (bname == NULL) { + break; + } + + if (inode != NULL) { + inode_unref (inode); + } + + inode = inode_grep (table, parent, bname); + if (inode == NULL) { + break; + } + + if (parent != NULL) { + inode_unref (parent); + } + + parent = inode_ref (inode); + str = NULL; + } + + inode_unref (parent); + GF_FREE (tmp); +out: + return inode; +} + + int inode_grep_for_gfid (inode_table_t *table, inode_t *parent, const char *name, uuid_t gfid, ia_type_t *type) diff --git a/libglusterfs/src/inode.h b/libglusterfs/src/inode.h index 5dced8006..f6401c5b9 100644 --- a/libglusterfs/src/inode.h +++ b/libglusterfs/src/inode.h @@ -180,6 +180,9 @@ int inode_ctx_del2 (inode_t *inode, xlator_t *xlator, uint64_t *value1, uint64_t *value2); +inode_t * +inode_resolve (inode_table_t *table, char *path); + #define __inode_ctx_set(i,x,v_p) __inode_ctx_set2(i,x,v_p,0) #define inode_ctx_set(i,x,v_p) inode_ctx_set2(i,x,v_p,0) -- cgit