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:
Ravishankar N 2019-01-24 12:14:11 +05:30 committed by Amar Tumballi
parent 04f84756e1
commit 06061aaa44
6 changed files with 37 additions and 33 deletions

View File

@ -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;
}
}

View File

@ -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 */

View File

@ -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

View File

@ -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)

View File

@ -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);

View File

@ -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;
}