int wr_ret = wr_cond.wait();
client_lock.Lock();
+ bool errored = false;
+
if (rd_ret == 0 || rd_ret == -ENOENT)
have |= POOL_READ;
else if (rd_ret != -EPERM) {
ldout(cct, 10) << "check_pool_perm on pool " << pool
<< " rd_err = " << rd_ret << " wr_err = " << wr_ret << dendl;
- return rd_ret;
+ errored = true;
}
if (wr_ret == 0 || wr_ret == -EEXIST)
else if (wr_ret != -EPERM) {
ldout(cct, 10) << "check_pool_perm on pool " << pool
<< " rd_err = " << rd_ret << " wr_err = " << wr_ret << dendl;
- return wr_ret;
+ errored = true;
+ }
+
+ if (errored) {
+ // Indeterminate: erase CHECKING state so that subsequent calls re-check.
+ // Raise EIO because actual error code might be misleading for
+ // userspace filesystem user.
+ pool_perms.erase(pool);
+ signal_cond_list(waiting_for_pool_perm);
+ return -EIO;
}
pool_perms[pool] = have | POOL_CHECKED;