afr/self-heal:Fix wrong type checking
gf_dirent struct has d_type variable which should check with DT_DIR istead of IA_IFDIR or IA_IFDIR has to compare with entry->d_stat.ia_type Change-Id: Idf1059ce2a590734bc5b6adaad73604d9a708804 updates: bz#1653359 Signed-off-by: Mohammed Rafi KC <rkavunga@redhat.com>
This commit is contained in:
parent
04f84756e1
commit
06061aaa44
@ -5341,3 +5341,26 @@ find_xlator_option_in_cmd_args_t(const char *option_name, cmd_args_t *args)
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int
|
||||
gf_d_type_from_ia_type(ia_type_t type)
|
||||
{
|
||||
switch (type) {
|
||||
case IA_IFDIR:
|
||||
return DT_DIR;
|
||||
case IA_IFCHR:
|
||||
return DT_CHR;
|
||||
case IA_IFBLK:
|
||||
return DT_BLK;
|
||||
case IA_IFIFO:
|
||||
return DT_FIFO;
|
||||
case IA_IFLNK:
|
||||
return DT_LNK;
|
||||
case IA_IFREG:
|
||||
return DT_REG;
|
||||
case IA_IFSOCK:
|
||||
return DT_SOCK;
|
||||
default:
|
||||
return DT_UNKNOWN;
|
||||
}
|
||||
}
|
||||
|
@ -1067,4 +1067,7 @@ gf_replace_new_iatt_in_dict(struct _dict *);
|
||||
xlator_cmdline_option_t *
|
||||
find_xlator_option_in_cmd_args_t(const char *option_name, cmd_args_t *args);
|
||||
|
||||
int
|
||||
gf_d_type_from_ia_type(ia_type_t type);
|
||||
|
||||
#endif /* _COMMON_UTILS_H */
|
||||
|
@ -1150,3 +1150,4 @@ gf_changelog_init
|
||||
gf_changelog_register_generic
|
||||
gf_gfid_generate_from_xxh64
|
||||
find_xlator_option_in_cmd_args_t
|
||||
gf_d_type_from_ia_type
|
||||
|
@ -403,7 +403,7 @@ syncop_mt_dir_scan(call_frame_t *frame, xlator_t *subvol, loc_t *loc, int pid,
|
||||
continue;
|
||||
}
|
||||
|
||||
if (entry->d_type == IA_IFDIR) {
|
||||
if (entry->d_stat.ia_type == IA_IFDIR) {
|
||||
ret = fn(subvol, entry, loc, data);
|
||||
gf_dirent_entry_free(entry);
|
||||
if (ret)
|
||||
|
@ -1685,21 +1685,25 @@ index_get_gfid_type(void *opaque)
|
||||
|
||||
loc_wipe(&loc);
|
||||
|
||||
entry->d_type = IA_INVAL;
|
||||
entry->d_type = gf_d_type_from_ia_type(IA_INVAL);
|
||||
entry->d_stat.ia_type = IA_INVAL;
|
||||
if (gf_uuid_parse(entry->d_name, loc.gfid))
|
||||
continue;
|
||||
|
||||
loc.inode = inode_find(args->parent->table, loc.gfid);
|
||||
if (loc.inode) {
|
||||
entry->d_type = loc.inode->ia_type;
|
||||
entry->d_stat.ia_type = loc.inode->ia_type;
|
||||
entry->d_type = gf_d_type_from_ia_type(loc.inode->ia_type);
|
||||
continue;
|
||||
}
|
||||
loc.inode = inode_new(args->parent->table);
|
||||
if (!loc.inode)
|
||||
continue;
|
||||
ret = syncop_lookup(FIRST_CHILD(this), &loc, &iatt, 0, 0, 0);
|
||||
if (ret == 0)
|
||||
entry->d_type = iatt.ia_type;
|
||||
if (ret == 0) {
|
||||
entry->d_type = gf_d_type_from_ia_type(iatt.ia_type);
|
||||
entry->d_stat = iatt;
|
||||
}
|
||||
}
|
||||
loc_wipe(&loc);
|
||||
|
||||
|
@ -5306,31 +5306,6 @@ posix_entry_xattr_fill(xlator_t *this, inode_t *inode, fd_t *fd,
|
||||
return posix_xattr_fill(this, entry_path, &tmp_loc, NULL, -1, dict, stbuf);
|
||||
}
|
||||
|
||||
#ifdef _DIRENT_HAVE_D_TYPE
|
||||
static int
|
||||
posix_d_type_from_ia_type(ia_type_t type)
|
||||
{
|
||||
switch (type) {
|
||||
case IA_IFDIR:
|
||||
return DT_DIR;
|
||||
case IA_IFCHR:
|
||||
return DT_CHR;
|
||||
case IA_IFBLK:
|
||||
return DT_BLK;
|
||||
case IA_IFIFO:
|
||||
return DT_FIFO;
|
||||
case IA_IFLNK:
|
||||
return DT_LNK;
|
||||
case IA_IFREG:
|
||||
return DT_REG;
|
||||
case IA_IFSOCK:
|
||||
return DT_SOCK;
|
||||
default:
|
||||
return DT_UNKNOWN;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
int
|
||||
posix_readdirp_fill(xlator_t *this, fd_t *fd, gf_dirent_t *entries,
|
||||
dict_t *dict)
|
||||
@ -5405,14 +5380,12 @@ posix_readdirp_fill(xlator_t *this, fd_t *fd, gf_dirent_t *entries,
|
||||
if (stbuf.ia_ino)
|
||||
entry->d_ino = stbuf.ia_ino;
|
||||
|
||||
#ifdef _DIRENT_HAVE_D_TYPE
|
||||
if (entry->d_type == DT_UNKNOWN && !IA_ISINVAL(stbuf.ia_type)) {
|
||||
/* The platform supports d_type but the underlying
|
||||
filesystem doesn't. We set d_type to the correct
|
||||
value from ia_type */
|
||||
entry->d_type = posix_d_type_from_ia_type(stbuf.ia_type);
|
||||
entry->d_type = gf_d_type_from_ia_type(stbuf.ia_type);
|
||||
}
|
||||
#endif
|
||||
|
||||
inode = NULL;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user