diff options
author | Raghavendra Bhat <raghavendra@redhat.com> | 2015-07-01 15:56:58 +0530 |
---|---|---|
committer | Raghavendra G <rgowdapp@redhat.com> | 2015-08-20 22:02:45 -0700 |
commit | 53e57a62ab4254f131c1d02b70fcb9b97f33306c (patch) | |
tree | e7a8d141d676cc7bfe8382979ed1e3ff79642374 /libglusterfs | |
parent | 4efc8ea17f8452cf5a5f3a504419c1269d332d79 (diff) |
protocol/server: forget the inodes which got ENOENT in lookup
If a looked up object is removed from the backend, then upon getting a
revalidated lookup on that object ENOENT error is received. protocol/server
xlator handles it by removing dentry upon which ENOENT is received. But the
inode associated with it still remains in the inode table, and whoever does
nameless lookup on the gfid of that object will be able to do it successfully
despite the object being not present.
For handling this issue, upon getting ENOENT on a looked up entry in revalidate
lookups, protocol/server should forget the inode as well.
Though removing files directly from the backend is not allowed, in case of
objects corrupted due to bitrot and marked as bad by scrubber, objects are
removed directly from the backend in case of replicate volumes, so that the
object is healed from the good copy. For handling this, the inode of the bad
object removed from the backend should be forgotten. Otherwise, the inode which
knows the object it represents is bad, does not allow read/write operations
happening as part of self-heal.
Change-Id: I23b7a5bef919c98eea684aa1e977e317066cfc71
BUG: 1238188
Signed-off-by: Raghavendra Bhat <raghavendra@redhat.com>
Reviewed-on: http://review.gluster.org/11489
Tested-by: NetBSD Build System <jenkins@build.gluster.org>
Reviewed-by: Raghavendra G <rgowdapp@redhat.com>
Diffstat (limited to 'libglusterfs')
-rw-r--r-- | libglusterfs/src/inode.c | 26 | ||||
-rw-r--r-- | libglusterfs/src/inode.h | 3 |
2 files changed, 29 insertions, 0 deletions
diff --git a/libglusterfs/src/inode.c b/libglusterfs/src/inode.c index f660effcc7c..50ef98fba20 100644 --- a/libglusterfs/src/inode.c +++ b/libglusterfs/src/inode.c @@ -1314,6 +1314,32 @@ inode_parent (inode_t *inode, uuid_t pargfid, const char *name) return parent; } +static int +__inode_has_dentry (inode_t *inode) +{ + if (!inode) { + gf_msg_callingfn (THIS->name, GF_LOG_WARNING, 0, + LG_MSG_INODE_NOT_FOUND, "inode not found"); + return 0; + } + + return !list_empty (&inode->dentry_list); +} + +int +inode_has_dentry (inode_t *inode) +{ + + int dentry_present = 0; + + LOCK (&inode->lock); + { + dentry_present = __inode_has_dentry (inode); + } + UNLOCK (&inode->lock); + + return dentry_present; +} int __inode_path (inode_t *inode, const char *name, char **bufp) diff --git a/libglusterfs/src/inode.h b/libglusterfs/src/inode.h index 633e771fc3d..46fe8f6ac80 100644 --- a/libglusterfs/src/inode.h +++ b/libglusterfs/src/inode.h @@ -273,4 +273,7 @@ inode_set_need_lookup (inode_t *inode, xlator_t *this); gf_boolean_t inode_needs_lookup (inode_t *inode, xlator_t *this); +int +inode_has_dentry (inode_t *inode); + #endif /* _INODE_H */ |