From 86aeca3550c902b96b434ff51754d037282347cc Mon Sep 17 00:00:00 2001 From: zam <zam> Date: Thu, 28 Aug 2008 07:52:46 +0000 Subject: [PATCH] Branch HEAD b=16499 i=yury.umanets i=tappro mdt_device_sync and mdt_object_sync implementation --- lustre/cmm/cmm_object.c | 19 +++++++++++++++++-- lustre/include/dt_object.h | 1 + lustre/include/md_object.h | 7 +++++++ lustre/mdd/mdd_object.c | 13 ++++++++++++- lustre/mdt/mdt_handler.c | 29 ++++++++++++++++++++++------- lustre/osd/osd_handler.c | 21 +++++++++++++++++++++ lustre/osd/osd_internal.h | 4 ++++ 7 files changed, 84 insertions(+), 10 deletions(-) diff --git a/lustre/cmm/cmm_object.c b/lustre/cmm/cmm_object.c index dac4ed30db..13176b3158 100644 --- a/lustre/cmm/cmm_object.c +++ b/lustre/cmm/cmm_object.c @@ -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 */ diff --git a/lustre/include/dt_object.h b/lustre/include/dt_object.h index 7416e48214..6ac622df84 100644 --- a/lustre/include/dt_object.h +++ b/lustre/include/dt_object.h @@ -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 *); }; /* diff --git a/lustre/include/md_object.h b/lustre/include/md_object.h index 1f383a65ef..b543013b00 100644 --- a/lustre/include/md_object.h +++ b/lustre/include/md_object.h @@ -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, diff --git a/lustre/mdd/mdd_object.c b/lustre/mdd/mdd_object.c index 1bea083a7f..74b628b21f 100644 --- a/lustre/mdd/mdd_object.c +++ b/lustre/mdd/mdd_object.c @@ -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, }; diff --git a/lustre/mdt/mdt_handler.c b/lustre/mdt/mdt_handler.c index 271a0735f9..d746f0ef97 100644 --- a/lustre/mdt/mdt_handler.c +++ b/lustre/mdt/mdt_handler.c @@ -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); diff --git a/lustre/osd/osd_handler.c b/lustre/osd/osd_handler.c index 4422aeae57..dc96790483 100644 --- a/lustre/osd/osd_handler.c +++ b/lustre/osd/osd_handler.c @@ -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, }; /* diff --git a/lustre/osd/osd_internal.h b/lustre/osd/osd_internal.h index 359c19f8ad..f325119f45 100644 --- a/lustre/osd/osd_internal.h +++ b/lustre/osd/osd_internal.h @@ -127,6 +127,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. */ -- GitLab