]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
client: client_oc=0 writes work
authorSage Weil <sage@newdream.net>
Thu, 15 May 2008 17:46:43 +0000 (10:46 -0700)
committerSage Weil <sage@newdream.net>
Thu, 15 May 2008 17:46:43 +0000 (10:46 -0700)
src/client/Client.cc
src/client/Client.h

index 17eab6a750ab584ed81ee02476e1e5f730c5df06..18590797fa0e49f817ba7e6726552c9191af4a2a 100644 (file)
@@ -1387,6 +1387,7 @@ void Client::check_caps(Inode *in)
 
   if (wanted == 0 && !in->caps.empty()) {
     in->caps.clear();
+    dout(10) << "last caps on " << *in << dendl;
     put_inode(in);
   }
 }
@@ -2898,18 +2899,11 @@ int Client::_release(Fh *f)
   dout(5) << "_release " << f << dendl;
   Inode *in = f->inode;
 
-  // update inode rd/wr counts
-  int before = in->caps_wanted();
-  in->put_open_ref(f->mode);
-  int after = in->caps_wanted();
-
-  delete f;
-
-  // does this change what caps we want?
-  if (before != after && after)
+  if (in->put_open_ref(f->mode))
     check_caps(in);
-
   put_inode( in );
+
+  delete f;
   return 0;
 }
 
@@ -2918,7 +2912,6 @@ int Client::_release(Fh *f)
 // ------------
 // read, write
 
-
 off_t Client::lseek(int fd, off_t offset, int whence)
 {
   Mutex::Locker lock(client_lock);
@@ -2955,7 +2948,6 @@ off_t Client::lseek(int fd, off_t offset, int whence)
 }
 
 
-
 void Client::lock_fh_pos(Fh *f)
 {
   dout(10) << "lock_fh_pos " << f << dendl;
@@ -3120,7 +3112,9 @@ class C_Client_SyncCommit : public Context {
   Client *cl;
   Inode *in;
 public:
-  C_Client_SyncCommit(Client *c, Inode *i) : cl(c), in(i) {}
+  C_Client_SyncCommit(Client *c, Inode *i) : cl(c), in(i) {
+    in->get();
+  }
   void finish(int) {
     cl->sync_write_commit(in);
   }
@@ -3228,7 +3222,6 @@ int Client::_write(Fh *f, __s64 offset, __u64 size, const char *buf)
     Context *onsafe = new C_Client_SyncCommit(this, in);
 
     unsafe_sync_write++;
-    in->get();
     in->get_cap_ref(CEPH_CAP_WRBUFFER);
     
     filer->write(in->inode, offset, size, blist, 0, 
index 88d55d265991d5fb5ad2f9e438152dc313ff9860..e99c0d33910911a2e3c3e9577ac4aa257c9e9afc 100644 (file)
@@ -227,6 +227,7 @@ class Inode {
     open_by_mode[mode]++;
   }
   bool put_open_ref(int mode) {
+    cout << "open_by_mode[" << mode << "] " << open_by_mode[mode] << " -> " << (open_by_mode[mode]-1) << std::endl;
     if (--open_by_mode[mode] == 0)
       return true;
     return false;
@@ -253,14 +254,17 @@ class Inode {
     for (map<int,int>::iterator p = cap_refs.begin();
         p != cap_refs.end();
         p++)
-      w |= p->first;
+      if (p->second)
+       w |= p->first;
     return w;
   }
   int caps_file_wanted() {
     int want = 0;
-    for (int mode = 0; mode < 4; mode++)
-      if (open_by_mode.count(mode) && open_by_mode[mode])
-       want |= ceph_caps_for_mode(mode);
+    for (map<int,int>::iterator p = open_by_mode.begin();
+        p != open_by_mode.end();
+        p++)
+      if (p->second)
+       want |= ceph_caps_for_mode(p->first);
     return want;
   }
   int caps_wanted() {