int (*do_invalidate)(const struct lu_env *env, struct dt_object *dt);
/**
+ * Check object stale state.
+ *
+ * OSP only.
+ *
+ * \param[in] dt object
+ *
+ * \retval true for stale object
+ * \retval false for not stale object
+ */
+ bool (*do_check_stale)(struct dt_object *dt);
+
+ /**
* Declare intention to instaintiate extended layout component.
*
* \param[in] env execution environment
return dt->do_ops->do_write_locked(env, dt);
}
+static inline bool dt_object_stale(struct dt_object *dt)
+{
+ LASSERT(dt);
+ LASSERT(dt->do_ops);
+ LASSERT(dt->do_ops->do_check_stale);
+
+ return dt->do_ops->do_check_stale(dt);
+}
+
static inline int dt_declare_attr_get(const struct lu_env *env,
struct dt_object *dt)
{
LASSERT(llh->llh_size == reclen);
}
+ /* return error if osp object is stale */
+ if (idx != LLOG_HEADER_IDX && dt_object_stale(o))
+ RETURN(-ESTALE);
rc = dt_attr_get(env, o, &lgi->lgi_attr);
if (rc)
RETURN(rc);
return 0;
}
+static bool osd_check_stale(struct dt_object *dt)
+{
+ return false;
+}
/*
* Index operations.
*/
.do_xattr_list = osd_xattr_list,
.do_object_sync = osd_object_sync,
.do_invalidate = osd_invalidate,
+ .do_check_stale = osd_check_stale,
};
static const struct dt_object_operations osd_obj_otable_it_ops = {
return 0;
}
+static bool osd_check_stale(struct dt_object *dt)
+{
+ return false;
+}
+
static struct dt_object_operations osd_obj_ops = {
.do_read_lock = osd_read_lock,
.do_write_lock = osd_write_lock,
.do_xattr_list = osd_xattr_list,
.do_object_sync = osd_object_sync,
.do_invalidate = osd_invalidate,
+ .do_check_stale = osd_check_stale,
};
static struct lu_object_operations osd_lu_obj_ops = {
int osp_xattr_del(const struct lu_env *env, struct dt_object *dt,
const char *name, struct thandle *th);
int osp_invalidate(const struct lu_env *env, struct dt_object *dt);
+bool osp_check_stale(struct dt_object *dt);
void osp_obj_invalidate_cache(struct osp_object *obj);
int osp_trans_stop(const struct lu_env *env, struct dt_device *dt,
.do_object_lock = osp_md_object_lock,
.do_object_unlock = osp_md_object_unlock,
.do_invalidate = osp_invalidate,
+ .do_check_stale = osp_check_stale,
};
/**
RETURN(0);
}
+bool osp_check_stale(struct dt_object *dt)
+{
+ struct osp_object *obj = dt2osp_obj(dt);
+
+ if (is_ost_obj(&dt->do_lu) && obj->opo_non_exist)
+ return true;
+
+ return obj->opo_stale;
+}
+
+
/**
* Implement OSP layer dt_object_operations::do_declare_create() interface.
*