summaryrefslogtreecommitdiffstats
path: root/libglusterfs
diff options
context:
space:
mode:
authorSoumya Koduri <skoduri@redhat.com>2016-05-10 13:03:42 +0530
committerKaleb KEITHLEY <kkeithle@redhat.com>2016-05-11 07:36:18 -0700
commit9a7f210e0954ea8a6bcc224f515094bdf4b7762c (patch)
tree179347db31c25e0819655692b6d264b62f14c1b8 /libglusterfs
parentb798f82c2e8d786797e34865d464b92fb4e9b641 (diff)
libglusterfs/gfapi: set appropriate errno for inode_link failures
We do not seem to be setting errno appropriately in case of inode_link failures. This errno may be used by any application (for eg., nfs-ganesha) to determine the error encountered. This patch addresses the same. This is backport of below mainline fix - http://review.gluster.org/14278 Change-Id: I674f747c73369d0597a9c463e6ea4c85b9091355 BUG: 1335017 Signed-off-by: Soumya Koduri <skoduri@redhat.com> Reviewed-on: http://review.gluster.org/14278 Reviewed-by: Niels de Vos <ndevos@redhat.com> Reviewed-by: jiffin tony Thottan <jthottan@redhat.com> Reviewed-by: Kaleb KEITHLEY <kkeithle@redhat.com> Reviewed-on: http://review.gluster.org/14288 Smoke: Gluster Build System <jenkins@build.gluster.com> NetBSD-regression: NetBSD Build System <jenkins@build.gluster.org> CentOS-regression: Gluster Build System <jenkins@build.gluster.com>
Diffstat (limited to 'libglusterfs')
-rw-r--r--libglusterfs/src/inode.c21
1 files changed, 17 insertions, 4 deletions
diff --git a/libglusterfs/src/inode.c b/libglusterfs/src/inode.c
index 7f2a102c855..ab4b505e22f 100644
--- a/libglusterfs/src/inode.c
+++ b/libglusterfs/src/inode.c
@@ -929,27 +929,34 @@ __inode_link (inode_t *inode, inode_t *parent, const char *name,
inode_table_t *table = NULL;
inode_t *link_inode = NULL;
- if (!inode)
+ if (!inode) {
+ errno = EINVAL;
return NULL;
+ }
table = inode->table;
- if (!table)
+ if (!table) {
+ errno = EINVAL;
return NULL;
+ }
if (parent) {
/* We should prevent inode linking between different
inode tables. This can cause errors which is very
hard to catch/debug. */
if (inode->table != parent->table) {
+ errno = EINVAL;
GF_ASSERT (!"link attempted b/w inodes of diff table");
}
if (parent->ia_type != IA_IFDIR) {
+ errno = EINVAL;
GF_ASSERT (!"link attempted on non-directory parent");
return NULL;
}
if (!name || strlen (name) == 0) {
+ errno = EINVAL;
GF_ASSERT (!"link attempted with no basename on "
"parent");
return NULL;
@@ -959,11 +966,15 @@ __inode_link (inode_t *inode, inode_t *parent, const char *name,
link_inode = inode;
if (!__is_inode_hashed (inode)) {
- if (!iatt)
+ if (!iatt) {
+ errno = EINVAL;
return NULL;
+ }
- if (gf_uuid_is_null (iatt->ia_gfid))
+ if (gf_uuid_is_null (iatt->ia_gfid)) {
+ errno = EINVAL;
return NULL;
+ }
old_inode = __inode_find (table, iatt->ia_gfid);
@@ -1010,9 +1021,11 @@ __inode_link (inode_t *inode, inode_t *parent, const char *name,
"inode %s with parent %s",
uuid_utoa (link_inode->gfid),
uuid_utoa (parent->gfid));
+ errno = ENOMEM;
return NULL;
}
if (old_inode && __is_dentry_cyclic (dentry)) {
+ errno = ELOOP;
__dentry_unset (dentry);
return NULL;
}