in src/fuse/IovTable.cc [28:111]
static Result<IovAttrs> parseKey(const char *key) {
IovAttrs iova;
std::vector<std::string> fnParts;
folly::split('.', key, fnParts);
auto idRes = Uuid::fromHexString(fnParts[0]);
RETURN_ON_ERROR(idRes);
iova.id = *idRes;
for (size_t i = 1; i < fnParts.size(); ++i) {
auto dec = fnParts[i];
switch (dec[0]) {
case 'b': { // block size
auto i = atoll(dec.c_str() + 1);
if (i <= 0) {
return makeError(StatusCode::kInvalidArg, "invalid block size set in shm key");
}
iova.blockSize = (size_t)i;
break;
}
case 'r':
case 'w': { // is io ring
auto i = atoll(dec.c_str() + 1);
iova.isIoRing = true;
iova.forRead = dec[0] == 'r';
iova.ioDepth = i;
break;
}
case 't': {
if (!iova.iora) {
iova.iora = IorAttrs{};
}
auto i = atoi(dec.c_str() + 1);
if (i < 0) {
return makeError(StatusCode::kInvalidArg, "invalid io job check timeout {}", dec.c_str() + 1);
}
iova.iora->timeout = Duration(std::chrono::nanoseconds((uint64_t)i * 1000000));
break;
}
case 'f': {
if (!iova.iora) {
iova.iora = IorAttrs{};
}
char *ep;
auto i = strtoull(dec.c_str() + 1, &ep, 2);
if (*ep != 0 || i < 0) {
return makeError(StatusCode::kInvalidArg, "invalid io exec flags {}", dec.c_str() + 1);
}
iova.iora->flags = i;
break;
}
case 'p': // should be io ring, priority
if (!iova.iora) {
iova.iora = IorAttrs{};
}
switch (dec.c_str()[1]) {
case 'l':
iova.iora->priority = 2;
break;
case 'h':
iova.iora->priority = 0;
break;
case 'n':
case '\0':
iova.iora->priority = 1;
break;
default:
return makeError(StatusCode::kInvalidArg, "invalid priority set in shm key");
}
break;
}
}
if (!iova.isIoRing && iova.iora) {
return makeError(StatusCode::kInvalidArg, "ioring attrs set for non-ioring");
}
return iova;
}