* @{
*/
-
+#include <obd_support.h>
/*
* super-class definitions.
*/
unsigned ddp_block_shift;
mntopt_t ddp_mntopts;
unsigned ddp_max_ea_size;
- void *ddp_mnt; /* XXX: old code can retrieve mnt -bzzz */
int ddp_mount_type;
unsigned long long ddp_maxbytes;
/* percentage of available space to reserve for grant error margin */
*/
int (*dt_trans_start)(const struct lu_env *env,
struct dt_device *dev, struct thandle *th);
- /**
- * Finish previously started transaction.
- */
- int (*dt_trans_stop)(const struct lu_env *env,
- struct thandle *th);
+ /**
+ * Finish previously started transaction.
+ */
+ int (*dt_trans_stop)(const struct lu_env *env, struct dt_device *dev,
+ struct thandle *th);
/**
* Add commit callback to the transaction.
*/
* It can contain any allocation hint in the future.
*/
struct dt_allocation_hint {
- struct dt_object *dah_parent;
- __u32 dah_mode;
+ struct dt_object *dah_parent;
+ const void *dah_eadata;
+ int dah_eadata_len;
+ __u32 dah_mode;
};
/**
* lu_object_operations, but that would break existing symmetry.
*/
+ int (*do_declare_attr_get)(const struct lu_env *env,
+ struct dt_object *dt,
+ struct lustre_capa *capa);
/**
* Return standard attributes.
*
const struct lu_attr *attr,
struct thandle *handle,
struct lustre_capa *capa);
+
+ int (*do_declare_xattr_get)(const struct lu_env *env,
+ struct dt_object *dt,
+ struct lu_buf *buf,
+ const char *name,
+ struct lustre_capa *capa);
+
/**
* Return a value of an extended attribute.
*
enum dt_otable_it_valid {
DOIV_ERROR_HANDLE = 0x0001,
+ DOIV_DRYRUN = 0x0002,
};
enum dt_otable_it_flags {
/* There is up layer component uses the iteration. */
DOIF_OUTUSED = 0x0004,
+
+ /* Check only without repairing. */
+ DOIF_DRYRUN = 0x0008,
};
/* otable based iteration needs to use the common DT interation APIs.
* single-threaded start-up shut-down procedures.
*/
cfs_list_t dd_txn_callbacks;
+ unsigned int dd_record_fid_accessed:1;
};
int dt_device_init(struct dt_device *dev, struct lu_device_type *t);
cfs_list_t los_list;
/* how many handle's reference this los has */
- cfs_atomic_t los_refcount;
+ atomic_t los_refcount;
struct dt_device *los_dev;
struct dt_object *los_obj;
return container_of0(o, struct dt_object, do_lu);
}
+struct thandle_update {
+ /* In DNE, one transaction can be disassembled into
+ * updates on several different MDTs, and these updates
+ * will be attached to tu_remote_update_list per target.
+ * Only single thread will access the list, no need lock
+ */
+ struct list_head tu_remote_update_list;
+
+ /* sent after or before local transaction */
+ unsigned int tu_sent_after_local_trans:1,
+ tu_only_remote_trans:1;
+};
+
/**
* This is the general purpose transaction handle.
* 1. Transaction Life Cycle
/** the dt device on which the transactions are executed */
struct dt_device *th_dev;
+ atomic_t th_refc;
+ /* the size of transaction */
+ int th_alloc_size;
+
/** context for this transaction, tag is LCT_TX_HANDLE */
struct lu_context th_ctx;
/* local transation, no need to inform other layers */
unsigned int th_local:1;
- /* In DNE, one transaction can be disassemblied into
- * updates on several different MDTs, and these updates
- * will be attached to th_remote_update_list per target.
- * Only single thread will access the list, no need lock
- */
- cfs_list_t th_remote_update_list;
- struct update_request *th_current_request;
+ struct thandle_update *th_update;
};
+static inline void thandle_get(struct thandle *thandle)
+{
+ atomic_inc(&thandle->th_refc);
+}
+
+static inline void thandle_put(struct thandle *thandle)
+{
+ if (atomic_dec_and_test(&thandle->th_refc)) {
+ if (thandle->th_update != NULL)
+ OBD_FREE_PTR(thandle->th_update);
+ OBD_FREE(thandle, thandle->th_alloc_size);
+ }
+}
/**
* Transaction call-backs.
*
struct dt_object *dt_locate_at(const struct lu_env *env,
struct dt_device *dev,
const struct lu_fid *fid,
- struct lu_device *top_dev);
+ struct lu_device *top_dev,
+ const struct lu_object_conf *conf);
+
static inline struct dt_object *
dt_locate(const struct lu_env *env, struct dt_device *dev,
const struct lu_fid *fid)
{
- return dt_locate_at(env, dev, fid, dev->dd_lu_dev.ld_site->ls_top_dev);
+ return dt_locate_at(env, dev, fid,
+ dev->dd_lu_dev.ld_site->ls_top_dev, NULL);
}
-
int local_oid_storage_init(const struct lu_env *env, struct dt_device *dev,
const struct lu_fid *first_fid,
struct local_oid_storage **los);
static inline int dt_trans_stop(const struct lu_env *env,
struct dt_device *d, struct thandle *th)
{
- LASSERT(d->dd_ops->dt_trans_stop);
- return d->dd_ops->dt_trans_stop(env, th);
+ LASSERT(d->dd_ops->dt_trans_stop);
+ return d->dd_ops->dt_trans_stop(env, d, th);
}
static inline int dt_trans_cb_add(struct thandle *th,
return dt->do_ops->do_write_locked(env, dt);
}
+static inline int dt_declare_attr_get(const struct lu_env *env,
+ struct dt_object *dt,
+ struct lustre_capa *capa)
+{
+ LASSERT(dt);
+ LASSERT(dt->do_ops);
+ LASSERT(dt->do_ops->do_declare_attr_get);
+ return dt->do_ops->do_declare_attr_get(env, dt, capa);
+}
+
static inline int dt_attr_get(const struct lu_env *env, struct dt_object *dt,
struct lu_attr *la, void *arg)
{
return dt->do_ops->do_xattr_set(env, dt, buf, name, fl, th, capa);
}
+static inline int dt_declare_xattr_get(const struct lu_env *env,
+ struct dt_object *dt,
+ struct lu_buf *buf,
+ const char *name,
+ struct lustre_capa *capa)
+{
+ LASSERT(dt);
+ LASSERT(dt->do_ops);
+ LASSERT(dt->do_ops->do_declare_xattr_get);
+ return dt->do_ops->do_declare_xattr_get(env, dt, buf, name, capa);
+}
+
static inline int dt_xattr_get(const struct lu_env *env,
struct dt_object *dt, struct lu_buf *buf,
const char *name, struct lustre_capa *capa)
struct dt_object_format dti_dof;
struct lustre_mdt_attrs dti_lma;
struct lu_buf dti_lb;
+ struct lu_object_conf dti_conf;
loff_t dti_off;
};
void dt_global_fini(void);
# ifdef LPROCFS
+#ifndef HAVE_ONLY_PROCFS_SEQ
int lprocfs_dt_rd_blksize(char *page, char **start, off_t off,
int count, int *eof, void *data);
int lprocfs_dt_rd_kbytestotal(char *page, char **start, off_t off,
int count, int *eof, void *data);
int lprocfs_dt_rd_filesfree(char *page, char **start, off_t off,
int count, int *eof, void *data);
+#endif
+int lprocfs_dt_blksize_seq_show(struct seq_file *m, void *v);
+int lprocfs_dt_kbytestotal_seq_show(struct seq_file *m, void *v);
+int lprocfs_dt_kbytesfree_seq_show(struct seq_file *m, void *v);
+int lprocfs_dt_kbytesavail_seq_show(struct seq_file *m, void *v);
+int lprocfs_dt_filestotal_seq_show(struct seq_file *m, void *v);
+int lprocfs_dt_filesfree_seq_show(struct seq_file *m, void *v);
# endif /* LPROCFS */
#endif /* __LUSTRE_DT_OBJECT_H */