]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: update dir mtime on open + O_CREAT
authorSage Weil <sage@newdream.net>
Mon, 7 Apr 2008 21:40:40 +0000 (14:40 -0700)
committerSage Weil <sage@newdream.net>
Mon, 7 Apr 2008 21:40:40 +0000 (14:40 -0700)
src/mds/Server.cc

index fce1e38269a4a1202d7ec3f2927c8e0666d12738..a2b1be3cc5b800884d34857e7b343cd4ab17c0b7 100644 (file)
@@ -4087,11 +4087,11 @@ class C_MDS_openc_finish : public Context {
   MDRequest *mdr;
   CDentry *dn;
   CInode *newi;
-  version_t pv;
+  version_t pv, dirpv;
 public:
-  C_MDS_openc_finish(MDS *m, MDRequest *r, CDentry *d, CInode *ni) :
+  C_MDS_openc_finish(MDS *m, MDRequest *r, CDentry *d, CInode *ni, version_t dpv) :
     mds(m), mdr(r), dn(d), newi(ni),
-    pv(d->get_projected_version()) {}
+    pv(d->get_projected_version()), dirpv(dpv) {}
   void finish(int r) {
     assert(r == 0);
 
@@ -4101,6 +4101,9 @@ public:
     // dirty inode, dn, dir
     newi->mark_dirty(pv, mdr->ls);
 
+    // dir inode's mtime
+    mds->server->dirty_dn_diri(mdr, dn, dirpv);
+
     // downgrade xlock to rdlock
     //mds->locker->dentry_xlock_downgrade_to_rdlock(dn, mdr);
 
@@ -4154,15 +4157,16 @@ void Server::handle_client_openc(MDRequest *mdr)
   in->inode.max_size = in->get_layout_size_increment();
   
   // prepare finisher
-  C_MDS_openc_finish *fin = new C_MDS_openc_finish(mds, mdr, dn, in);
   mdr->ls = mdlog->get_current_segment();
   EUpdate *le = new EUpdate(mdlog, "openc");
   le->metablob.add_client_req(req->get_reqid());
   le->metablob.add_allocated_ino(in->ino(), mds->idalloc->get_version());
+  version_t dirpv = predirty_dn_diri(mdr, dn, &le->metablob);  // dir mtime too
   le->metablob.add_dir_context(dn->dir);
   le->metablob.add_primary_dentry(dn, true, in, &in->inode);
   
   // log + wait
+  C_MDS_openc_finish *fin = new C_MDS_openc_finish(mds, mdr, dn, in, dirpv);
   mdlog->submit_entry(le, fin);
   
   /*