From 73f4d1c4e5f0105d692b6566d1efb64b7f18ade4 Mon Sep 17 00:00:00 2001 From: anwleung Date: Thu, 1 Mar 2007 02:05:46 +0000 Subject: [PATCH] Stuffs kinda in a weird state...weird extcap compile error...cap caching on client buffer not totally done git-svn-id: https://ceph.svn.sf.net/svnroot/ceph@1141 29311d96-e01e-0410-9327-a35deaab8ce9 --- .../aleung/security1/ceph/client/Client.cc | 7 +++++-- .../aleung/security1/ceph/client/FileCache.cc | 6 +++--- .../aleung/security1/ceph/client/FileCache.h | 5 ++++- .../aleung/security1/ceph/crypto/ExtCap.h | 3 +++ .../aleung/security1/ceph/include/object.h | 2 ++ branches/aleung/security1/ceph/osd/OSD.cc | 19 +++++++++++++++-- branches/aleung/security1/ceph/osdc/Filer.h | 8 +++++-- .../security1/ceph/osdc/ObjectCacher.cc | 21 ++++++++++++------- .../aleung/security1/ceph/osdc/ObjectCacher.h | 21 ++++++++++++++----- .../aleung/security1/ceph/osdc/Objecter.cc | 11 ++++++++-- .../aleung/security1/ceph/osdc/Objecter.h | 7 +++++-- 11 files changed, 83 insertions(+), 27 deletions(-) diff --git a/branches/aleung/security1/ceph/client/Client.cc b/branches/aleung/security1/ceph/client/Client.cc index baa201ad6b400..14ea02c127304 100644 --- a/branches/aleung/security1/ceph/client/Client.cc +++ b/branches/aleung/security1/ceph/client/Client.cc @@ -2784,6 +2784,9 @@ int Client::write(fh_t fh, const char *buf, off_t size, off_t offset, dout(10) << "cur file size is " << in->inode.size << " wr size " << in->file_wr_size << endl; + ExtCap *write_ext_cap = in->get_ext_cap(uid); + assert(write_ext_cap); + // do we have write file cap? while (!lazy && (in->file_caps() & CAP_FILE_WR) == 0) { dout(7) << " don't have write cap, waiting" << endl; @@ -2813,7 +2816,7 @@ int Client::write(fh_t fh, const char *buf, off_t size, off_t offset, assert(objectcacher); // write (this may block!) - in->fc.write(offset, size, blist, client_lock); + in->fc.write(offset, size, blist, client_lock, write_ext_cap); } else { // legacy, inconsistent synchronous write. @@ -2830,7 +2833,7 @@ int Client::write(fh_t fh, const char *buf, off_t size, off_t offset, dout(20) << " sync write start " << onfinish << endl; filer->write(in->inode, offset, size, blist, 0, - onfinish, onsafe + onfinish, onsafe, write_ext_cap //, 1+((int)g_clock.now()) / 10 //f->pos // hack hack test osd revision snapshots ); diff --git a/branches/aleung/security1/ceph/client/FileCache.cc b/branches/aleung/security1/ceph/client/FileCache.cc index 3c2d752d01fe6..2465c0206c8ef 100644 --- a/branches/aleung/security1/ceph/client/FileCache.cc +++ b/branches/aleung/security1/ceph/client/FileCache.cc @@ -136,7 +136,7 @@ int FileCache::read(off_t offset, size_t size, bufferlist& blist, Mutex& client_ return r; } -void FileCache::write(off_t offset, size_t size, bufferlist& blist, Mutex& client_lock) +void FileCache::write(off_t offset, size_t size, bufferlist& blist, Mutex& client_lock, ExtCap *write_ext_cap) { // inc writing counter num_writing++; @@ -146,10 +146,10 @@ void FileCache::write(off_t offset, size_t size, bufferlist& blist, Mutex& clien oc->wait_for_write(size, client_lock); // async, caching, non-blocking. - oc->file_write(inode, offset, size, blist); + oc->file_write(inode, offset, size, blist, write_ext_cap); } else { // atomic, synchronous, blocking. - oc->file_atomic_sync_write(inode, offset, size, blist, client_lock); + oc->file_atomic_sync_write(inode, offset, size, blist, client_lock, write_ext_cap); } // dec writing counter diff --git a/branches/aleung/security1/ceph/client/FileCache.h b/branches/aleung/security1/ceph/client/FileCache.h index 65da0ff2960ab..4d53c2e9e112f 100644 --- a/branches/aleung/security1/ceph/client/FileCache.h +++ b/branches/aleung/security1/ceph/client/FileCache.h @@ -7,6 +7,8 @@ using namespace std; #include "common/Cond.h" #include "mds/Capability.h" +#include "crypto/CryptoLib.h" +using namespace CryptoLib; #include "crypto/ExtCap.h" class ObjectCacher; @@ -60,7 +62,8 @@ class FileCache { int read(off_t offset, size_t size, bufferlist& blist, Mutex& client_lock, ExtCap *read_ext_cap=0); // may block. - void write(off_t offset, size_t size, bufferlist& blist, Mutex& client_lock); // may block. + void write(off_t offset, size_t size, bufferlist& blist, Mutex& client_lock, + ExtCap *write_ext_cap=0); // may block. }; diff --git a/branches/aleung/security1/ceph/crypto/ExtCap.h b/branches/aleung/security1/ceph/crypto/ExtCap.h index 505ab915fa137..1d53dbc3e2927 100644 --- a/branches/aleung/security1/ceph/crypto/ExtCap.h +++ b/branches/aleung/security1/ceph/crypto/ExtCap.h @@ -14,6 +14,7 @@ #ifndef __EXTCAP_H #define __EXTCAP_H +#include "include/types.h" #include "include/buffer.h" #include "mds/Capability.h" @@ -22,6 +23,8 @@ using namespace std; #include "crypto/CryptoLib.h" using namespace CryptoLib; +#include "common/Clock.h" + class ExtCap { private: struct cap_data_t { diff --git a/branches/aleung/security1/ceph/include/object.h b/branches/aleung/security1/ceph/include/object.h index 3a66c4ab83d54..4221ee81a66e6 100644 --- a/branches/aleung/security1/ceph/include/object.h +++ b/branches/aleung/security1/ceph/include/object.h @@ -18,6 +18,8 @@ #include using namespace std; +#include "crypto/ExtCap.h" + typedef __uint32_t objectrev_t; diff --git a/branches/aleung/security1/ceph/osd/OSD.cc b/branches/aleung/security1/ceph/osd/OSD.cc index ea443da6e4ad0..d9058101b13d0 100644 --- a/branches/aleung/security1/ceph/osd/OSD.cc +++ b/branches/aleung/security1/ceph/osd/OSD.cc @@ -2858,6 +2858,16 @@ void OSD::op_read(MOSDOp *op)//, PG *pg) //<< " in " << *pg << endl; + // verify the capability + ExtCap *op_capability = op->get_capability(); + if (op_capability) { + cout << "OSD recieved a capability" << endl; + if (op_capability->verif_extcap(monmap->get_key())) + cout << "OSD successfully verified capability" << endl; + else + cout << "OSD failed to verify capability" << endl; + } + long r = 0; bufferlist bl; @@ -3202,13 +3212,18 @@ void OSD::op_modify(MOSDOp *op, PG *pg) // check for capability ExtCap *op_capability = op->get_capability(); - if (op_capability) { - cout << "OSD recieved a capability" << endl; + if (op_capability && op->get_op() == OSD_OP_WRITE) { + cout << "OSD recieved a write with a capability" << endl; if (op_capability->verif_extcap(monmap->get_key())) cout << "OSD successfully verified capability" << endl; else cout << "OSD failed to verify capability" << endl; } + else if (op->get_op() == OSD_OP_WRITE) { + cout << "Received write with no capability" << endl; + } + else + cout << "Received " << opname << " with no capability" << endl; // locked by someone else? // for _any_ op type -- eg only the locker can unlock! diff --git a/branches/aleung/security1/ceph/osdc/Filer.h b/branches/aleung/security1/ceph/osdc/Filer.h index f0268983ec724..3791569fb4488 100644 --- a/branches/aleung/security1/ceph/osdc/Filer.h +++ b/branches/aleung/security1/ceph/osdc/Filer.h @@ -102,9 +102,13 @@ class Filer { bufferlist& bl, int flags, Context *onack, - Context *oncommit, + Context *oncommit, ExtCap* write_cap=0, objectrev_t rev=0) { - Objecter::OSDWrite *wr = new Objecter::OSDWrite(bl); + Objecter::OSDWrite *wr; + if (!write_cap) // we should always pass a cap + wr = new Objecter::OSDWrite(bl); + else + wr = new Objecter::OSDWrite(bl, write_cap); file_to_extents(inode, offset, len, wr->extents, rev); return objecter->modifyx(wr, onack, oncommit) > 0 ? 0:-1; } diff --git a/branches/aleung/security1/ceph/osdc/ObjectCacher.cc b/branches/aleung/security1/ceph/osdc/ObjectCacher.cc index b2ed150b731bd..8e1f0c0176a45 100644 --- a/branches/aleung/security1/ceph/osdc/ObjectCacher.cc +++ b/branches/aleung/security1/ceph/osdc/ObjectCacher.cc @@ -356,7 +356,7 @@ ObjectCacher::BufferHead *ObjectCacher::Object::map_write(Objecter::OSDWrite *wr left -= glen; continue; // more? } - } +s } } // set versoin @@ -454,7 +454,7 @@ void ObjectCacher::bh_read_finish(object_t oid, off_t start, size_t length, buff } -void ObjectCacher::bh_write(BufferHead *bh) +void ObjectCacher::bh_write(BufferHead *bh, ExtCap *write_cap) { dout(7) << "bh_write " << *bh << endl; @@ -464,7 +464,7 @@ void ObjectCacher::bh_write(BufferHead *bh) // go tid_t tid = objecter->write(bh->ob->get_oid(), bh->start(), bh->length(), bh->bl, - onack, oncommit); + onack, oncommit, write_cap); // set bh last_write_tid onack->tid = tid; @@ -824,6 +824,7 @@ int ObjectCacher::writex(Objecter::OSDWrite *wr, inodeno_t ino) { utime_t now = g_clock.now(); + // grab all objects in the extent for (list::iterator ex_it = wr->extents.begin(); ex_it != wr->extents.end(); ex_it++) { @@ -832,7 +833,9 @@ int ObjectCacher::writex(Objecter::OSDWrite *wr, inodeno_t ino) // map it all into a single bufferhead. BufferHead *bh = o->map_write(wr); - + // set security cap in bh + bh->bh_cap = wr->modify_cap; + // adjust buffer pointers (ie "copy" data into my cache) // this is over a single ObjectExtent, so we know that // - there is one contiguous bh @@ -863,7 +866,7 @@ int ObjectCacher::writex(Objecter::OSDWrite *wr, inodeno_t ino) map::iterator p = o->data.find(bh->start()); if (p != o->data.begin()) { p--; - if (p->second->is_dirty()) { + if (p->second->is_dirty() && p->second->bh_cap == bh->bh_cap) { o->merge_left(p->second,bh); bh = p->second; } @@ -872,7 +875,8 @@ int ObjectCacher::writex(Objecter::OSDWrite *wr, inodeno_t ino) p = o->data.find(bh->start()); p++; if (p != o->data.end() && - p->second->is_dirty()) + p->second->is_dirty() && + p->second->bh_cap == bh->bh_cap) o->merge_left(p->second,bh); } @@ -1270,8 +1274,9 @@ bool ObjectCacher::flush(Object *ob) continue; } if (!bh->is_dirty()) continue; - - bh_write(bh); + // get capability for write back + ExtCap *write_cap = ob->ocap; + bh_write(bh, write_cap); clean = false; } return clean; diff --git a/branches/aleung/security1/ceph/osdc/ObjectCacher.h b/branches/aleung/security1/ceph/osdc/ObjectCacher.h index 32c3e0e45b53b..f97294c7df529 100644 --- a/branches/aleung/security1/ceph/osdc/ObjectCacher.h +++ b/branches/aleung/security1/ceph/osdc/ObjectCacher.h @@ -23,6 +23,10 @@ #include "Objecter.h" #include "Filer.h" +//#include "crypto/CryptoLib.h" +//using namespace CryptoLib; +//#include "crypto/ExtCap.h" + class Objecter; class Objecter::OSDRead; class Objecter::OSDWrite; @@ -55,6 +59,9 @@ class ObjectCacher { bufferlist bl; tid_t last_write_tid; // version of bh (if non-zero) utime_t last_write; + + // security cap + ExtCap *bh_cap; map< off_t, list > waitfor_read; @@ -110,7 +117,7 @@ class ObjectCacher { ObjectCacher *oc; object_t oid; // this _always_ is oid.rev=0 inodeno_t ino; - objectrev_t rev; // last rev we're written + objectrev_t rev; // last rev we're written public: map data; @@ -344,7 +351,7 @@ class ObjectCacher { // io void bh_read(BufferHead *bh, ExtCap* read_ext_cap=0); - void bh_write(BufferHead *bh); + void bh_write(BufferHead *bh, ExtCap *write_cap=0); void trim(off_t max=-1); void flush(off_t amount=0); @@ -493,9 +500,13 @@ class ObjectCacher { int file_write(inode_t& inode, off_t offset, size_t len, - bufferlist& bl, + bufferlist& bl, ExtCap *write_ext_cap, objectrev_t rev=0) { - Objecter::OSDWrite *wr = new Objecter::OSDWrite(bl); + Objecter::OSDWrite *wr; + if (!write_ext_cap) + wr = new Objecter::OSDWrite(bl); + else + wr = new Objecter::OSDWrite(bl, write_ext_cap); filer.file_to_extents(inode, offset, len, wr->extents); return writex(wr, inode.ino); } @@ -520,7 +531,7 @@ class ObjectCacher { int file_atomic_sync_write(inode_t& inode, off_t offset, size_t len, bufferlist& bl, - Mutex &lock, + Mutex &lock, ExtCap *write_ext_cap=0, objectrev_t rev=0) { Objecter::OSDWrite *wr = new Objecter::OSDWrite(bl); filer.file_to_extents(inode, offset, len, wr->extents); diff --git a/branches/aleung/security1/ceph/osdc/Objecter.cc b/branches/aleung/security1/ceph/osdc/Objecter.cc index 1f61a7f38aa98..0fe970fee9c25 100644 --- a/branches/aleung/security1/ceph/osdc/Objecter.cc +++ b/branches/aleung/security1/ceph/osdc/Objecter.cc @@ -586,9 +586,13 @@ void Objecter::handle_osd_read_reply(MOSDOpReply *m) tid_t Objecter::write(object_t oid, off_t off, size_t len, bufferlist &bl, Context *onack, Context *oncommit, - objectrev_t rev) + ExtCap *write_ext_cap, objectrev_t rev) { - OSDWrite *wr = new OSDWrite(bl); + OSDWrite *wr; + if (write_ext_cap) + wr = new OSDWrite(bl, write_ext_cap); + else + wr = new OSDWrite(bl); wr->extents.push_back(ObjectExtent(oid, off, len)); wr->extents.front().pgid = osdmap->object_to_pg( oid, g_OSD_FileLayout ); wr->extents.front().buffer_extents[0] = len; @@ -662,6 +666,9 @@ tid_t Objecter::modifyx_submit(OSDModify *wr, ObjectExtent &ex, tid_t usetid) m->set_length(ex.length); m->set_offset(ex.start); m->set_rev(ex.rev); + // only cap for a write, fix later + if (wr->modify_cap && wr->op == OSD_OP_WRITE) + m->set_capability(wr->modify_cap); if (wr->tid_version.count(tid)) m->set_version(wr->tid_version[tid]); // we're replaying this op! diff --git a/branches/aleung/security1/ceph/osdc/Objecter.h b/branches/aleung/security1/ceph/osdc/Objecter.h index 4f79d1f2642ae..fdb5ba4e21fab 100644 --- a/branches/aleung/security1/ceph/osdc/Objecter.h +++ b/branches/aleung/security1/ceph/osdc/Objecter.h @@ -85,8 +85,10 @@ class Objecter { map waitfor_ack; map tid_version; map waitfor_commit; + ExtCap *modify_cap; OSDModify(int o) : op(o), onack(0), oncommit(0) {} + OSDModify(int o, ExtCap* cap) : op(o), onack(0), oncommit(0), modify_cap(cap) {} }; // write (includes the bufferlist) @@ -94,6 +96,7 @@ class Objecter { public: bufferlist bl; OSDWrite(bufferlist &b) : OSDModify(OSD_OP_WRITE), bl(b) {} + OSDWrite(bufferlist &b, ExtCap *write_cap) : OSDModify(OSD_OP_WRITE, write_cap), bl(b) {} }; @@ -186,10 +189,10 @@ class Objecter { // even lazier tid_t read(object_t oid, off_t off, size_t len, bufferlist *bl, - Context *onfinish, ExtCap* read_ext_cap=0, + Context *onfinish, ExtCap *read_ext_cap=0, objectrev_t rev=0); tid_t write(object_t oid, off_t off, size_t len, bufferlist &bl, - Context *onack, Context *oncommit, + Context *onack, Context *oncommit, ExtCap *write_ext_cap=0, objectrev_t rev=0); tid_t zero(object_t oid, off_t off, size_t len, Context *onack, Context *oncommit, -- 2.39.5