]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
Stuffs kinda in a weird state...weird extcap compile error...cap caching
authoranwleung <anwleung@29311d96-e01e-0410-9327-a35deaab8ce9>
Thu, 1 Mar 2007 02:05:46 +0000 (02:05 +0000)
committeranwleung <anwleung@29311d96-e01e-0410-9327-a35deaab8ce9>
Thu, 1 Mar 2007 02:05:46 +0000 (02:05 +0000)
on client buffer not totally done

git-svn-id: https://ceph.svn.sf.net/svnroot/ceph@1141 29311d96-e01e-0410-9327-a35deaab8ce9

branches/aleung/security1/ceph/client/Client.cc
branches/aleung/security1/ceph/client/FileCache.cc
branches/aleung/security1/ceph/client/FileCache.h
branches/aleung/security1/ceph/crypto/ExtCap.h
branches/aleung/security1/ceph/include/object.h
branches/aleung/security1/ceph/osd/OSD.cc
branches/aleung/security1/ceph/osdc/Filer.h
branches/aleung/security1/ceph/osdc/ObjectCacher.cc
branches/aleung/security1/ceph/osdc/ObjectCacher.h
branches/aleung/security1/ceph/osdc/Objecter.cc
branches/aleung/security1/ceph/osdc/Objecter.h

index baa201ad6b400b3f78a16433657ddd1c1acb0c00..14ea02c12730418ee557ad3653438a98e19b743e 100644 (file)
@@ -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
                 ); 
     
index 3c2d752d01fe615dc0b478167125fbace5daf5c8..2465c0206c8efca670ad2df377e0b0f203595972 100644 (file)
@@ -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
index 65da0ff2960abeef5a9ad1444683e6b06575d86e..4d53c2e9e112fe2e112f026d804b0856c9ddec2a 100644 (file)
@@ -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.
 
 };
 
index 505ab915fa13769d71fb0ce6c0af73ea073daecf..1d53dbc3e2927be7fd436e2381c4e797b824c295 100644 (file)
@@ -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 {
index 3a66c4ab83d540440a6a21a6e353c1ec2bf31299..4221ee81a66e6e4f169d89c4ec7aeb5325eaca8c 100644 (file)
@@ -18,6 +18,8 @@
 #include <iomanip>
 using namespace std;
 
+#include "crypto/ExtCap.h"
+
 
 typedef __uint32_t objectrev_t;
 
index ea443da6e4ad082d0f1fc5525b0a53d027c4545e..d9058101b13d0a650425851dce0cc3aaa6194a67 100644 (file)
@@ -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!
index f0268983ec7243d155b47bc0456d7d51f249a7fb..3791569fb4488ed51ed2e75ccd1c1a93f7341ab0 100644 (file)
@@ -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;
   }
index b2ed150b731bddfa4165cb9aae68259768a9d2f1..8e1f0c0176a4501f2770f9890699341b91067e7d 100644 (file)
@@ -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<ObjectExtent>::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<off_t,BufferHead*>::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;
index 32c3e0e45b53bd64f08d0770d8c837402375cad8..f97294c7df529bf136aa51c38695bff5acbb6622 100644 (file)
 #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<Context*> > 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<off_t, BufferHead*>     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);
index 1f61a7f38aa9848cbba80d5cf64a867f688b5ee5..0fe970fee9c253f2bfe981c9b4c6727712bcd60f 100644 (file)
@@ -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!
index 4f79d1f2642ae69c3fd3f1d8cac89d77ced3c258..fdb5ba4e21fab6b8850f04d33cc5b8595c344f65 100644 (file)
@@ -85,8 +85,10 @@ class Objecter {
     map<tid_t, ObjectExtent> waitfor_ack;
     map<tid_t, eversion_t>   tid_version;
     map<tid_t, ObjectExtent> 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, ExtCapread_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,