* Check that the file's permissions in *st matches the one in find_param
*/
static int check_file_permissions(const struct find_param *param,
- const lstat_t *st)
+ mode_t mode)
{
- const mode_t st_mode = st->st_mode & 07777;
int decision = 0;
+ mode &= 07777;
+
switch (param->fp_perm_sign) {
case LFS_FIND_PERM_EXACT:
- decision = (st_mode == param->fp_perm);
+ decision = (mode == param->fp_perm);
break;
case LFS_FIND_PERM_ALL:
- decision = ((st_mode & param->fp_perm) == param->fp_perm);
+ decision = ((mode & param->fp_perm) == param->fp_perm);
break;
case LFS_FIND_PERM_ANY:
- decision = ((st_mode & param->fp_perm) != 0);
+ decision = ((mode & param->fp_perm) != 0);
break;
}
}
}
+ /* Check the file permissions from the stat info */
+ if (param->fp_perm_sign) {
+ decision = check_file_permissions(param, lmd->lmd_stx.stx_mode);
+ if (decision == -1)
+ goto decided;
+ }
+
if (param->fp_type && !checked_type) {
if ((param->fp_check_mdt_count || param->fp_check_hash_flag ||
param->fp_hash_type) && !S_ISDIR(lmd->lmd_stx.stx_mode))
(param->fp_lazy && flags & OBD_MD_FLLAZYBLOCKS)))
decision = 0;
- if (param->fp_perm_sign)
- decision = 0;
-
/*
* If file still fits the request, ask ost for updated info.
* The regular stat is almost of the same speed as some new
goto out;
}
}
-
- /* Check the file permissions from the stat info */
- if (param->fp_perm_sign) {
- decision = check_file_permissions(param, &st);
- if (decision == -1)
- goto decided;
- }
}
if (param->fp_check_size) {