summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSage Weil <sage@inktank.com>2013-09-16 22:51:29 -0700
committerSage Weil <sage@inktank.com>2013-09-17 06:27:35 -0700
commit7f1e521879e46cc77c773441a9a5731832c267ca (patch)
tree07333bb46e81036f48dd7debd3bc18db21a75b25
parent996bb9b2998c39d2fbc838e4854f40f69617af22 (diff)
downloadceph-7f1e521879e46cc77c773441a9a5731832c267ca.tar.gz
client: add migrate helper
-rw-r--r--src/client/Client.cc51
-rw-r--r--src/client/Client.h3
2 files changed, 54 insertions, 0 deletions
diff --git a/src/client/Client.cc b/src/client/Client.cc
index f4b7871b64f..f48862d9ca1 100644
--- a/src/client/Client.cc
+++ b/src/client/Client.cc
@@ -5666,6 +5666,57 @@ void Client::unlock_fh_pos(Fh *f)
f->pos_locked = false;
}
+int Client::migration_inline_data(Inode *in)
+{
+ ObjectOperation ops;
+ bufferlist inline_version_bl;
+ ::encode(in->inline_version, inline_version_bl);
+ ops.cmpxattr("inline_version",
+ CEPH_OSD_CMPXATTR_OP_GT,
+ CEPH_OSD_CMPXATTR_MODE_U64,
+ CEPH_OSD_OP_FLAG_NOENTOK,
+ inline_version_bl);
+ bufferlist inline_data = in->inline_data;
+ ops.write(0, inline_data, in->truncate_size, in->truncate_seq);
+ ops.setxattr("inline_version", inline_version_bl);
+
+ char oid_buf[32];
+ snprintf(oid_buf, sizeof(oid_buf), "%llx.00000000", (long long unsigned)in->ino);
+ object_t oid = oid_buf;
+
+ Mutex flock("Client::migration_inline_data flock");
+ Cond cond;
+ bool done = false;
+ int ret;
+ Context *oncommit = new C_SafeCond(&flock, &cond, &done, &ret);
+
+ objecter->mutate(oid,
+ OSDMap::file_to_object_locator(in->layout),
+ ops,
+ in->snaprealm->get_snap_context(),
+ ceph_clock_now(cct),
+ 0,
+ NULL,
+ oncommit);
+
+ client_lock.Unlock();
+ flock.Lock();
+ while (!done)
+ cond.Wait(flock);
+ flock.Unlock();
+ client_lock.Lock();
+
+ if (ret >= 0 || ret == -ECANCELED) {
+ in->inline_data.clear();
+ in->inline_version = CEPH_INLINE_DISABLED;
+ mark_caps_dirty(in, CEPH_CAP_FILE_WR);
+ check_caps(in, false);
+
+ ret = 0;
+ }
+
+ return ret;
+}
//
diff --git a/src/client/Client.h b/src/client/Client.h
index 94002d1ece4..5fc05f46d7a 100644
--- a/src/client/Client.h
+++ b/src/client/Client.h
@@ -420,6 +420,9 @@ protected:
void handle_lease(MClientLease *m);
+ // inline data
+ int migration_inline_data(Inode *in);
+
// file caps
void check_cap_issue(Inode *in, Cap *cap, unsigned issued);
void add_update_cap(Inode *in, MetaSession *session, uint64_t cap_id,