From b5c4b54e581609dc7f77ff07379d39b8471f502c Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Thu, 30 Apr 2009 10:42:26 -0700 Subject: [PATCH] mds: clean up layouts --- src/config.cc | 40 ---------------------------------------- src/config.h | 4 ---- src/dumpjournal.cc | 8 +++++++- src/kernel/mdsmap.c | 12 ++++++++++++ src/kernel/mdsmap.h | 4 ++++ src/mds/AnchorServer.cc | 1 - src/mds/CDir.cc | 24 +++++++++++++----------- src/mds/CInode.cc | 22 +++++++++++++--------- src/mds/InoTable.cc | 1 - src/mds/MDCache.cc | 18 +++++++++++++++++- src/mds/MDCache.h | 4 ++++ src/mds/MDLog.cc | 8 +++++++- src/mds/MDS.cc | 3 +++ src/mds/MDSMap.h | 24 +++++++++++++++++++----- src/mds/MDSTable.cc | 17 +++++++++-------- src/mds/MDSTable.h | 1 - src/mds/Server.cc | 6 ++++-- src/mds/SessionMap.cc | 29 +++++++++++++---------------- src/mds/SessionMap.h | 2 +- src/mds/SnapServer.cc | 1 - src/mon/MDSMonitor.cc | 3 +++ src/osdc/Objecter.h | 6 +++++- 22 files changed, 134 insertions(+), 104 deletions(-) diff --git a/src/config.cc b/src/config.cc index 21ee85b8f6c23..75b365658a1f7 100644 --- a/src/config.cc +++ b/src/config.cc @@ -84,49 +84,9 @@ struct ceph_file_layout g_default_file_layout = { fl_object_size: init_le32(1<<22), fl_cas_hash: init_le32(0), fl_object_stripe_unit: init_le32(0), - fl_pg_preferred: init_le32(-1), - fl_pg_pool: {CEPH_DATA_RULE}, }; -struct ceph_file_layout g_default_casdata_layout = { - fl_stripe_unit: init_le32(1<<22), - fl_stripe_count: init_le32(1), - fl_object_size: init_le32(1<<22), - fl_cas_hash: init_le32(0), - fl_object_stripe_unit: init_le32(0), - fl_pg_preferred: init_le32(-1), - fl_pg_pool: {CEPH_CASDATA_RULE}, -}; - -struct ceph_file_layout g_default_mds_dir_layout = { - fl_stripe_unit: init_le32(1<<22), - fl_stripe_count: init_le32(1), - fl_object_size: init_le32(1<<22), - fl_cas_hash: init_le32(0), - fl_object_stripe_unit: init_le32(0), - fl_pg_preferred: init_le32(-1), - fl_pg_pool: {CEPH_METADATA_RULE}, -}; -struct ceph_file_layout g_default_mds_log_layout = { - fl_stripe_unit: init_le32(1<<20), - fl_stripe_count: init_le32(1), - fl_object_size: init_le32(1<<20), - fl_cas_hash: init_le32(0), - fl_object_stripe_unit: init_le32(0), - fl_pg_preferred: init_le32(-1), - fl_pg_pool: {CEPH_METADATA_RULE}, -}; - -struct ceph_file_layout g_default_mds_anchortable_layout = { - fl_stripe_unit: init_le32(1<<20), - fl_stripe_count: init_le32(1), - fl_object_size: init_le32(1<<20), - fl_cas_hash: init_le32(0), - fl_object_stripe_unit: init_le32(0), - fl_pg_preferred: init_le32(-1), - fl_pg_pool: {CEPH_METADATA_RULE}, -}; #include diff --git a/src/config.h b/src/config.h index f76dd7946e0d8..6137352ded8c7 100644 --- a/src/config.h +++ b/src/config.h @@ -16,10 +16,6 @@ #define __CEPH_CONFIG_H extern struct ceph_file_layout g_default_file_layout; -extern struct ceph_file_layout g_default_casdata_layout; -extern struct ceph_file_layout g_default_mds_dir_layout; -extern struct ceph_file_layout g_default_mds_log_layout; -extern struct ceph_file_layout g_default_mds_anchortable_layout; #include #include diff --git a/src/dumpjournal.cc b/src/dumpjournal.cc index a3bbf164d75c8..06c3f85ee312f 100644 --- a/src/dumpjournal.cc +++ b/src/dumpjournal.cc @@ -97,7 +97,13 @@ int main(int argc, const char **argv, const char *envp[]) inode_t log_inode; memset(&log_inode, 0, sizeof(log_inode)); log_inode.ino = MDS_INO_LOG_OFFSET + mds; - log_inode.layout = g_default_mds_log_layout; + log_inode.layout.fl_stripe_unit = 1<<20; + log_inode.layout.fl_stripe_count = 1; + log_inode.layout.fl_object_size = 1<<20; + log_inode.layout.fl_cas_hash = 0; + log_inode.layout.fl_object_stripe_unit = 0; + log_inode.layout.fl_pg_preferred = -1; + log_inode.layout.fl_pg_pool = CEPH_METADATA_RULE; objecter = new Objecter(messenger, &monmap, &osdmap, lock); journaler = new Journaler(log_inode.ino, &log_inode.layout, CEPH_FS_ONDISK_MAGIC, objecter, 0, 0, &lock); diff --git a/src/kernel/mdsmap.c b/src/kernel/mdsmap.c index 21afac93792c0..87a091aa9f0a0 100644 --- a/src/kernel/mdsmap.c +++ b/src/kernel/mdsmap.c @@ -100,6 +100,17 @@ struct ceph_mdsmap *ceph_mdsmap_decode(void **p, void *end) } } + /* pg_pools */ + ceph_decode_32_safe(p, end, n, bad); + m->m_num_data_pg_pools = n; + m->m_data_pg_pools = kmalloc(sizeof(u32)*n, GFP_NOFS); + if (!m->m_data_pg_pools) + goto badmem; + ceph_decode_need(p, end, sizeof(u32)*(n+1), bad); + for (i = 0; i < n; i++) + ceph_decode_32(p, m->m_data_pg_pools[i]); + ceph_decode_32(p, m->m_cas_pg_pool); + /* ok, we don't care about the rest. */ dout(30, "mdsmap_decode success epoch %u\n", m->m_epoch); return m; @@ -116,5 +127,6 @@ void ceph_mdsmap_destroy(struct ceph_mdsmap *m) { kfree(m->m_addr); kfree(m->m_state); + kfree(m->m_data_pg_pools); kfree(m); } diff --git a/src/kernel/mdsmap.h b/src/kernel/mdsmap.h index 8defb0c4f4904..52389239f63b3 100644 --- a/src/kernel/mdsmap.h +++ b/src/kernel/mdsmap.h @@ -16,6 +16,10 @@ struct ceph_mdsmap { u32 m_max_mds; /* size of m_addr, m_state arrays */ struct ceph_entity_addr *m_addr; /* mds addrs */ s32 *m_state; /* states */ + + int m_num_data_pg_pools; + u32 *m_data_pg_pools; + u32 m_cas_pg_pool; }; static inline struct ceph_entity_addr * diff --git a/src/mds/AnchorServer.cc b/src/mds/AnchorServer.cc index 1dc873ce63e5e..a521af71e8c62 100644 --- a/src/mds/AnchorServer.cc +++ b/src/mds/AnchorServer.cc @@ -26,7 +26,6 @@ void AnchorServer::init_inode() { ino = MDS_INO_ANCHORTABLE; - layout = g_default_file_layout; } void AnchorServer::reset_state() diff --git a/src/mds/CDir.cc b/src/mds/CDir.cc index fd8517bfcff5f..a97db84dc858b 100644 --- a/src/mds/CDir.cc +++ b/src/mds/CDir.cc @@ -1038,12 +1038,11 @@ void CDir::fetch(Context *c, bool ignore_authpinnability) // start by reading the first hunk of it C_Dir_Fetch *fin = new C_Dir_Fetch(this); - cache->mds->objecter->read( get_ondisk_object(), - cache->mds->objecter->osdmap->file_to_object_layout( get_ondisk_object(), - g_default_mds_dir_layout ), - 0, 0, // whole object - &fin->bl, 0, - fin ); + object_t oid = get_ondisk_object(); + OSDMap *osdmap = cache->mds->objecter->osdmap; + ceph_object_layout ol = osdmap->make_object_layout(oid, + cache->mds->mdsmap->get_metadata_pg_pool()); + cache->mds->objecter->read_full(oid, ol, &fin->bl, 0, fin); } void CDir::_fetched(bufferlist &bl) @@ -1478,11 +1477,14 @@ void CDir::_commit(version_t want) inode->make_path_string(path); m.setxattr("path", path); - cache->mds->objecter->mutate( get_ondisk_object(), - cache->mds->objecter->osdmap->file_to_object_layout( get_ondisk_object(), - g_default_mds_dir_layout ), - m, snapc, 0, - NULL, new C_Dir_Committed(this, get_version()) ); + object_t oid = get_ondisk_object(); + OSDMap *osdmap = cache->mds->objecter->osdmap; + ceph_object_layout ol = osdmap->make_object_layout(oid, + cache->mds->mdsmap->get_metadata_pg_pool()); + + cache->mds->objecter->mutate(oid, ol, + m, snapc, 0, + NULL, new C_Dir_Committed(this, get_version()) ); } diff --git a/src/mds/CInode.cc b/src/mds/CInode.cc index 0794b2c7d1abf..65f9fd435e2f3 100644 --- a/src/mds/CInode.cc +++ b/src/mds/CInode.cc @@ -650,11 +650,13 @@ void CInode::store(Context *fin) m.setxattr("inode", bl); object_t oid(ino(), frag_t()); - mdcache->mds->objecter->mutate( oid, - mdcache->mds->objecter->osdmap->file_to_object_layout( oid, - g_default_mds_dir_layout ), - m, snapc, 0, - NULL, new C_Inode_Stored(this, get_version(), fin) ); + OSDMap *osdmap = mdcache->mds->objecter->osdmap; + ceph_object_layout ol = osdmap->make_object_layout(oid, + mdcache->mds->mdsmap->get_metadata_pg_pool()); + + mdcache->mds->objecter->mutate(oid, ol, + m, snapc, 0, + NULL, new C_Inode_Stored(this, get_version(), fin) ); } void CInode::_stored(version_t v, Context *fin) @@ -687,10 +689,12 @@ void CInode::fetch(Context *fin) ObjectRead rd; rd.getxattr("inode"); - mdcache->mds->objecter->read( oid, - mdcache->mds->objecter->osdmap->file_to_object_layout( oid, - g_default_mds_dir_layout ), - rd, &c->bl, 0, c ); + OSDMap *osdmap = mdcache->mds->objecter->osdmap; + ceph_object_layout ol = osdmap->make_object_layout(oid, + mdcache->mds->mdsmap->get_metadata_pg_pool()); + + mdcache->mds->objecter->read(oid, ol, + rd, &c->bl, 0, c ); } void CInode::_fetched(bufferlist& bl, Context *fin) diff --git a/src/mds/InoTable.cc b/src/mds/InoTable.cc index c576ffab772c2..e1f38e74d88ed 100644 --- a/src/mds/InoTable.cc +++ b/src/mds/InoTable.cc @@ -26,7 +26,6 @@ void InoTable::init_inode() { ino = MDS_INO_IDS_OFFSET + mds->get_nodeid(); - layout = g_default_file_layout; } void InoTable::reset_state() diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc index 9605733f3d143..7e8e7faa9339e 100644 --- a/src/mds/MDCache.cc +++ b/src/mds/MDCache.cc @@ -204,6 +204,19 @@ void MDCache::remove_inode(CInode *o) delete o; } + + +void MDCache::init_layouts() +{ + default_file_layout = g_default_file_layout; + default_file_layout.fl_pg_preferred = -1; + default_file_layout.fl_pg_pool = mds->mdsmap->get_data_pg_pool(); + + default_dir_layout = g_default_file_layout; + default_dir_layout.fl_pg_preferred = -1; + default_dir_layout.fl_pg_pool = mds->mdsmap->get_metadata_pg_pool(); +} + CInode *MDCache::create_system_inode(inodeno_t ino, int mode) { CInode *in = new CInode(this); @@ -214,7 +227,10 @@ CInode *MDCache::create_system_inode(inodeno_t ino, int mode) in->inode.ctime = in->inode.mtime = g_clock.now(); in->inode.nlink = 1; - in->inode.layout = g_default_mds_dir_layout; + if (in->inode.is_dir()) + in->inode.layout = default_dir_layout; + else + in->inode.layout = default_file_layout; add_inode(in); return in; } diff --git a/src/mds/MDCache.h b/src/mds/MDCache.h index bd20c8c2ed06a..69ece7ed24687 100644 --- a/src/mds/MDCache.h +++ b/src/mds/MDCache.h @@ -417,6 +417,9 @@ public: int num_inodes_with_caps; int num_caps; + ceph_file_layout default_file_layout; + ceph_file_layout default_dir_layout; + // -- client leases -- public: static const int client_lease_pools = 3; @@ -870,6 +873,7 @@ private: list waiting_for_open; public: + void init_layouts(); CInode *create_system_inode(inodeno_t ino, int mode); CInode *create_root_inode(); diff --git a/src/mds/MDLog.cc b/src/mds/MDLog.cc index acecf8bae3eeb..8edc0786d8048 100644 --- a/src/mds/MDLog.cc +++ b/src/mds/MDLog.cc @@ -83,7 +83,13 @@ void MDLog::init_journaler() // inode memset(&log_inode, 0, sizeof(log_inode)); log_inode.ino = MDS_INO_LOG_OFFSET + mds->get_nodeid(); - log_inode.layout = g_default_mds_log_layout; + log_inode.layout.fl_stripe_unit = 1<<20; + log_inode.layout.fl_stripe_count = 1; + log_inode.layout.fl_object_size = 1<<20; + log_inode.layout.fl_cas_hash = 0; + log_inode.layout.fl_object_stripe_unit = 0; + log_inode.layout.fl_pg_preferred = -1; + log_inode.layout.fl_pg_pool = mds->mdsmap->get_metadata_pg_pool(); if (g_conf.mds_local_osd) log_inode.layout.fl_pg_preferred = mds->get_nodeid() + g_conf.num_osd; // hack diff --git a/src/mds/MDS.cc b/src/mds/MDS.cc index a4f17038f1226..66356dd692f83 100644 --- a/src/mds/MDS.cc +++ b/src/mds/MDS.cc @@ -763,6 +763,8 @@ void MDS::boot_create() C_Gather *fin = new C_Gather(new C_MDS_CreateFinish(this)); + mdcache->init_layouts(); + // start with a fresh journal dout(10) << "boot_create creating fresh journal" << dendl; mdlog->create(fin->new_sub()); @@ -822,6 +824,7 @@ void MDS::boot_start(int step, int r) switch (step) { case 0: + mdcache->init_layouts(); step = 1; // fall-thru. case 1: diff --git a/src/mds/MDSMap.h b/src/mds/MDSMap.h index 26bdf6fd88b1a..c7001c200c8c9 100644 --- a/src/mds/MDSMap.h +++ b/src/mds/MDSMap.h @@ -52,7 +52,7 @@ using namespace std; class MDSMap { - public: +public: // mds states /* static const int STATE_DNE = CEPH_MDS_STATE_DNE; // down, never existed. @@ -116,10 +116,9 @@ class MDSMap { ::decode(standby_for_name, bl); } }; - WRITE_CLASS_ENCODER(mds_info_t) - protected: +protected: // base map epoch_t epoch; epoch_t client_epoch; // incremented only when change is significant to client. @@ -131,6 +130,10 @@ class MDSMap { __u32 session_timeout; __u32 session_autoclose; + + vector<__u32> data_pg_pools; // file data pg_pools available to clients (via an ioctl). first is the default. + __u32 cas_pg_pool; // where CAS objects go + __u32 metadata_pg_pool; // where fs metadata objects go /* * in: the set of logical mds #'s that define the cluster. this is the set @@ -151,8 +154,9 @@ class MDSMap { friend class MDSMonitor; - public: - MDSMap() : epoch(0), client_epoch(0), last_failure(0), tableserver(0), root(0) { +public: + MDSMap() : epoch(0), client_epoch(0), last_failure(0), tableserver(0), root(0), + cas_pg_pool(0), metadata_pg_pool(0) { // hack.. this doesn't really belong here session_timeout = (int)g_conf.mds_session_timeout; session_autoclose = (int)g_conf.mds_session_autoclose; @@ -178,6 +182,10 @@ class MDSMap { int get_tableserver() const { return tableserver; } int get_root() const { return root; } + const vector<__u32> &get_data_pg_pools() const { return data_pg_pools; } + __u32 get_data_pg_pool() const { return data_pg_pools[0]; } + __u32 get_cas_pg_pool() const { return cas_pg_pool; } + __u32 get_metadata_pg_pool() const { return metadata_pg_pool; } // counts unsigned get_num_mds() { @@ -363,8 +371,11 @@ class MDSMap { ::encode(session_autoclose, bl); ::encode(max_mds, bl); ::encode(mds_info, bl); + ::encode(data_pg_pools, bl); + ::encode(cas_pg_pool, bl); // kclient ignores everything from here + ::encode(metadata_pg_pool, bl); ::encode(created, bl); ::encode(modified, bl); ::encode(tableserver, bl); @@ -383,8 +394,11 @@ class MDSMap { ::decode(session_autoclose, p); ::decode(max_mds, p); ::decode(mds_info, p); + ::decode(data_pg_pools, p); + ::decode(cas_pg_pool, p); // kclient ignores everything from here + ::decode(metadata_pg_pool, p); ::decode(created, p); ::decode(modified, p); ::decode(tableserver, p); diff --git a/src/mds/MDSTable.cc b/src/mds/MDSTable.cc index 8aa9687687725..ff80fcb38f58c 100644 --- a/src/mds/MDSTable.cc +++ b/src/mds/MDSTable.cc @@ -63,9 +63,11 @@ void MDSTable::save(Context *onfinish, version_t v) // write (async) SnapContext snapc; object_t oid(ino, 0); - mds->objecter->write_full(oid, - mds->objecter->osdmap->file_to_object_layout(oid, - g_default_mds_dir_layout), + OSDMap *osdmap = mds->objecter->osdmap; + ceph_object_layout ol = osdmap->make_object_layout(oid, + mds->mdsmap->get_metadata_pg_pool()); + + mds->objecter->write_full(oid, ol, snapc, bl, g_clock.now(), 0, NULL, new C_MT_Save(this, version)); @@ -120,11 +122,10 @@ void MDSTable::load(Context *onfinish) C_MT_Load *c = new C_MT_Load(this, onfinish); object_t oid(ino, 0); - mds->objecter->read(oid, - mds->objecter->osdmap->file_to_object_layout(oid, - g_default_mds_dir_layout), - 0, 0, // whole object - &c->bl, 0, c); + OSDMap *osdmap = mds->objecter->osdmap; + ceph_object_layout ol = osdmap->make_object_layout(oid, + mds->mdsmap->get_metadata_pg_pool()); + mds->objecter->read_full(oid, ol, &c->bl, 0, c); } void MDSTable::load_2(int r, bufferlist& bl, Context *onfinish) diff --git a/src/mds/MDSTable.h b/src/mds/MDSTable.h index 45709a5c07e50..9d92be02be16d 100644 --- a/src/mds/MDSTable.h +++ b/src/mds/MDSTable.h @@ -28,7 +28,6 @@ class MDSTable { const char *table_name; inodeno_t ino; - ceph_file_layout layout; static const int STATE_UNDEF = 0; static const int STATE_OPENING = 1; diff --git a/src/mds/Server.cc b/src/mds/Server.cc index cf2b3a54debcb..23f06732f07e1 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -1370,7 +1370,10 @@ CInode* Server::prepare_new_inode(MDRequest *mdr, CDir *dir, inodeno_t useino) in->inode.version = 1; in->inode.nlink = 1; // FIXME - in->inode.layout = g_default_file_layout; + if (in->inode.is_dir()) + in->inode.layout = mds->mdcache->default_dir_layout; + else + in->inode.layout = mds->mdcache->default_file_layout; in->inode.truncate_size = -1ull; // not truncated, yet! @@ -2602,7 +2605,6 @@ void Server::handle_client_mkdir(MDRequest *mdr) newi->inode.mode = req->head.args.mkdir.mode; newi->inode.mode &= ~S_IFMT; newi->inode.mode |= S_IFDIR; - newi->inode.layout = g_default_mds_dir_layout; newi->inode.version = dn->pre_dirty(); newi->inode.rstat.rsubdirs = 1; diff --git a/src/mds/SessionMap.cc b/src/mds/SessionMap.cc index 86721c02492ad..13be59b354e19 100644 --- a/src/mds/SessionMap.cc +++ b/src/mds/SessionMap.cc @@ -13,6 +13,7 @@ */ #include "MDS.h" +#include "MDCache.h" #include "SessionMap.h" #include "osdc/Filer.h" @@ -25,12 +26,9 @@ void SessionMap::init_inode() { - memset(&inode, 0, sizeof(inode)); - inode.ino = MDS_INO_SESSIONMAP_OFFSET + mds->get_nodeid(); - inode.layout = g_default_file_layout; + ino = MDS_INO_SESSIONMAP_OFFSET + mds->get_nodeid(); } - void SessionMap::dump() { hash H; @@ -65,14 +63,11 @@ void SessionMap::load(Context *onload) waiting_for_load.push_back(onload); C_SM_Load *c = new C_SM_Load(this); - object_t oid(inode.ino, 0); - mds->objecter->read(oid, - mds->objecter->osdmap->file_to_object_layout(oid, - g_default_mds_dir_layout), - 0, 0, // whole object - &c->bl, 0, - c); - + object_t oid(ino, 0); + OSDMap *osdmap = mds->objecter->osdmap; + ceph_object_layout ol = osdmap->make_object_layout(oid, + mds->mdsmap->get_metadata_pg_pool()); + mds->objecter->read_full(oid, ol, &c->bl, 0, c); } void SessionMap::_load_finish(bufferlist &bl) @@ -120,10 +115,12 @@ void SessionMap::save(Context *onsave, version_t needv) encode(bl); committing = version; SnapContext snapc; - object_t oid(inode.ino, 0); - mds->objecter->write_full(oid, - mds->objecter->osdmap->file_to_object_layout(oid, - g_default_mds_dir_layout), + object_t oid(ino, 0); + OSDMap *osdmap = mds->objecter->osdmap; + ceph_object_layout ol = osdmap->make_object_layout(oid, + mds->mdsmap->get_metadata_pg_pool()); + + mds->objecter->write_full(oid, ol, snapc, bl, g_clock.now(), 0, NULL, new C_SM_Save(this, version)); diff --git a/src/mds/SessionMap.h b/src/mds/SessionMap.h index bff1d290d79b4..ff7ebafc73e53 100644 --- a/src/mds/SessionMap.h +++ b/src/mds/SessionMap.h @@ -275,7 +275,7 @@ public: } // -- loading, saving -- - inode_t inode; + inodeno_t ino; list waiting_for_load; void encode(bufferlist& bl); diff --git a/src/mds/SnapServer.cc b/src/mds/SnapServer.cc index e9ab10f9bc1cc..a7782dbb08cbe 100644 --- a/src/mds/SnapServer.cc +++ b/src/mds/SnapServer.cc @@ -32,7 +32,6 @@ void SnapServer::init_inode() { ino = MDS_INO_SNAPTABLE; - layout = g_default_file_layout; } void SnapServer::reset_state() diff --git a/src/mon/MDSMonitor.cc b/src/mon/MDSMonitor.cc index 0964e359c80a9..4488180b92d62 100644 --- a/src/mon/MDSMonitor.cc +++ b/src/mon/MDSMonitor.cc @@ -62,6 +62,9 @@ void MDSMonitor::create_initial(bufferlist& bl) dout(10) << "create_initial" << dendl; pending_mdsmap.max_mds = 1; pending_mdsmap.created = g_clock.now(); + pending_mdsmap.data_pg_pools.push_back(CEPH_DATA_RULE); + pending_mdsmap.metadata_pg_pool = CEPH_METADATA_RULE; + pending_mdsmap.cas_pg_pool = CEPH_CASDATA_RULE; print_map(pending_mdsmap); } diff --git a/src/osdc/Objecter.h b/src/osdc/Objecter.h index 29e9d9617cad4..10d0fe2876b11 100644 --- a/src/osdc/Objecter.h +++ b/src/osdc/Objecter.h @@ -345,7 +345,11 @@ class Objecter { ops[0].length = len; return read(oid, ol, ops, pbl, 0, flags, onfinish); } - + tid_t read_full(object_t oid, ceph_object_layout ol, + bufferlist *pbl, int flags, + Context *onfinish) { + return read(oid, ol, 0, 0, pbl, flags, onfinish); + } tid_t mutate(object_t oid, ceph_object_layout ol, ObjectMutation& mutation, -- 2.39.5