string value (bl.c_str(), bl.length());
dout(10) << "handle_set_vxattr " << name << " val " << value.length() << " bytes on " << *cur << dendl;
- // layout or quota
- if (name.find("ceph.file.layout") == 0 ||
- name.find("ceph.dir.layout") == 0 ||
- name.find("ceph.quota") == 0) {
- inode_t *pi = NULL;
- string rest;
- if (name.find("ceph.dir.layout") == 0) {
- if (!cur->is_dir()) {
- respond_to_request(mdr, -EINVAL);
- return;
- }
+ inode_t *pi = NULL;
+ string rest;
- ceph_file_layout layout;
- if (cur->get_projected_inode()->has_layout())
- layout = cur->get_projected_inode()->layout;
- else if (dir_layout)
- layout = *dir_layout;
- else
- layout = mdcache->default_file_layout;
-
- rest = name.substr(name.find("layout"));
- const OSDMap *osdmap = mds->objecter->get_osdmap_read();
- int r = parse_layout_vxattr(rest, value, osdmap, &layout);
- epoch_t epoch = osdmap->get_epoch();
- mds->objecter->put_osdmap_read();
- if (r < 0) {
- if (r == -ENOENT) {
- epoch_t req_epoch = req->get_osdmap_epoch();
- if (req_epoch > epoch) {
- if (!mds->objecter->wait_for_map(req_epoch,
- new C_OnFinisher(new C_IO_Wrapper(mds, new C_MDS_RetryRequest(mdcache, mdr)), mds->finisher)))
- return;
- } else if (req_epoch == 0 && !mdr->waited_for_osdmap) {
- // For compatibility with client w/ old code, we still need get the latest map.
- // One day if COMPACT_VERSION of MClientRequest >=3, we can remove those code.
- mdr->waited_for_osdmap = true;
- mds->objecter->wait_for_latest_osdmap(
- new C_OnFinisher(new C_IO_Wrapper(mds, new C_MDS_RetryRequest(mdcache, mdr)), mds->finisher));
- return;
- }
- r = -EINVAL;
- }
- respond_to_request(mdr, r);
- return;
- }
+ if (name.compare(0, 15, "ceph.dir.layout") == 0) {
+ if (!cur->is_dir()) {
+ respond_to_request(mdr, -EINVAL);
+ return;
+ }
- xlocks.insert(&cur->policylock);
- if (!mds->locker->acquire_locks(mdr, rdlocks, wrlocks, xlocks))
- return;
+ ceph_file_layout layout;
+ if (cur->get_projected_inode()->has_layout())
+ layout = cur->get_projected_inode()->layout;
+ else if (dir_layout)
+ layout = *dir_layout;
+ else
+ layout = mdcache->default_file_layout;
- if (cur->inode.layout.fl_pg_pool != layout.fl_pg_pool) {
- if (!check_access(mdr, cur, MAY_SET_POOL)) {
+ rest = name.substr(name.find("layout"));
+ const OSDMap *osdmap = mds->objecter->get_osdmap_read();
+ int r = parse_layout_vxattr(rest, value, osdmap, &layout);
+ epoch_t epoch = osdmap->get_epoch();
+ mds->objecter->put_osdmap_read();
+ if (r < 0) {
+ if (r == -ENOENT) {
+ epoch_t req_epoch = req->get_osdmap_epoch();
+ if (req_epoch > epoch) {
+ if (!mds->objecter->wait_for_map(req_epoch,
+ new C_OnFinisher(new C_IO_Wrapper(mds, new C_MDS_RetryRequest(mdcache, mdr)), mds->finisher)))
+ return;
+ } else if (req_epoch == 0 && !mdr->waited_for_osdmap) {
+ // For compatibility with client w/ old code, we still need get the latest map.
+ // One day if COMPACT_VERSION of MClientRequest >=3, we can remove those code.
+ mdr->waited_for_osdmap = true;
+ mds->objecter->wait_for_latest_osdmap(
+ new C_OnFinisher(new C_IO_Wrapper(mds, new C_MDS_RetryRequest(mdcache, mdr)), mds->finisher));
return;
}
+ r = -EINVAL;
}
+ respond_to_request(mdr, r);
+ return;
+ }
- pi = cur->project_inode();
- pi->layout = layout;
- } else if (name.find("ceph.file.layout") == 0) {
- if (!cur->is_file()) {
- respond_to_request(mdr, -EINVAL);
- return;
- }
- if (cur->get_projected_inode()->size ||
- cur->get_projected_inode()->truncate_seq > 1) {
- respond_to_request(mdr, -ENOTEMPTY);
- return;
- }
- ceph_file_layout layout = cur->get_projected_inode()->layout;
- rest = name.substr(name.find("layout"));
- const OSDMap *osdmap = mds->objecter->get_osdmap_read();
- int r = parse_layout_vxattr(rest, value, osdmap, &layout);
- epoch_t epoch = osdmap->get_epoch();
- mds->objecter->put_osdmap_read();
- if (r < 0) {
- if (r == -ENOENT) {
- epoch_t req_epoch = req->get_osdmap_epoch();
- if (req_epoch > epoch) {
- if (!mds->objecter->wait_for_map(req_epoch,
- new C_OnFinisher(new C_IO_Wrapper(mds, new C_MDS_RetryRequest(mdcache, mdr)), mds->finisher)))
- return;
- } else if (req_epoch == 0 && !mdr->waited_for_osdmap) {
- // For compatibility with client w/ old code, we still need get the latest map.
- // One day if COMPACT_VERSION of MClientRequest >=3, we can remove those code.
- mdr->waited_for_osdmap = true;
- mds->objecter->wait_for_latest_osdmap(
- new C_OnFinisher(new C_IO_Wrapper(mds, new C_MDS_RetryRequest(mdcache, mdr)), mds->finisher));
- return;
- }
- r = -EINVAL;
- }
- respond_to_request(mdr, r);
- return;
- }
+ xlocks.insert(&cur->policylock);
+ if (!mds->locker->acquire_locks(mdr, rdlocks, wrlocks, xlocks))
+ return;
- xlocks.insert(&cur->filelock);
- if (!mds->locker->acquire_locks(mdr, rdlocks, wrlocks, xlocks))
- return;
+ if (cur->inode.layout.fl_pg_pool != layout.fl_pg_pool) {
+ if (!check_access(mdr, cur, MAY_SET_POOL)) {
+ return;
+ }
+ }
- if (cur->inode.layout.fl_pg_pool != layout.fl_pg_pool) {
- if (!check_access(mdr, cur, MAY_SET_POOL)) {
+ pi = cur->project_inode();
+ pi->layout = layout;
+ } else if (name.compare(0, 16, "ceph.file.layout") == 0) {
+ if (!cur->is_file()) {
+ respond_to_request(mdr, -EINVAL);
+ return;
+ }
+ if (cur->get_projected_inode()->size ||
+ cur->get_projected_inode()->truncate_seq > 1) {
+ respond_to_request(mdr, -ENOTEMPTY);
+ return;
+ }
+ ceph_file_layout layout = cur->get_projected_inode()->layout;
+ rest = name.substr(name.find("layout"));
+ const OSDMap *osdmap = mds->objecter->get_osdmap_read();
+ int r = parse_layout_vxattr(rest, value, osdmap, &layout);
+ epoch_t epoch = osdmap->get_epoch();
+ mds->objecter->put_osdmap_read();
+ if (r < 0) {
+ if (r == -ENOENT) {
+ epoch_t req_epoch = req->get_osdmap_epoch();
+ if (req_epoch > epoch) {
+ if (!mds->objecter->wait_for_map(req_epoch,
+ new C_OnFinisher(new C_IO_Wrapper(mds, new C_MDS_RetryRequest(mdcache, mdr)), mds->finisher)))
+ return;
+ } else if (req_epoch == 0 && !mdr->waited_for_osdmap) {
+ // For compatibility with client w/ old code, we still need get the latest map.
+ // One day if COMPACT_VERSION of MClientRequest >=3, we can remove those code.
+ mdr->waited_for_osdmap = true;
+ mds->objecter->wait_for_latest_osdmap(
+ new C_OnFinisher(new C_IO_Wrapper(mds, new C_MDS_RetryRequest(mdcache, mdr)), mds->finisher));
return;
}
+ r = -EINVAL;
}
+ respond_to_request(mdr, r);
+ return;
+ }
- pi = cur->project_inode();
- int64_t old_pool = pi->layout.fl_pg_pool;
- pi->add_old_pool(old_pool);
- pi->layout = layout;
- pi->ctime = mdr->get_op_stamp();
- } else {
- // expect this to be "ceph.quota"
- if (!cur->is_dir() || cur->is_root()) {
- respond_to_request(mdr, -EINVAL);
- return;
- }
-
- quota_info_t quota = cur->get_projected_inode()->quota;
+ xlocks.insert(&cur->filelock);
+ if (!mds->locker->acquire_locks(mdr, rdlocks, wrlocks, xlocks))
+ return;
- rest = name.substr(name.find("quota"));
- int r = parse_quota_vxattr(rest, value, "a);
- if (r < 0) {
- respond_to_request(mdr, r);
+ if (cur->inode.layout.fl_pg_pool != layout.fl_pg_pool) {
+ if (!check_access(mdr, cur, MAY_SET_POOL)) {
return;
}
+ }
- xlocks.insert(&cur->policylock);
- if (!mds->locker->acquire_locks(mdr, rdlocks, wrlocks, xlocks))
- return;
-
- pi = cur->project_inode();
- pi->quota = quota;
+ pi = cur->project_inode();
+ int64_t old_pool = pi->layout.fl_pg_pool;
+ pi->add_old_pool(old_pool);
+ pi->layout = layout;
+ pi->ctime = mdr->get_op_stamp();
+ } else if (name.compare(0, 10, "ceph.quota") == 0) {
+ if (!cur->is_dir() || cur->is_root()) {
+ respond_to_request(mdr, -EINVAL);
+ return;
}
- pi->version = cur->pre_dirty();
- if (cur->is_file())
- pi->update_backtrace();
+ quota_info_t quota = cur->get_projected_inode()->quota;
- // log + wait
- mdr->ls = mdlog->get_current_segment();
- EUpdate *le = new EUpdate(mdlog, "set vxattr layout");
- mdlog->start_entry(le);
- le->metablob.add_client_req(req->get_reqid(), req->get_oldest_client_tid());
- mdcache->predirty_journal_parents(mdr, &le->metablob, cur, 0, PREDIRTY_PRIMARY);
- mdcache->journal_dirty_inode(mdr.get(), &le->metablob, cur);
+ rest = name.substr(name.find("quota"));
+ int r = parse_quota_vxattr(rest, value, "a);
+ if (r < 0) {
+ respond_to_request(mdr, r);
+ return;
+ }
- journal_and_reply(mdr, cur, 0, le, new C_MDS_inode_update_finish(mds, mdr, cur));
+ xlocks.insert(&cur->policylock);
+ if (!mds->locker->acquire_locks(mdr, rdlocks, wrlocks, xlocks))
+ return;
+
+ pi = cur->project_inode();
+ pi->quota = quota;
+ } else {
+ dout(10) << " unknown vxattr " << name << dendl;
+ respond_to_request(mdr, -EINVAL);
return;
}
- dout(10) << " unknown vxattr " << name << dendl;
- respond_to_request(mdr, -EINVAL);
+ pi->version = cur->pre_dirty();
+ if (cur->is_file())
+ pi->update_backtrace();
+
+ // log + wait
+ mdr->ls = mdlog->get_current_segment();
+ EUpdate *le = new EUpdate(mdlog, "set vxattr layout");
+ mdlog->start_entry(le);
+ le->metablob.add_client_req(req->get_reqid(), req->get_oldest_client_tid());
+ mdcache->predirty_journal_parents(mdr, &le->metablob, cur, 0, PREDIRTY_PRIMARY);
+ mdcache->journal_dirty_inode(mdr.get(), &le->metablob, cur);
+
+ journal_and_reply(mdr, cur, 0, le, new C_MDS_inode_update_finish(mds, mdr, cur));
+ return;
}
void Server::handle_remove_vxattr(MDRequestRef& mdr, CInode *cur,