void OpenFileTable::_encode_header(bufferlist &bl, int j_state)
{
+ std::string_view magic = CEPH_FS_ONDISK_MAGIC;
+ encode(magic, bl);
+ ENCODE_START(1, 1, bl);
encode(omap_version, bl);
encode(omap_num_objs, bl);
encode((__u8)j_state, bl);
+ ENCODE_FINISH(bl);
}
class C_IO_OFT_Save : public MDSIOContextBase {
SnapContext snapc;
object_locator_t oloc(mds->mdsmap->get_metadata_pool());
- const unsigned max_items_per_obj = 1024 * 1024;
const unsigned max_write_size = mds->mdcache->max_dir_commit_size;
struct omap_update_ctl {
assert(it.second == DIRTY_NEW);
// find omap object to store the key
for (unsigned i = first_free_idx; i < omap_num_objs; i++) {
- if (omap_num_items[i] < max_items_per_obj)
+ if (omap_num_items[i] < MAX_ITEMS_PER_OBJ)
omap_idx = i;
}
if (omap_idx < 0) {
++omap_num_objs;
+ assert(omap_num_objs <= MAX_OBJECTS);
omap_num_items.resize(omap_num_objs);
omap_updates.resize(omap_num_objs);
omap_updates.back().clear = true;
unsigned& count = omap_num_items.at(omap_idx);
assert(count > 0);
--count;
- if ((unsigned)omap_idx < first_free_idx && count < max_items_per_obj)
+ if ((unsigned)omap_idx < first_free_idx && count < MAX_ITEMS_PER_OBJ)
first_free_idx = omap_idx;
}
auto& ctl = omap_updates.at(omap_idx);
try {
if (first) {
bufferlist::iterator p = header_bl.begin();
+
+ string magic;
version_t version;
unsigned num_objs;
__u8 jstate;
- decode(version, p);
- decode(num_objs, p);
- decode(jstate, p);
+
+ if (header_bl.length() == 13) {
+ // obsolete format.
+ decode(version, p);
+ decode(num_objs, p);
+ decode(jstate, p);
+ } else {
+ decode(magic, p);
+ if (magic != CEPH_FS_ONDISK_MAGIC) {
+ std::ostringstream oss;
+ oss << "invalid magic '" << magic << "'";
+ throw buffer::malformed_input(oss.str());
+ }
+
+ DECODE_START(1, p);
+ decode(version, p);
+ decode(num_objs, p);
+ decode(jstate, p);
+ DECODE_FINISH(p);
+ }
+
+ if (num_objs > MAX_OBJECTS) {
+ std::ostringstream oss;
+ oss << "invalid object count '" << num_objs << "'";
+ throw buffer::malformed_input(oss.str());
+ }
+ if (jstate > JOURNAL_FINISH) {
+ std::ostringstream oss;
+ oss << "invalid journal state '" << jstate << "'";
+ throw buffer::malformed_input(oss.str());
+ }
if (version > omap_version) {
omap_version = version;