#define CEPH_FEATURE_MSG_AUTH (1<<23)
#define CEPH_FEATURE_RECOVERY_RESERVATION (1<<24)
#define CEPH_FEATURE_CRUSH_TUNABLES2 (1<<25)
+#define CEPH_FEATURE_CREATEPOOLID (1<<26)
/*
* Features supported. Should be everything above.
CEPH_FEATURE_BACKFILL_RESERVATION | \
CEPH_FEATURE_MSG_AUTH | \
CEPH_FEATURE_RECOVERY_RESERVATION | \
- CEPH_FEATURE_CRUSH_TUNABLES2)
+ CEPH_FEATURE_CRUSH_TUNABLES2 | \
+ CEPH_FEATURE_CREATEPOOLID)
#define CEPH_FEATURES_SUPPORTED_DEFAULT CEPH_FEATURES_ALL
__le32 stripe_unit; /* layout for newly created file */
__le32 stripe_count; /* ... */
__le32 object_size;
- __le32 file_replication;
+ __le32 pool; /* if >= 0 and CREATEPOOLID feature */
__le32 unused; /* used to be preferred */
__le64 old_size; /* if O_TRUNC */
} __attribute__ ((packed)) open;
int64_t get_data_pg_pool() const { return data_pg_pools[0]; }
int64_t get_cas_pg_pool() const { return cas_pg_pool; }
int64_t get_metadata_pg_pool() const { return metadata_pg_pool; }
+ bool is_data_pg_pool(int64_t poolid) const {
+ return std::find(data_pg_pools.begin(), data_pg_pools.end(), poolid) != data_pg_pools.end();
+ }
const map<uint64_t,mds_info_t>& get_mds_info() { return mds_info; }
const mds_info_t& get_mds_info_gid(uint64_t gid) {
#include "common/Timer.h"
#include "common/perf_counters.h"
#include "include/compat.h"
+#include "osd/OSDMap.h"
#include <errno.h>
#include <fcntl.h>
layout.fl_stripe_count = req->head.args.open.stripe_count;
if (req->head.args.open.object_size)
layout.fl_object_size = req->head.args.open.object_size;
+ if (req->get_connection()->has_feature(CEPH_FEATURE_CREATEPOOLID) &&
+ (__s32)req->head.args.open.pool >= 0)
+ layout.fl_pg_pool = req->head.args.open.pool;
if (!ceph_file_layout_is_valid(&layout)) {
dout(10) << " invalid initial file layout" << dendl;
reply_request(mdr, -EINVAL);
return;
}
-
+ if (!mds->osdmap->have_pg_pool(layout.fl_pg_pool) ||
+ !mds->mdsmap->is_data_pg_pool(layout.fl_pg_pool)) {
+ dout(10) << " invalid data pool " << layout.fl_pg_pool << dendl;
+ reply_request(mdr, -EINVAL);
+ return;
+ }
CInode *diri = dn->get_dir()->get_inode();
rdlocks.insert(&diri->authlock);