cfs_list_t loi_hp_ready_item;
cfs_list_t loi_write_item;
cfs_list_t loi_read_item;
-
+ cfs_list_t loi_sync_fs_item;
unsigned long loi_kms_valid:1;
__u64 loi_kms; /* known minimum size */
struct ost_lvb loi_lvb;
CFS_INIT_LIST_HEAD(&loi->loi_hp_ready_item);
CFS_INIT_LIST_HEAD(&loi->loi_write_item);
CFS_INIT_LIST_HEAD(&loi->loi_read_item);
+ CFS_INIT_LIST_HEAD(&loi->loi_sync_fs_item);
}
struct lov_stripe_md {
typedef int (*obd_enqueue_update_f)(void *cookie, int rc);
+struct osc_sync_fs_wait {
+ struct obd_info *sfw_oi;
+ obd_enqueue_update_f sfw_upcall;
+ int started;
+};
+
/* obd info for a particular level (lov, osc). */
struct obd_info {
/* Lock policy. It keeps an extent which is specific for a particular
int fo_tot_granted_clients;
obd_size fo_readcache_max_filesize;
+ cfs_spinlock_t fo_flags_lock;
int fo_read_cache:1, /**< enable read-only cache */
fo_writethrough_cache:1,/**< read cache writes */
fo_mds_ost_sync:1, /**< MDS-OST orphan recovery*/
cfs_list_t cl_loi_hp_ready_list;
cfs_list_t cl_loi_write_list;
cfs_list_t cl_loi_read_list;
+ cfs_list_t cl_loi_sync_fs_list;
int cl_r_in_flight;
int cl_w_in_flight;
/* just a sum of the loi/lop pending numbers to be exported by /proc */
struct lu_client_seq *cl_seq;
cfs_atomic_t cl_resends; /* resend count */
+ struct osc_sync_fs_wait cl_sf_wait;
};
+
#define obd2cli_tgt(obd) ((char *)(obd)->u.cli.cl_target_uuid.uuid)
#define CL_NOT_QUOTACHECKED 1 /* client->cl_qchk_stat init value */
* Events signalled through obd_notify() upcall-chain.
*/
enum obd_notify_event {
+ /* target added */
+ OBD_NOTIFY_CREATE,
/* Device connect start */
OBD_NOTIFY_CONNECT,
/* Device activated */
#define MAX_OBD_NAME 128
#define OBD_DEVICE_MAGIC 0XAB5CD6EF
#define OBD_DEV_BY_DEVNAME 0xffffd0de
+
struct obd_device {
struct obd_type *obd_type;
__u32 obd_magic;
struct lu_device *obd_lu_dev;
int obd_minor;
+ /* bitfield modification is protected by obd_dev_lock */
unsigned long obd_attached:1, /* finished attach */
obd_set_up:1, /* finished setup */
obd_recovering:1, /* there are recoverable clients */
obd_abort_recovery:1,/* recovery expired */
obd_version_recov:1, /* obd uses version checking */
- obd_recovery_expired:1,
obd_replayable:1, /* recovery is enabled; inform clients */
obd_no_transno:1, /* no committed-transno notification */
obd_no_recov:1, /* fail instead of retry messages */
- obd_req_replaying:1, /* replaying requests */
obd_stopping:1, /* started cleanup */
obd_starting:1, /* started setup */
obd_force:1, /* cleanup with > 0 obd refcount */
obd_inactive:1, /* device active/inactive
* (for /proc/status only!!) */
obd_process_conf:1; /* device is processing mgs config */
+ /* use separate field as it is set in interrupt to don't mess with
+ * protection of other bits using _bh lock */
+ unsigned long obd_recovery_expired:1;
/* uuid-export hash body */
cfs_hash_t *obd_uuid_hash;
/* nid-export hash body */
struct ldlm_namespace *obd_namespace;
struct ptlrpc_client obd_ldlm_client; /* XXX OST/MDS only */
/* a spinlock is OK for what we do now, may need a semaphore later */
- cfs_spinlock_t obd_dev_lock;
+ cfs_spinlock_t obd_dev_lock; /* protects obd bitfield above */
cfs_semaphore_t obd_dev_sem;
__u64 obd_last_committed;
struct fsfilt_operations *obd_fsops;
int obd_connected_clients;
int obd_stale_clients;
int obd_delayed_clients;
- cfs_spinlock_t obd_processing_task_lock; /* BH lock (timer) */
+ /* this lock protects all recovery list_heads, timer and
+ * obd_next_recovery_transno value */
+ cfs_spinlock_t obd_recovery_task_lock;
__u64 obd_next_recovery_transno;
int obd_replayed_requests;
int obd_requests_queued_for_recovery;
cfs_waitq_t obd_next_transno_waitq;
+ /* protected by obd_recovery_task_lock */
cfs_timer_t obd_recovery_timer;
time_t obd_recovery_start; /* seconds */
time_t obd_recovery_end; /* seconds, for lprocfs_status */
int obd_replayed_locks;
cfs_atomic_t obd_req_replay_clients;
cfs_atomic_t obd_lock_replay_clients;
+ /* all lists are protected by obd_recovery_task_lock */
cfs_list_t obd_req_replay_queue;
cfs_list_t obd_lock_replay_queue;
cfs_list_t obd_final_req_queue;
struct lu_fid op_fid4; /* to the operation locks. */
mdsno_t op_mds; /* what mds server open will go to */
struct lustre_handle op_handle;
- __u64 op_mod_time;
+ obd_time op_mod_time;
const char *op_name;
int op_namelen;
__u32 op_mode;
struct obd_quotactl *);
int (*o_quota_adjust_qunit)(struct obd_export *exp,
struct quota_adjust_qunit *oqaq,
- struct lustre_quota_ctxt *qctxt);
+ struct lustre_quota_ctxt *qctxt,
+ struct ptlrpc_request_set *rqset);
int (*o_ping)(struct obd_export *exp);
char *ostname);
void (*o_getref)(struct obd_device *obd);
void (*o_putref)(struct obd_device *obd);
+ int (*o_sync_fs)(struct obd_device *obd, struct obd_info *oinfo,
+ int wait);
/*
* NOTE: If adding ops, add another LPROCFS_OBD_OP_INIT() line
* to lprocfs_alloc_obd_stats() in obdclass/lprocfs_status.c.