extern rwlock_t obd_dev_lock;
/* OBD Operations Declarations */
-extern struct obd_device *class_conn2obd(struct lustre_handle *);
extern struct obd_device *class_exp2obd(struct obd_export *);
extern int class_handle_ioctl(unsigned int cmd, unsigned long arg);
int lustre_get_jobid(char *jobid, size_t len);
/* genops.c */
struct obd_export *class_conn2export(struct lustre_handle *);
-struct kobject *class_setup_tunables(const char *name);
+#ifdef HAVE_SERVER_SUPPORT
+struct obd_type *class_setup_tunables(const char *name);
+#endif
int class_register_type(struct obd_ops *, struct md_ops *, bool enable_proc,
struct lprocfs_vars *module_vars,
const char *nm, struct lu_device_type *ldt);
/* Passed as data param to class_config_parse_llog */
struct config_llog_instance {
- char *cfg_obdname;
- void *cfg_instance;
+ unsigned long cfg_instance;
struct super_block *cfg_sb;
struct obd_uuid cfg_uuid;
llog_cb_t cfg_callback;
int class_config_parse_llog(const struct lu_env *env, struct llog_ctxt *ctxt,
char *name, struct config_llog_instance *cfg);
+/**
+ * Generate a unique configuration instance for this mount
+ *
+ * Temporary hack to bypass ASLR in 4.15+ kernels, a better fix soon.
+ * For now, use the same value as before - the superblock pointer value.
+ *
+ * Using the client UUID would be an option, but it needs more testing.
+ */
+static inline unsigned long ll_get_cfg_instance(struct super_block *sb)
+{
+ return (unsigned long)sb;
+}
+
#define CONFIG_SUB_SPTLRPC 0x01
#define CONFIG_SUB_RECOVER 0x02
#define CONFIG_SUB_PARAMS 0x04
RETURN(rc);
}
-static inline int obd_ping(const struct lu_env *env, struct obd_export *exp)
-{
- int rc;
- ENTRY;
-
- if (!exp->exp_obd->obd_type ||
- !exp->exp_obd->obd_type->typ_dt_ops->o_ping)
- RETURN(0);
-
- rc = OBP(exp->exp_obd, ping)(env, exp);
- RETURN(rc);
-}
-
static inline int obd_pool_new(struct obd_device *obd, char *poolname)
{
int rc;
time64_t max_age,
struct ptlrpc_request_set *rqset)
{
- int rc = 0;
struct obd_device *obd;
+ int rc = 0;
ENTRY;
obd = exp->exp_obd;
if (!obd->obd_type || !obd->obd_type->typ_dt_ops->o_statfs) {
- CERROR("%s: no %s operation\n", obd->obd_name, __func__);
- RETURN(-EOPNOTSUPP);
+ rc = -EOPNOTSUPP;
+ CERROR("%s: no statfs operation: rc = %d\n", obd->obd_name, rc);
+ RETURN(rc);
}
- CDEBUG(D_SUPER, "%s: osfs %p age %lld, max_age %lld\n",
- obd->obd_name, &obd->obd_osfs, obd->obd_osfs_age, max_age);
+ CDEBUG(D_SUPER, "%s: age %lld, max_age %lld\n",
+ obd->obd_name, obd->obd_osfs_age, max_age);
if (obd->obd_osfs_age < max_age) {
rc = OBP(obd, statfs_async)(exp, oinfo, max_age, rqset);
} else {
obd->obd_osfs.os_bavail, obd->obd_osfs.os_blocks,
obd->obd_osfs.os_ffree, obd->obd_osfs.os_files);
spin_lock(&obd->obd_osfs_lock);
- memcpy(oinfo->oi_osfs, &obd->obd_osfs,
- sizeof(*oinfo->oi_osfs));
+ memcpy(oinfo->oi_osfs, &obd->obd_osfs, sizeof(*oinfo->oi_osfs));
spin_unlock(&obd->obd_osfs_lock);
oinfo->oi_flags |= OBD_STATFS_FROM_CACHE;
if (oinfo->oi_cb_up)
*/
static inline int obd_statfs(const struct lu_env *env, struct obd_export *exp,
struct obd_statfs *osfs, time64_t max_age,
- __u32 flags)
+ __u32 flags)
{
- int rc = 0;
- struct obd_device *obd = exp->exp_obd;
- ENTRY;
+ struct obd_device *obd = exp->exp_obd;
+ int rc = 0;
- if (obd == NULL)
- RETURN(-EINVAL);
+ ENTRY;
+ if (unlikely(obd == NULL))
+ RETURN(-EINVAL);
OBD_CHECK_DEV_ACTIVE(obd);
- if (!obd->obd_type || !obd->obd_type->typ_dt_ops->o_statfs) {
+ if (unlikely(!obd->obd_type || !obd->obd_type->typ_dt_ops->o_statfs)) {
CERROR("%s: no %s operation\n", obd->obd_name, __func__);
RETURN(-EOPNOTSUPP);
}
- CDEBUG(D_SUPER, "osfs %lld, max_age %lld\n",
- obd->obd_osfs_age, max_age);
+ CDEBUG(D_SUPER, "%s: age %lld, max_age %lld\n",
+ obd->obd_name, obd->obd_osfs_age, max_age);
/* ignore cache if aggregated isn't expected */
if (obd->obd_osfs_age < max_age ||
((obd->obd_osfs.os_state & OS_STATE_SUM) &&
!(flags & OBD_STATFS_SUM))) {
- rc = OBP(obd, statfs)(env, exp, osfs, max_age, flags);
- if (rc == 0) {
+ rc = OBP(obd, statfs)(env, exp, osfs, max_age, flags);
+ if (rc == 0) {
spin_lock(&obd->obd_osfs_lock);
memcpy(&obd->obd_osfs, osfs, sizeof(obd->obd_osfs));
obd->obd_osfs_age = ktime_get_seconds();
spin_unlock(&obd->obd_osfs_lock);
}
} else {
- CDEBUG(D_SUPER, "%s: use %p cache blocks %llu/%llu"
- " objects %llu/%llu\n",
+ CDEBUG(D_SUPER,
+ "%s: use %p cache blocks %llu/%llu objects %llu/%llu\n",
obd->obd_name, &obd->obd_osfs,
obd->obd_osfs.os_bavail, obd->obd_osfs.os_blocks,
obd->obd_osfs.os_ffree, obd->obd_osfs.os_files);
int lustre_unregister_fs(void);
int lustre_check_exclusion(struct super_block *sb, char *svname);
-typedef __u8 class_uuid_t[16];
-static inline void class_uuid_unparse(class_uuid_t uu, struct obd_uuid *out)
-{
- snprintf(out->uuid, sizeof(out->uuid), "%02x%02x%02x%02x-%02x%02x-"
- "%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x",
- uu[14], uu[15], uu[12], uu[13], uu[10], uu[11], uu[8], uu[9],
- uu[6], uu[7], uu[4], uu[5], uu[2], uu[3], uu[0], uu[1]);
-}
-
/* lustre_peer.c */
int lustre_uuid_to_peer(const char *uuid, lnet_nid_t *peer_nid, int index);
int class_add_uuid(const char *uuid, __u64 nid);
/* class_obd.c */
extern char obd_jobid_name[];
-/* prng.c */
-#define ll_generate_random_uuid(uuid_out) cfs_get_random_bytes(uuid_out, sizeof(class_uuid_t))
-
/* statfs_pack.c */
struct kstatfs;
void statfs_pack(struct obd_statfs *osfs, struct kstatfs *sfs);
int obd_ioctl_getdata(char **buf, int *len, void __user *arg);
int class_procfs_init(void);
int class_procfs_clean(void);
+
+extern void obd_heat_add(struct obd_heat_instance *instance,
+ unsigned int time_second, __u64 count,
+ unsigned int weight, unsigned int period_second);
+extern void obd_heat_decay(struct obd_heat_instance *instance,
+ __u64 time_second, unsigned int weight,
+ unsigned int period_second);
+extern __u64 obd_heat_get(struct obd_heat_instance *instance,
+ unsigned int time_second, unsigned int weight,
+ unsigned int period_second);
+extern void obd_heat_clear(struct obd_heat_instance *instance, int count);
#endif /* __LINUX_OBD_CLASS_H */