* Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
* Use is subject to license terms.
*
- * Copyright (c) 2012, 2013, Intel Corporation.
+ * Copyright (c) 2012, 2014, Intel Corporation.
*/
/*
* This file is part of Lustre, http://www.lustre.org/
#include <lustre_fid.h>
#include <lustre_update.h>
#include <lu_target.h>
+#include <lustre_mdc.h>
/*
* Infrastructure to support tracking of last committed llog record
struct obd_uuid opd_cluuid;
struct obd_connect_data *opd_connect_data;
int opd_connects;
- cfs_proc_dir_entry_t *opd_proc_entry;
+ struct proc_dir_entry *opd_proc_entry;
struct lprocfs_stats *opd_stats;
/* connection status. */
unsigned int opd_new_connection:1,
unsigned long opd_syn_last_processed_id;
struct osp_id_tracker *opd_syn_tracker;
struct list_head opd_syn_ontrack;
+ /* stop processing new requests until barrier=0 */
+ atomic_t opd_syn_barrier;
+ wait_queue_head_t opd_syn_barrier_waitq;
/*
* statfs related fields: OSP maintains it on its own
/* how often to update statfs data */
int opd_statfs_maxage;
- cfs_proc_dir_entry_t *opd_symlink;
+ struct proc_dir_entry *opd_symlink;
/* If the caller wants to do some idempotent async operations on
* remote server, it can append the async remote requests on the
struct dt_update_request *opd_async_requests;
/* Protect current operations on opd_async_requests. */
struct mutex opd_async_requests_mutex;
+ struct list_head opd_async_updates;
+ struct rw_semaphore opd_async_updates_rwsem;
+ atomic_t opd_async_updates_count;
};
#define opd_pre_lock opd_pre->osp_pre_lock
struct list_head oxe_list;
atomic_t oxe_ref;
void *oxe_value;
- int oxe_buflen;
- int oxe_namelen;
- int oxe_vallen;
+ size_t oxe_buflen;
+ size_t oxe_namelen;
+ size_t oxe_vallen;
unsigned int oxe_exist:1,
oxe_ready:1;
char oxe_buf[0];
struct lu_object_header opo_header;
struct dt_object opo_obj;
unsigned int opo_reserved:1,
- opo_new:1,
opo_non_exist:1;
/* read/write lock for md osp object */
struct lu_attr osi_attr;
struct ost_id osi_oi;
struct ost_id osi_oi2;
- obd_id osi_id;
+ u64 osi_id;
loff_t osi_off;
union {
struct llog_rec_hdr osi_hdr;
struct osp_it {
__u32 ooi_pos_page;
__u32 ooi_pos_lu_page;
+ __u32 ooi_attr;
int ooi_pos_ent;
int ooi_total_npages;
int ooi_valid_npages;
static inline void osp_objid_buf_prep(struct lu_buf *buf, loff_t *off,
__u32 *id, int index)
{
+ /* Note: through id is only 32 bits, it will also write 64 bits
+ * for oid to keep compatibility with the previous version. */
buf->lb_buf = (void *)id;
- buf->lb_len = sizeof(obd_id);
- *off = sizeof(obd_id) * index;
+ buf->lb_len = sizeof(u64);
+ *off = sizeof(u64) * index;
}
static inline void osp_objseq_buf_prep(struct lu_buf *buf, loff_t *off,
__u64 *seq, int index)
{
buf->lb_buf = (void *)seq;
- buf->lb_len = sizeof(obd_id);
- *off = sizeof(obd_id) * index;
+ buf->lb_len = sizeof(u64);
+ *off = sizeof(u64) * index;
}
static inline void osp_buf_prep(struct lu_buf *lb, void *buf, int buf_len)
}
#define osp_init_rpc_lock(lck) mdc_init_rpc_lock(lck)
-#define osp_get_rpc_lock(lck, it) mdc_get_rpc_lock(lck, it)
-#define osp_put_rpc_lock(lck, it) mdc_put_rpc_lock(lck, it)
+
+static inline void osp_get_rpc_lock(struct osp_device *osp)
+{
+ struct mdc_rpc_lock *rpc_lock = osp->opd_obd->u.cli.cl_rpc_lock;
+
+ mdc_get_rpc_lock(rpc_lock, NULL);
+}
+
+static inline void osp_put_rpc_lock(struct osp_device *osp)
+{
+ struct mdc_rpc_lock *rpc_lock = osp->opd_obd->u.cli.cl_rpc_lock;
+
+ mdc_put_rpc_lock(rpc_lock, NULL);
+}
static inline int osp_fid_diff(const struct lu_fid *fid1,
const struct lu_fid *fid2)
return imp->imp_connect_data.ocd_connect_flags & OBD_CONNECT_FID;
}
-typedef int (*osp_async_update_interpterer_t)(const struct lu_env *env,
- struct object_update_reply *reply,
- struct ptlrpc_request *req,
- struct osp_object *obj,
- void *data, int index, int rc);
+typedef int (*osp_async_request_interpreter_t)(const struct lu_env *env,
+ struct object_update_reply *rep,
+ struct ptlrpc_request *req,
+ struct osp_object *obj,
+ void *data, int index, int rc);
/* osp_dev.c */
-void osp_update_last_id(struct osp_device *d, obd_id objid);
+void osp_update_last_id(struct osp_device *d, u64 objid);
extern struct llog_operations osp_mds_ost_orig_logops;
/* osp_trans.c */
-struct dt_update_request *
-osp_find_or_create_async_update_request(struct osp_device *osp);
-int osp_insert_async_update(const struct lu_env *env,
- struct dt_update_request *update, int op,
- struct osp_object *obj, int count,
- int *lens, const char **bufs, void *data,
- osp_async_update_interpterer_t interpterer);
-int osp_unplug_async_update(const struct lu_env *env,
- struct osp_device *osp,
- struct dt_update_request *update);
+int osp_insert_async_request(const struct lu_env *env, enum update_type op,
+ struct osp_object *obj, int count, __u16 *lens,
+ const void **bufs, void *data,
+ osp_async_request_interpreter_t interpreter);
+int osp_unplug_async_request(const struct lu_env *env,
+ struct osp_device *osp,
+ struct dt_update_request *update);
struct thandle *osp_trans_create(const struct lu_env *env,
struct dt_device *d);
int osp_trans_start(const struct lu_env *env, struct dt_device *dt,
struct thandle *th);
-
+int osp_prep_update_req(const struct lu_env *env, struct obd_import *imp,
+ const struct object_update_request *ureq,
+ struct ptlrpc_request **reqp);
+int osp_remote_sync(const struct lu_env *env, struct osp_device *osp,
+ struct dt_update_request *update,
+ struct ptlrpc_request **reqp, bool rpc_lock);
/* osp_object.c */
int osp_attr_get(const struct lu_env *env, struct dt_object *dt,
- struct lu_attr *attr, struct lustre_capa *capa);
+ struct lu_attr *attr);
int osp_xattr_get(const struct lu_env *env, struct dt_object *dt,
- struct lu_buf *buf, const char *name,
- struct lustre_capa *capa);
+ struct lu_buf *buf, const char *name);
int osp_declare_xattr_set(const struct lu_env *env, struct dt_object *dt,
const struct lu_buf *buf, const char *name,
int flag, struct thandle *th);
int osp_xattr_set(const struct lu_env *env, struct dt_object *dt,
const struct lu_buf *buf, const char *name, int fl,
- struct thandle *th, struct lustre_capa *capa);
+ struct thandle *th);
int osp_declare_xattr_del(const struct lu_env *env, struct dt_object *dt,
const char *name, struct thandle *th);
int osp_xattr_del(const struct lu_env *env, struct dt_object *dt,
- const char *name, struct thandle *th,
- struct lustre_capa *capa);
+ const char *name, struct thandle *th);
int osp_declare_object_destroy(const struct lu_env *env,
struct dt_object *dt, struct thandle *th);
struct thandle *th);
struct dt_it *osp_it_init(const struct lu_env *env, struct dt_object *dt,
- __u32 attr, struct lustre_capa *capa);
+ __u32 attr);
void osp_it_fini(const struct lu_env *env, struct dt_it *di);
int osp_it_get(const struct lu_env *env, struct dt_it *di,
const struct dt_key *key);
int osp_md_object_create(const struct lu_env *env, struct dt_object *dt,
struct lu_attr *attr, struct dt_allocation_hint *hint,
struct dt_object_format *dof, struct thandle *th);
-int osp_md_declare_attr_set(const struct lu_env *env, struct dt_object *dt,
- const struct lu_attr *attr, struct thandle *th);
-int osp_md_attr_set(const struct lu_env *env, struct dt_object *dt,
- const struct lu_attr *attr, struct thandle *th,
- struct lustre_capa *capa);
+int __osp_md_attr_set(const struct lu_env *env, struct dt_object *dt,
+ const struct lu_attr *attr, struct thandle *th);
extern const struct dt_index_operations osp_md_index_ops;
/* osp_precreate.c */