xfs_ino_t ino;
- /* Raw UTF8 name */
+ /* Raw dirent name */
size_t namelen;
char name[0];
};
uc->buckets[bucket] = new_entry;
while (entry != NULL) {
+ /*
+ * If we see the same byte sequence then someone's modifying
+ * the namespace while we're scanning it. Update the existing
+ * entry's inode mapping and erase the new entry from existence.
+ */
+ if (new_entry->namelen == entry->namelen &&
+ !memcmp(new_entry->name, entry->name, entry->namelen)) {
+ entry->ino = new_entry->ino;
+ uc->buckets[bucket] = new_entry->next;
+ name_entry_free(new_entry);
+ *badflags = 0;
+ return;
+ }
+
/* Same normalization? */
if (new_entry->normstrlen == entry->normstrlen &&
!u_strcmp(new_entry->normstr, entry->normstr) &&