diff options
author | Soumya Koduri <skoduri@redhat.com> | 2015-07-08 12:08:25 +0530 |
---|---|---|
committer | Kaleb KEITHLEY <kkeithle@redhat.com> | 2015-07-09 11:04:35 -0700 |
commit | c134bdd83a781452eff8c3e4abce3da4a997daa8 (patch) | |
tree | e7d67a9fdf8245d27836d46c0b7d3a97727de200 /api/src | |
parent | ea7161bca1c9e0c91148fea8895041a08ed24830 (diff) |
gfapi: Update loc->inode accordingly in 'glfs_loc_link'
In case if the inode already exits in the cache, inode_link
returns the pointer to the exiting one instead of using loc->inode.
This will result in issues if that invalid inodei(loc->inode) is referenced
further. Fixed the same.
Change-Id: I7d4a06043e4e731c8404532c47d482175dc2c277
BUG: 1240916
Signed-off-by: Soumya Koduri <skoduri@redhat.com>
Reviewed-on: http://review.gluster.org/11572
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Tested-by: NetBSD Build System <jenkins@build.gluster.org>
Reviewed-by: Kaleb KEITHLEY <kkeithle@redhat.com>
Reviewed-by: Shyamsundar Ranganathan <srangana@redhat.com>
Diffstat (limited to 'api/src')
-rw-r--r-- | api/src/glfs-fops.c | 16 | ||||
-rw-r--r-- | api/src/glfs-handleops.c | 10 |
2 files changed, 11 insertions, 15 deletions
diff --git a/api/src/glfs-fops.c b/api/src/glfs-fops.c index 46842d411cb..815e96a09e3 100644 --- a/api/src/glfs-fops.c +++ b/api/src/glfs-fops.c @@ -76,17 +76,23 @@ int glfs_loc_link (loc_t *loc, struct iatt *iatt) { int ret = -1; - inode_t *linked_inode = NULL; + inode_t *old_inode = NULL; if (!loc->inode) { errno = EINVAL; return -1; } - linked_inode = inode_link (loc->inode, loc->parent, loc->name, iatt); - if (linked_inode) { - inode_lookup (linked_inode); - inode_unref (linked_inode); + old_inode = loc->inode; + + /* If the inode already exists in the cache, the inode + * returned here points to the existing one. We need + * to update loc.inode accordingly. + */ + loc->inode = inode_link (loc->inode, loc->parent, loc->name, iatt); + if (loc->inode) { + inode_lookup (loc->inode); + inode_unref (old_inode); ret = 0; } else { ret = -1; diff --git a/api/src/glfs-handleops.c b/api/src/glfs-handleops.c index 47f2139c140..9a85f194451 100644 --- a/api/src/glfs-handleops.c +++ b/api/src/glfs-handleops.c @@ -746,11 +746,6 @@ pub_glfs_h_creat (struct glfs *fs, struct glfs_object *parent, const char *path, /* populate out args */ if (ret == 0) { - /* TODO: If the inode existed in the cache (say file already - exists), then the glfs_loc_link will not update the - loc.inode, as a result we will have a 0000 GFID that we - would copy out to the object, this needs to be fixed. - */ ret = glfs_loc_link (&loc, &iatt); if (ret != 0) { goto out; @@ -1466,11 +1461,6 @@ pub_glfs_h_symlink (struct glfs *fs, struct glfs_object *parent, /* populate out args */ if (ret == 0) { - /* TODO: If the inode existed in the cache (say file already - * exists), then the glfs_loc_link will not update the - * loc.inode, as a result we will have a 0000 GFID that we - * would copy out to the object, this needs to be fixed. - */ ret = glfs_loc_link (&loc, &iatt); if (ret != 0) { goto out; |