*/
/*
* This file is part of Lustre, http://www.lustre.org/
- * Lustre is a trademark of Sun Microsystems, Inc.
*/
#ifndef _OFD_INTERNAL_H
/* request stats */
enum {
- LPROC_OFD_STATS_READ = 0,
+ LPROC_OFD_STATS_READ_BYTES = 0,
+ LPROC_OFD_STATS_WRITE_BYTES,
+ LPROC_OFD_STATS_READ,
LPROC_OFD_STATS_WRITE,
LPROC_OFD_STATS_GETATTR,
LPROC_OFD_STATS_SETATTR,
if (exp->exp_obd && exp->exp_obd->obd_stats)
lprocfs_counter_add(exp->exp_obd->obd_stats, opcode, amount);
- if (exp->exp_obd && exp->exp_obd->u.obt.obt_jobstats.ojs_hash &&
+ if (exp->exp_obd && obd2obt(exp->exp_obd)->obt_jobstats.ojs_hash &&
(exp_connect_flags(exp) & OBD_CONNECT_JOBSTATS))
lprocfs_job_stats_log(exp->exp_obd, jobid, opcode, amount);
struct ost_id os_oi;
spinlock_t os_last_oid_lock;
struct mutex os_create_lock;
- atomic_t os_refc;
+ refcount_t os_refc;
atomic_t os_precreate_in_progress;
struct dt_object *os_lastid_obj;
unsigned long os_destroys_in_progress:1,
/* preferred BRW size, decided by storage type and capability */
__u32 ofd_brw_size;
- /* checksum types supported on this node */
- enum cksum_types ofd_cksum_types_supported;
-
spinlock_t ofd_flags_lock;
unsigned long ofd_raid_degraded:1,
/* sync journal on writes */
ofd_lastid_rebuilding:1,
ofd_record_fid_accessed:1,
ofd_lfsck_verify_pfid:1,
- ofd_no_precreate:1,
- ofd_skip_lfsck:1,
- /* Whether to enforce T10PI checksum of RPC */
- ofd_checksum_t10pi_enforce:1;
+ ofd_skip_lfsck:1;
struct seq_server_site ofd_seq_site;
/* the limit of SOFT_SYNC RPCs that will trigger a soft sync */
unsigned int ofd_soft_sync_limit;
/* Protect ::ofd_lastid_rebuilding */
struct rw_semaphore ofd_lastid_rwsem;
__u64 ofd_lastid_gen;
- struct ptlrpc_thread ofd_inconsistency_thread;
+ struct task_struct *ofd_inconsistency_task;
struct list_head ofd_inconsistency_list;
spinlock_t ofd_inconsistency_lock;
/* Backwards compatibility */
static inline struct ofd_device *ofd_dev(struct lu_device *d)
{
- return container_of0(d, struct ofd_device, ofd_dt_dev.dd_lu_dev);
+ return container_of_safe(d, struct ofd_device, ofd_dt_dev.dd_lu_dev);
}
static inline struct obd_device *ofd_obd(struct ofd_device *ofd)
return ofd->ofd_dt_dev.dd_lu_dev.ld_obd->obd_name;
}
+/**
+ * for compatibility, filter_fid could occupy more space in newer version and
+ * downgraded Lustre would fail reading it with -ERANGE, so it can read it
+ * again with more space to hold it.
+ */
+#define FILTER_FID_EXTRA_SIZE 32
+
struct ofd_object {
struct lu_object_header ofo_header;
struct dt_object ofo_obj;
static inline struct ofd_object *ofd_obj(struct lu_object *o)
{
- return container_of0(o, struct ofd_object, ofo_obj.do_lu);
+ return container_of_safe(o, struct ofd_object, ofo_obj.do_lu);
}
static inline int ofd_object_exists(struct ofd_object *obj)
struct ofd_access_log;
struct ofd_access_log *ofd_access_log_create(const char *ofd_name, size_t size);
void ofd_access_log_delete(struct ofd_access_log *oal);
-void ofd_access(struct ofd_device *m,
+void ofd_access(const struct lu_env *env, struct ofd_device *m,
const struct lu_fid *parent_fid, __u64 begin, __u64 end,
unsigned int size, unsigned int segment_count, int rw);
int ofd_commitrw(const struct lu_env *env, int cmd, struct obd_export *exp,
struct obdo *oa, int objcount, struct obd_ioobj *obj,
struct niobuf_remote *rnb, int npages,
- struct niobuf_local *lnb, int old_rc);
+ struct niobuf_local *lnb, int old_rc, int nob,
+ ktime_t kstart);
/* ofd_trans.c */
struct thandle *ofd_trans_create(const struct lu_env *env,
/* lproc_ofd.c */
int ofd_tunables_init(struct ofd_device *ofd);
#ifdef CONFIG_PROC_FS
-void ofd_stats_counter_init(struct lprocfs_stats *stats);
+void ofd_stats_counter_init(struct lprocfs_stats *stats, unsigned int offset,
+ enum lprocfs_counter_config cntr_umask);
#else
-static inline void ofd_stats_counter_init(struct lprocfs_stats *stats) {}
+static inline void
+ofd_stats_counter_init(struct lprocfs_stats *stats,
+ unsigned int offset,
+ enum lprocfs_counter_config cntr_umask) {}
#endif
/* ofd_objects.c */
int ofd_object_ff_update(const struct lu_env *env, struct ofd_object *fo,
const struct obdo *oa, struct filter_fid *ff);
int ofd_precreate_objects(const struct lu_env *env, struct ofd_device *ofd,
- u64 id, struct ofd_seq *oseq, int nr, int sync);
+ u64 id, struct ofd_seq *oseq, int nr, int sync,
+ bool trans_local);
static inline void ofd_object_put(const struct lu_env *env,
struct ofd_object *fo)
return 0;
}
+/**
+ * whether the requestion IO contains older layout version than that on the
+ * disk.
+ */
+static inline bool ofd_layout_version_less(__u32 req_version,
+ __u32 ondisk_version)
+{
+ __u32 req = req_version & ~LU_LAYOUT_RESYNC;
+ __u32 ondisk = ondisk_version & ~LU_LAYOUT_RESYNC;
+
+ /**
+ * request layout version could be circularly increased to the samllest
+ * value, in that case @req < @ondisk but @req does not have the high
+ * end bit set while @ondisk does.
+ */
+ return (req < ondisk) &&
+ ((req & LU_LAYOUT_HIGEN) == (ondisk & LU_LAYOUT_HIGEN));
+}
+
+static inline int ofd_seq_is_exhausted(struct ofd_device *ofd,
+ const struct obdo *oa)
+{
+ struct seq_server_site *ss = &ofd->ofd_seq_site;
+ __u64 seq_width = ss->ss_client_seq->lcs_width;
+ __u64 seq = ostid_seq(&oa->o_oi);
+ __u64 oid = ostid_id(&oa->o_oi);
+
+ if (fid_seq_is_norm(seq))
+ return oid >= min(seq_width, OBIF_MAX_OID);
+ if (fid_seq_is_idif(seq) || fid_seq_is_mdt0(seq))
+ return oid >= min(seq_width, IDIF_MAX_OID);
+ CERROR("%s : invalid o_seq "DOSTID"\n",
+ ofd_name(ofd), POSTID(&oa->o_oi));
+ return -EINVAL;
+}
+
#endif /* _OFD_INTERNAL_H */