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,
.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 */
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,
.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 */
struct dt_object *dt,
struct lustre_capa *old,
__u64 opc);
+ int (*do_object_sync)(const struct lu_env *, struct dt_object *);
};
/*
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 *);
};
/*
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,
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,
.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,
};
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)
/* 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 {
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);
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,
.do_xattr_del = osd_xattr_del,
.do_xattr_list = osd_xattr_list,
.do_capa_get = osd_capa_get,
+ .do_object_sync = osd_object_sync,
};
/*
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;