summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRaghavendra Gowdappa <rgowdapp@redhat.com>2019-03-07 16:35:33 +0530
committerShyamsundar Ranganathan <srangana@redhat.com>2019-03-08 14:08:29 +0000
commitae24a2c3903b402e701eca03c5b0de3f4382cb5c (patch)
tree00cfe57471fd14e0c37bac63dad5fb146ab16bbb
parent8444c1ea54936732764c12aee075af8b6d952975 (diff)
performance/readdir-ahead: fix deadlock
This deadlock happens while processing dentry corresponding to current directory (.) in rda_fill_readdirp. In this case following order is followed: LOCK(directory_fd_ctx->lock); rda_inode_ctx_get_iatt -> LOCK(directory_inode->lock); However, in rda_mark_inode_dirty following lock order is followed: LOCK(directory_inode->lock); LOCK(directory_fd_ctx->lock); these two codepaths when executed concurrently resulted in a deadlock. Current patch fixes this by removing locking directory inode and fd-ctx in rda_fill_readdirp. This is fine as directory inode's stat won't change due to writes to files within directory. Change-Id: Ic93a67a0dac8229bb0d79582e526a512e6f2569c Signed-off-by: Raghavendra Gowdappa <rgowdapp@redhat.com> Fixes: bz#1686399
-rw-r--r--xlators/performance/readdir-ahead/src/readdir-ahead.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/xlators/performance/readdir-ahead/src/readdir-ahead.c b/xlators/performance/readdir-ahead/src/readdir-ahead.c
index b3363b8b884..7fd4f8d0618 100644
--- a/xlators/performance/readdir-ahead/src/readdir-ahead.c
+++ b/xlators/performance/readdir-ahead/src/readdir-ahead.c
@@ -322,7 +322,8 @@ __rda_fill_readdirp(xlator_t *this, gf_dirent_t *entries, size_t request_size,
memset(&tmp_stat, 0, sizeof(tmp_stat));
- if (dirent->inode) {
+ if (dirent->inode && (!((strcmp(dirent->d_name, ".") == 0) ||
+ (strcmp(dirent->d_name, "..") == 0)))) {
rda_inode_ctx_get_iatt(dirent->inode, this, &tmp_stat);
dirent->d_stat = tmp_stat;
}