Whamcloud - gitweb
Branch HEAD
authorzam <zam>
Thu, 28 Aug 2008 07:52:46 +0000 (07:52 +0000)
committerzam <zam>
Thu, 28 Aug 2008 07:52:46 +0000 (07:52 +0000)
b=16499
i=yury.umanets
i=tappro

mdt_device_sync and mdt_object_sync implementation

lustre/cmm/cmm_object.c
lustre/include/dt_object.h
lustre/include/md_object.h
lustre/mdd/mdd_object.c
lustre/mdt/mdt_handler.c
lustre/osd/osd_handler.c
lustre/osd/osd_internal.h

index dac4ed3..13176b3 100644 (file)
@@ -344,6 +344,14 @@ static int cml_capa_get(const struct lu_env *env, struct md_object *mo,
         RETURN(rc);
 }
 
+static int cml_object_sync(const struct lu_env *env, struct md_object *mo)
+{
+        int rc;
+        ENTRY;
+        rc = mo_object_sync(env, md_object_next(mo));
+        RETURN(rc);
+}
+
 static struct md_object_operations cml_mo_ops = {
         .moo_permission    = cml_permission,
         .moo_attr_get      = cml_attr_get,
@@ -359,7 +367,8 @@ static struct md_object_operations cml_mo_ops = {
         .moo_close         = cml_close,
         .moo_readpage      = cml_readpage,
         .moo_readlink      = cml_readlink,
-        .moo_capa_get      = cml_capa_get
+        .moo_capa_get      = cml_capa_get,
+        .moo_object_sync   = cml_object_sync,
 };
 
 /* md_dir operations */
@@ -939,6 +948,11 @@ static int cmr_capa_get(const struct lu_env *env, struct md_object *mo,
         return -EFAULT;
 }
 
+static int cmr_object_sync(const struct lu_env *env, struct md_object *mo)
+{
+        return -EFAULT;
+}
+
 static struct md_object_operations cmr_mo_ops = {
         .moo_permission    = cmr_permission,
         .moo_attr_get      = cmr_attr_get,
@@ -954,7 +968,8 @@ static struct md_object_operations cmr_mo_ops = {
         .moo_close         = cmr_close,
         .moo_readpage      = cmr_readpage,
         .moo_readlink      = cmr_readlink,
-        .moo_capa_get      = cmr_capa_get
+        .moo_capa_get      = cmr_capa_get,
+        .moo_object_sync   = cmr_object_sync,
 };
 
 /* remote part of md_dir operations */
index 7416e48..6ac622d 100644 (file)
@@ -308,6 +308,7 @@ struct dt_object_operations {
                                         struct dt_object *dt,
                                         struct lustre_capa *old,
                                         __u64 opc);
+        int (*do_object_sync)(const struct lu_env *, struct dt_object *);
 };
 
 /*
index 1f383a6..b543013 100644 (file)
@@ -235,6 +235,7 @@ struct md_object_operations {
         
         int (*moo_capa_get)(const struct lu_env *, struct md_object *,
                             struct lustre_capa *, int renewal);
+        int (*moo_object_sync)(const struct lu_env *, struct md_object *);
 };
 
 /*
@@ -550,6 +551,12 @@ static inline int mo_capa_get(const struct lu_env *env,
         return m->mo_ops->moo_capa_get(env, m, c, renewal);
 }
 
+static inline int mo_object_sync(const struct lu_env *env, struct md_object *m)
+{
+        LASSERT(m->mo_ops->moo_object_sync);
+        return m->mo_ops->moo_object_sync(env, m);
+}
+
 static inline int mdo_lookup(const struct lu_env *env,
                              struct md_object *p,
                              const struct lu_name *lname,
index 1bea083..74b628b 100644 (file)
@@ -1602,6 +1602,16 @@ out_unlock:
         return rc;
 }
 
+static int mdd_object_sync(const struct lu_env *env, struct md_object *obj)
+{
+        struct mdd_object *mdd_obj = md2mdd_obj(obj);
+        struct dt_object *next;
+
+        LASSERT(mdd_object_exists(mdd_obj));
+        next = mdd_object_child(mdd_obj);
+        return next->do_ops->do_object_sync(env, next);
+}
+
 struct md_object_operations mdd_obj_ops = {
         .moo_permission    = mdd_permission,
         .moo_attr_get      = mdd_attr_get,
@@ -1617,5 +1627,6 @@ struct md_object_operations mdd_obj_ops = {
         .moo_close         = mdd_close,
         .moo_readpage      = mdd_readpage,
         .moo_readlink      = mdd_readlink,
-        .moo_capa_get      = mdd_capa_get
+        .moo_capa_get      = mdd_capa_get,
+        .moo_object_sync   = mdd_object_sync,
 };
index 271a073..d746f0e 100644 (file)
@@ -1545,18 +1545,33 @@ static int mdt_reint(struct mdt_thread_info *info)
         RETURN(rc);
 }
 
-/* TODO these two methods not available now. */
-
 /* this should sync the whole device */
-static int mdt_device_sync(struct mdt_thread_info *info)
+static int mdt_device_sync(const struct lu_env *env, struct mdt_device *mdt)
 {
-        return 0;
+        struct dt_device *dt = mdt->mdt_bottom;
+        int rc;
+        ENTRY;
+
+        rc = dt->dd_ops->dt_sync(env, dt);
+        RETURN(rc);
 }
 
 /* this should sync this object */
 static int mdt_object_sync(struct mdt_thread_info *info)
 {
-        return 0;
+        struct md_object *next;
+        int rc;
+        ENTRY;
+
+        if (!mdt_object_exists(info->mti_object)) {
+                CWARN("Non existing object  "DFID"!\n",
+                      PFID(mdt_object_fid(info->mti_object)));
+                RETURN(-ESTALE);
+        }
+        next = mdt_object_child(info->mti_object);
+        rc = mo_object_sync(info->mti_env, next);
+
+        RETURN(rc);
 }
 
 static int mdt_sync(struct mdt_thread_info *info)
@@ -1580,7 +1595,7 @@ static int mdt_sync(struct mdt_thread_info *info)
                 /* sync the whole device */
                 rc = req_capsule_server_pack(pill);
                 if (rc == 0)
-                        rc = mdt_device_sync(info);
+                        rc = mdt_device_sync(info->mti_env, info->mti_mdt);
                 else
                         rc = err_serious(rc);
         } else {
@@ -4646,7 +4661,7 @@ static int mdt_iocontrol(unsigned int cmd, struct obd_export *exp, int len,
 
         switch (cmd) {
         case OBD_IOC_SYNC:
-                rc = dt->dd_ops->dt_sync(&env, dt);
+                rc = mdt_device_sync(&env, mdt);
                 break;
         case OBD_IOC_SET_READONLY:
                 rc = dt->dd_ops->dt_sync(&env, dt);
index 4422aea..dc96790 100644 (file)
@@ -1521,6 +1521,26 @@ static struct obd_capa *osd_capa_get(const struct lu_env *env,
         RETURN(oc);
 }
 
+static int osd_object_sync(const struct lu_env *env, struct dt_object *dt)
+{
+        int rc;
+        struct osd_object      *obj    = osd_dt_obj(dt);
+        struct inode           *inode  = obj->oo_inode;
+        struct osd_thread_info *info   = osd_oti_get(env);
+        struct dentry          *dentry = &info->oti_dentry;
+        struct file            *file   = &info->oti_file;
+        ENTRY;
+
+        dentry->d_inode = inode;
+        file->f_dentry = dentry;
+        file->f_mapping = inode->i_mapping;
+        file->f_op = inode->i_fop;
+        mutex_lock(&inode->i_mutex);
+        rc = file->f_op->fsync(file, dentry, 0);
+        mutex_unlock(&inode->i_mutex);
+        RETURN(rc);
+}
+
 static struct dt_object_operations osd_obj_ops = {
         .do_read_lock    = osd_object_read_lock,
         .do_write_lock   = osd_object_write_lock,
@@ -1538,6 +1558,7 @@ static struct dt_object_operations osd_obj_ops = {
         .do_xattr_del    = osd_xattr_del,
         .do_xattr_list   = osd_xattr_list,
         .do_capa_get     = osd_capa_get,
+        .do_object_sync  = osd_object_sync,
 };
 
 /*
index 359c19f..f325119 100644 (file)
@@ -128,6 +128,10 @@ struct osd_thread_info {
         struct dentry          oti_dentry;
         struct timespec        oti_time;
         /*
+         * XXX temporary: fake struct file for osd_object_sync
+         */
+        struct file            oti_file;
+        /*
          * XXX temporary: for capa operations.
          */
         struct lustre_capa_key oti_capa_key;