The current implementation of the "-perm" predicate queries the
stat information on the OST while it is not necessary. This patch
fixes that issue by moving the check to the correct location in
`cb_find_init`
On a simple setup with 1 MDT and 2 OSTs we observed for around 8000
files:
- 2.3s without the patch
- 1.9s with the patch
Test-Parameters: trivial
Change-Id: I30c0e89d136556058eadf6bede062577c6d36eaf
Signed-off-by: Courrier Guillaume <guillaume.courrier@cea.fr>
Reviewed-on: https://review.whamcloud.com/44118
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Reviewed-by: Olaf Faaland-LLNL <faaland1@llnl.gov>
Reviewed-by: Rick Mohr <mohrrf@ornl.gov>
Reviewed-by: Anjus George <georgea@ornl.gov>
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: James Simmons <jsimmons@infradead.org>
* Check that the file's permissions in *st matches the one in find_param
*/
static int check_file_permissions(const struct find_param *param,
* 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 mode_t st_mode = st->st_mode & 07777;
switch (param->fp_perm_sign) {
case LFS_FIND_PERM_EXACT:
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:
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:
break;
case LFS_FIND_PERM_ANY:
- decision = ((st_mode & param->fp_perm) != 0);
+ decision = ((mode & param->fp_perm) != 0);
+ /* 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))
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;
(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
/*
* If file still fits the request, ask ost for updated info.
* The regular stat is almost of the same speed as some new
-
- /* 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) {
}
if (param->fp_check_size) {