bool allow_prealloc_inos = mdr->session->is_open();
// assign ino
- if (allow_prealloc_inos && mdr->session->get_num_prealloc_inos()) {
- mdr->used_prealloc_ino =
- in->inode.ino = mdr->session->take_ino(useino); // prealloc -> used
+ if (allow_prealloc_inos && (mdr->used_prealloc_ino = in->inode.ino = mdr->session->take_ino(useino))) {
mds->sessionmap.mark_projected(mdr->session);
-
dout(10) << "prepare_new_inode used_prealloc " << mdr->used_prealloc_ino
<< " (" << mdr->session->info.prealloc_inos
<< ", " << mdr->session->info.prealloc_inos.size() << " left)"
}
inodeno_t take_ino(inodeno_t ino = 0) {
- ceph_assert(!info.prealloc_inos.empty());
-
if (ino) {
- if (info.prealloc_inos.contains(ino)) {
- info.prealloc_inos.erase(ino);
- if (delegated_inos.contains(ino))
- delegated_inos.erase(ino);
- } else {
- ino = 0;
- }
- }
- if (!ino) {
+ if (!info.prealloc_inos.contains(ino))
+ return 0;
+ info.prealloc_inos.erase(ino);
+ if (delegated_inos.contains(ino))
+ delegated_inos.erase(ino);
+ } else {
/* Grab first prealloc_ino that isn't delegated */
for (const auto& [start, len] : info.prealloc_inos) {
for (auto i = start ; i < start + len ; i += 1) {
break;
}
}
- ceph_assert(ino);
- info.used_inos.insert(ino, 1);
+ if (ino)
+ info.used_inos.insert(ino, 1);
return ino;
}
void delegate_inos(int want, interval_set<inodeno_t>& newinos) {