]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
*** empty log message ***
authorsage <sage@29311d96-e01e-0410-9327-a35deaab8ce9>
Tue, 5 Jul 2005 20:22:17 +0000 (20:22 +0000)
committersage <sage@29311d96-e01e-0410-9327-a35deaab8ce9>
Tue, 5 Jul 2005 20:22:17 +0000 (20:22 +0000)
git-svn-id: https://ceph.svn.sf.net/svnroot/ceph@400 29311d96-e01e-0410-9327-a35deaab8ce9

ceph/include/types.h
ceph/mds/MDCache.cc
ceph/mds/MDCache.h
ceph/mds/MDS.cc
ceph/messages/MClientReply.h

index ea1e70d7d3e042c119e83fa146381fc4b5b17eb8..dd9d7164b2ac5eb4375deaff90fc7333589daabe 100644 (file)
@@ -92,6 +92,7 @@ struct inode_t {
   unsigned char hash_seed;  // 0 if not hashed.
   int   nlink;
   bool  anchored;
+  __uint64_t file_data_version;
 };
 
 
index 58c4f5f0cf8ef1e858f896b881f34f7e41739e61..57b651414f254a52b1ce5ac5bdcfb17c6715df66 100644 (file)
@@ -3237,6 +3237,11 @@ void MDCache::handle_rename_notify(MRenameNotify *m)
 
 // file i/o -----------------------------------------
 
+__uint64_t MDCache::issue_file_data_version(CInode *in)
+{
+  dout(7) << "issue_file_data_version on " << *in << endl;
+  return in->inode.file_data_version;
+}
 
 
 int MDCache::issue_file_caps(CInode *in,
@@ -3296,6 +3301,13 @@ int MDCache::issue_file_caps(CInode *in,
   dout(7) << " issuing caps " << caps << " (i want " << my_want << ", allowed " << allowed << ")" << endl;
   assert(caps > 0);
 
+  // issuing new write permissions?
+  if ((issued & CFILE_CAP_WR) == 0 &&
+         (  caps & CFILE_CAP_WR) != 0) {
+       dout(7) << " incrementing file_data_version for " << *in << endl;
+       in->inode.file_data_version++;
+  }
+
   return caps;
 }
 
index 994f7c31c3ec82a846af0c9e8fd8bacfbbb881cc..dafcd638a689054dc3446b2ce77b88ef797472a7 100644 (file)
@@ -271,6 +271,7 @@ class MDCache {
 
 
   // -- file i/o --
+  __uint64_t issue_file_data_version(CInode *in);
   int issue_file_caps(CInode *in, int mode, MClientRequest *req);
   void eval_file_caps(CInode *in);
   void handle_client_file_caps(class MClientFileCaps *m);
index f3440a9de8ee2a61cd2adc8200140762a80eaba5..f85f753d18587b945faa6be2f895eb40a8794412 100644 (file)
@@ -2258,6 +2258,7 @@ void MDS::handle_client_open(MClientRequest *req,
 
 
   // can we issue the caps they want?
+  __uint64_t fdv = mdcache->issue_file_data_version(cur);
   int caps = mdcache->issue_file_caps(cur, mode, req);
   if (!caps) return; // can't issue (yet), so wait!
 
@@ -2282,6 +2283,7 @@ void MDS::handle_client_open(MClientRequest *req,
   // reply
   MClientReply *reply = new MClientReply(req, f->fh);   // fh # is return code
   reply->set_file_caps(caps);
+  reply->set_file_data_version(fdv);
   reply_request(req, reply, cur);
 }
 
@@ -2350,7 +2352,16 @@ void MDS::handle_client_close(MClientRequest *req, CInode *cur)
   }
 
   // atime?  ****
-  
+
+  // were we writing?
+  int had_caps = f->pending_caps & f->confirmed_caps;  // safe set of caps the client can assume it had
+
+  if ((f->confirmed_caps | f->pending_caps) & CFILE_CAP_WR != 0) { 
+       // inc file_data_version
+       dout(7) << " incrementing file_data_version for " << *cur << endl;
+       cur->inode.file_data_version++;
+  }
+
   // close it.
   cur->remove_fh(f);
 
@@ -2372,8 +2383,15 @@ void MDS::handle_client_close(MClientRequest *req, CInode *cur)
 
   // XXX what about atime?
 
+
+  // give back a file_data_version to client
+  MClientReply *reply = new MClientReply(req, 0);
+  __uint64_t fdv = mdcache->issue_file_data_version(cur);
+  reply->set_file_caps(had_caps);
+  reply->set_file_data_version(fdv);
+
   // commit
-  commit_request(req, new MClientReply(req, 0), cur,
+  commit_request(req, reply, cur,
                                 new EInodeUpdate(cur));               // FIXME wrong message?
 }
 
index da3e8a3489dccab7e317f0572c9b373ce6024cb8..dfb316e75319d88984f570cf9fc3f17157c77883 100644 (file)
@@ -95,6 +95,7 @@ typedef struct {
   int trace_depth;
   int dir_size;
   unsigned char file_caps;  // for open
+  __uint64_t file_data_version;  // for client buffercache consistency
 } MClientReply_st;
 
 class MClientReply : public Message {
@@ -117,9 +118,11 @@ class MClientReply : public Message {
   const vector<c_inode_info*>& get_trace() { return trace; }
   vector<c_inode_info*>& get_dir_contents() { return dir_contents; }
   unsigned char get_file_caps() { return st.file_caps; }
+  __uint64_t get_file_data_version() { return st.file_data_version; }
   
   void set_result(int r) { st.result = r; }
   void set_file_caps(unsigned char c) { st.file_caps = c; }
+  void set_file_data_version(__uint64_t v) { st.file_data_version = v; }
 
   MClientReply() {};
   MClientReply(MClientRequest *req, int result = 0) :