* Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
* Use is subject to license terms.
*
- * Copyright (c) 2011, 2014, Intel Corporation.
+ * Copyright (c) 2011, 2015, Intel Corporation.
*/
/*
* This file is part of Lustre, http://www.lustre.org/
#include <lustre_handles.h>
#include <lustre_intent.h>
#include <lvfs.h>
+#include <lustre_quota.h>
#define MAX_OBD_DEVICES 8192
*/
#define OBD_MAX_DEFAULT_EA_SIZE 4096
+enum obd_cl_sem_lock_class {
+ OBD_CLI_SEM_NORMAL,
+ OBD_CLI_SEM_MGC,
+ OBD_CLI_SEM_MDCOSC,
+};
+
struct mdc_rpc_lock;
struct obd_import;
struct client_obd {
unsigned long cl_dirty_transit; /* dirty synchronous */
unsigned long cl_avail_grant; /* bytes of credit for ost */
unsigned long cl_lost_grant; /* lost credits (trunc) */
+ /* grant consumed for dirty pages */
+ unsigned long cl_dirty_grant;
/* since we allocate grant by blocks, we don't know how many grant will
* be used to add a page into cache. As a solution, we reserve maximum
/* A chunk is an optimal size used by osc_extent to determine
* the extent size. A chunk is max(PAGE_CACHE_SIZE, OST block size) */
int cl_chunkbits;
- unsigned int cl_extent_tax; /* extent overhead, by bytes */
+ /* extent insertion metadata overhead to be accounted in grant,
+ * in bytes */
+ unsigned int cl_grant_extent_tax;
+ /* maximum extent size, in number of pages */
+ unsigned int cl_max_extent_pages;
/* keep track of objects that have lois that contain pages which
* have been queued for async brw. this lock also protects the
* An unstable page is a page state that WRITE RPC has finished but
* the transaction has NOT yet committed. */
atomic_long_t cl_unstable_count;
+ /** Link to osc_shrinker_list */
+ struct list_head cl_shrink_list;
/* number of in flight destroy rpcs is limited to max_rpcs_in_flight */
atomic_t cl_destroy_in_flight;
void *cl_writeback_work;
void *cl_lru_work;
/* hash tables for osc_quota_info */
- struct cfs_hash *cl_quota_hash[MAXQUOTAS];
+ struct cfs_hash *cl_quota_hash[LL_MAXQUOTAS];
};
#define obd2cli_tgt(obd) ((char *)(obd)->u.cli.cl_target_uuid.uuid)
unsigned long ltd_active:1; /* target up for requests */
};
-enum placement_policy {
- PLACEMENT_CHAR_POLICY = 0,
- PLACEMENT_NID_POLICY = 1,
- PLACEMENT_INVAL_POLICY = 2,
- PLACEMENT_MAX_POLICY
-};
-
-typedef enum placement_policy placement_policy_t;
-
struct lmv_obd {
int refcount;
struct lu_client_fld lmv_fld;
spinlock_t lmv_lock;
- placement_policy_t lmv_placement;
struct lmv_desc desc;
struct obd_uuid cluuid;
struct obd_export *exp;
__u32 lnb_page_offset;
__u32 lnb_len;
__u32 lnb_flags;
+ int lnb_rc;
struct page *lnb_page;
void *lnb_data;
- int lnb_rc;
};
#define LUSTRE_FLD_NAME "fld"
#define OBD_DEVICE_MAGIC 0XAB5CD6EF
struct obd_device {
- struct obd_type *obd_type;
- __u32 obd_magic;
+ struct obd_type *obd_type;
+ __u32 obd_magic; /* OBD_DEVICE_MAGIC */
+ int obd_minor; /* device number: lctl dl */
+ struct lu_device *obd_lu_dev;
- /* common and UUID name of this device */
- char obd_name[MAX_OBD_NAME];
- struct obd_uuid obd_uuid;
- int obd_minor;
- struct lu_device *obd_lu_dev;
+ /* common and UUID name of this device */
+ struct obd_uuid obd_uuid;
+ char obd_name[MAX_OBD_NAME];
/* bitfield modification is protected by obd_dev_lock */
unsigned long
obd_recovering:1, /* there are recoverable clients */
obd_abort_recovery:1, /* recovery expired */
obd_version_recov:1, /* obd uses version checking */
- obd_replayable:1, /* recovery is enabled;
- * inform clients */
+ obd_replayable:1, /* recovery enabled; inform clients */
obd_no_transno:1, /* no committed-transno notification */
obd_no_recov:1, /* fail instead of retry messages */
obd_stopping:1, /* started cleanup */
* (for /proc/status only!!) */
obd_no_ir:1, /* no imperative recovery. */
obd_process_conf:1, /* device is processing mgs config */
- obd_uses_nid_stats:1, /* maintain per-client OBD stats */
- obd_force_abort_recovery:1; /* abort recovery forcely */
+ obd_uses_nid_stats:1; /* maintain per-client OBD stats */
/* use separate field as it is set in interrupt to don't mess with
* protection of other bits using _bh lock */
/* client_generation-export hash body */
struct cfs_hash *obd_gen_hash;
struct list_head obd_nid_stats;
- atomic_t obd_refcount;
struct list_head obd_exports;
struct list_head obd_unlinked_exports;
struct list_head obd_delayed_exports;
struct list_head obd_lwp_list;
+ atomic_t obd_refcount;
int obd_num_exports;
spinlock_t obd_nid_lock;
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 */
spinlock_t obd_dev_lock; /* protect OBD bitfield above */
- struct mutex obd_dev_mutex;
- __u64 obd_last_committed;
spinlock_t obd_osfs_lock;
struct obd_statfs obd_osfs; /* locked by obd_osfs_lock */
__u64 obd_osfs_age;
+ __u64 obd_last_committed;
+ struct mutex obd_dev_mutex;
struct lvfs_run_ctxt obd_lvfs_ctxt;
struct obd_llog_group obd_olg; /* default llog group */
struct obd_device *obd_observer;
int obd_recovery_ir_factor;
/* new recovery stuff from CMD2 */
- struct target_recovery_data obd_recovery_data;
int obd_replayed_locks;
atomic_t obd_req_replay_clients;
atomic_t obd_lock_replay_clients;
+ struct target_recovery_data obd_recovery_data;
+
/* all lists are protected by obd_recovery_task_lock */
struct list_head obd_req_replay_queue;
struct list_head obd_lock_replay_queue;
struct lov_obd lov;
struct lmv_obd lmv;
} u;
+
/* Fields used by LProcFS */
- unsigned int obd_cntr_base;
- struct lprocfs_stats *obd_stats;
+ struct lprocfs_stats *obd_stats;
+ unsigned int obd_cntr_base;
- unsigned int obd_md_cntr_base;
- struct lprocfs_stats *obd_md_stats;
+ unsigned int obd_md_cntr_base;
+ struct lprocfs_stats *obd_md_stats;
struct proc_dir_entry *obd_proc_entry;
struct proc_dir_entry *obd_proc_exports_entry;
wait_queue_head_t obd_evict_inprogress_waitq;
struct list_head obd_evict_list; /* protected with pet_lock */
- /**
- * Ldlm pool part. Save last calculated SLV and Limit.
- */
- rwlock_t obd_pool_lock;
- int obd_pool_limit;
- __u64 obd_pool_slv;
+ /**
+ * LDLM pool part. Save last calculated SLV and Limit.
+ */
+ rwlock_t obd_pool_lock;
+ __u64 obd_pool_slv;
+ int obd_pool_limit;
- /**
- * A list of outstanding class_incref()'s against this obd. For
- * debugging.
- */
- struct lu_ref obd_reference;
+ int obd_conn_inprogress;
- int obd_conn_inprogress;
+ /**
+ * List of outstanding class_incref()'s fo this OBD. For debugging. */
+ struct lu_ref obd_reference;
};
/* get/set_info keys */
struct lu_context;
-/* /!\ must be coherent with include/linux/namei.h on patched kernel */
-#define IT_OPEN (1 << 0)
-#define IT_CREAT (1 << 1)
-#define IT_READDIR (1 << 2)
-#define IT_GETATTR (1 << 3)
-#define IT_LOOKUP (1 << 4)
-#define IT_UNLINK (1 << 5)
-#define IT_TRUNC (1 << 6)
-#define IT_GETXATTR (1 << 7)
-#define IT_EXEC (1 << 8)
-#define IT_PIN (1 << 9)
-#define IT_LAYOUT (1 << 10)
-#define IT_QUOTA_DQACQ (1 << 11)
-#define IT_QUOTA_CONN (1 << 12)
-#define IT_SETXATTR (1 << 13)
-
static inline int it_to_lock_mode(struct lookup_intent *it)
{
/* CREAT needs to be tested before open (both could be set) */
#ifdef CONFIG_FS_POSIX_ACL
struct posix_acl *posix_acl;
#endif
- struct mdt_remote_perm *remote_perm;
};
struct md_open_data {
#define MD_STATS_LAST_OP m_revalidate_lock
- int (*m_getstatus)(struct obd_export *, struct lu_fid *);
+ int (*m_get_root)(struct obd_export *, const char *, struct lu_fid *);
int (*m_null_inode)(struct obd_export *, const struct lu_fid *);
- int (*m_find_cbdata)(struct obd_export *, const struct lu_fid *,
- ldlm_iterator_t, void *);
-
int (*m_getattr_name)(struct obd_export *, struct md_op_data *,
struct ptlrpc_request **);
int (*m_clear_open_replay_data)(struct obd_export *,
struct obd_client_handle *);
- int (*m_set_lock_data)(struct obd_export *, __u64 *, void *, __u64 *);
+ int (*m_set_lock_data)(struct obd_export *,
+ const struct lustre_handle *, void *, __u64 *);
enum ldlm_mode (*m_lock_match)(struct obd_export *, __u64,
const struct lu_fid *, enum ldlm_type,
union ldlm_policy_data *, enum ldlm_mode,
enum ldlm_cancel_flags flags, void *opaque);
- int (*m_get_remote_perm)(struct obd_export *, const struct lu_fid *,
- u32, struct ptlrpc_request **);
-
int (*m_get_fid_from_lsm)(struct obd_export *,
const struct lmv_stripe_md *,
const char *name, int namelen,