diff options
Diffstat (limited to 'api/src/glfs-fops.c')
| -rw-r--r-- | api/src/glfs-fops.c | 16 | 
1 files changed, 15 insertions, 1 deletions
diff --git a/api/src/glfs-fops.c b/api/src/glfs-fops.c index e1762ae1285..b66f336338d 100644 --- a/api/src/glfs-fops.c +++ b/api/src/glfs-fops.c @@ -2270,6 +2270,7 @@ glfd_entry_refresh (struct glfs_fd *glfd, int plus)  	xlator_t        *subvol = NULL;  	gf_dirent_t      entries;  	gf_dirent_t      old; +        gf_dirent_t     *entry = NULL;  	int              ret = -1;  	fd_t            *fd = NULL; @@ -2304,8 +2305,20 @@ glfd_entry_refresh (struct glfs_fd *glfd, int plus)  				      &entries, NULL, NULL);          DECODE_SYNCOP_ERR (ret);  	if (ret >= 0) { -		if (plus) +		if (plus) { +                        /** +                         * Set inode_needs_lookup flag before linking the +                         * inode. Doing it later post linkage might lead +                         * to a race where a fop comes after inode link +                         * but before setting need_lookup flag. +                         */ +                        list_for_each_entry (entry, &glfd->entries, list) { +                                if (entry->inode) +                                        inode_set_need_lookup (entry->inode, THIS); +                        } +  			gf_link_inodes_from_dirent (THIS, fd->inode, &entries); +                }  		list_splice_init (&glfd->entries, &old.list);  		list_splice_init (&entries.list, &glfd->entries); @@ -2314,6 +2327,7 @@ glfd_entry_refresh (struct glfs_fd *glfd, int plus)  		errno = 0;  	} +  	if (ret > 0)  		glfd->next = list_entry (glfd->entries.next, gf_dirent_t, list);  | 
