X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fquota%2Flquota_internal.h;h=e80b25b07605ed447698ede6d0a283f938e20037;hb=e089a515efae3391709b997be889ebe0f3306e9d;hp=fd88fe98a1bce493fbd06952e2b2f858680cbcda;hpb=2d08f9070c8686ee4851036091c966563672ba49;p=fs%2Flustre-release.git diff --git a/lustre/quota/lquota_internal.h b/lustre/quota/lquota_internal.h index fd88fe9..e80b25b 100644 --- a/lustre/quota/lquota_internal.h +++ b/lustre/quota/lquota_internal.h @@ -21,17 +21,18 @@ * GPL HEADER END */ /* - * Copyright (c) 2012 Whamcloud, Inc. + * Copyright (c) 2012, Intel Corporation. * Use is subject to license terms. */ #include -#include +#include #ifndef _LQUOTA_INTERNAL_H #define _LQUOTA_INTERNAL_H #define QTYPE_NAME(qtype) ((qtype) == USRQUOTA ? "usr" : "grp") +#define RES_NAME(res) ((res) == LQUOTA_RES_MD ? "md" : "dt") #define QIF_IFLAGS (QIF_INODES | QIF_ITIME | QIF_ILIMITS) #define QIF_BFLAGS (QIF_SPACE | QIF_BTIME | QIF_BLIMITS) @@ -84,7 +85,7 @@ struct lquota_mst_entry { /* r/w semaphore used to protect concurrent access to the quota * parameters which are stored on disk */ - cfs_rw_semaphore_t lme_sem; + struct rw_semaphore lme_sem; /* quota space that may be released after glimpse */ __u64 lme_may_rel; @@ -112,16 +113,22 @@ struct lquota_slv_entry { unsigned int lse_pending_req; /* rw spinlock protecting in-memory counters (i.e. lse_pending*) */ - cfs_rwlock_t lse_lock; + rwlock_t lse_lock; /* waiter for pending request done */ - cfs_waitq_t lse_waiters; + wait_queue_head_t lse_waiters; /* hint on current on-disk usage, in inodes or kbytes */ __u64 lse_usage; /* time to trigger quota adjust */ __u64 lse_adjust_time; + + /* return code of latest acquire RPC */ + int lse_acq_rc; + + /* when latest acquire RPC completed */ + __u64 lse_acq_time; }; /* In-memory entry for each enforced quota id @@ -199,6 +206,8 @@ struct lquota_site { #define lqe_usage u.se.lse_usage #define lqe_adjust_time u.se.lse_adjust_time #define lqe_lockh u.se.lse_lockh +#define lqe_acq_rc u.se.lse_acq_rc +#define lqe_acq_time u.se.lse_acq_time #define LQUOTA_BUMP_VER 0x1 #define LQUOTA_SET_VER 0x2 @@ -206,11 +215,13 @@ struct lquota_site { /* helper routine to get/put reference on lquota_entry */ static inline void lqe_getref(struct lquota_entry *lqe) { + LASSERT(lqe != NULL); cfs_atomic_inc(&lqe->lqe_ref); } static inline void lqe_putref(struct lquota_entry *lqe) { + LASSERT(lqe != NULL); LASSERT(atomic_read(&lqe->lqe_ref) > 0); if (atomic_dec_and_test(&lqe->lqe_ref)) OBD_FREE_PTR(lqe); @@ -225,35 +236,46 @@ static inline int lqe_is_master(struct lquota_entry *lqe) static inline void lqe_write_lock(struct lquota_entry *lqe) { if (lqe_is_master(lqe)) - cfs_down_write(&lqe->lqe_sem); + down_write(&lqe->lqe_sem); else - cfs_write_lock(&lqe->lqe_lock); + write_lock(&lqe->lqe_lock); } static inline void lqe_write_unlock(struct lquota_entry *lqe) { if (lqe_is_master(lqe)) - cfs_up_write(&lqe->lqe_sem); + up_write(&lqe->lqe_sem); else - cfs_write_unlock(&lqe->lqe_lock); + write_unlock(&lqe->lqe_lock); } static inline void lqe_read_lock(struct lquota_entry *lqe) { if (lqe_is_master(lqe)) - cfs_down_read(&lqe->lqe_sem); + down_read(&lqe->lqe_sem); else - cfs_read_lock(&lqe->lqe_lock); + read_lock(&lqe->lqe_lock); } static inline void lqe_read_unlock(struct lquota_entry *lqe) { if (lqe_is_master(lqe)) - cfs_up_read(&lqe->lqe_sem); + up_read(&lqe->lqe_sem); else - cfs_read_unlock(&lqe->lqe_lock); + read_unlock(&lqe->lqe_lock); } +/* + * Helper functions & prototypes + */ + +/* minimum qunit size, 1K inode for metadata pool and 1MB for data pool */ +#define LQUOTA_LEAST_QUNIT(type) \ + (type == LQUOTA_RES_MD ? (1 << 10) : toqb(OFD_MAX_BRW_SIZE)) + +#define LQUOTA_OVER_FL(type) \ + (type == USRQUOTA ? QUOTA_FL_OVER_USRQUOTA : QUOTA_FL_OVER_GRPQUOTA) + /* Common data shared by quota-level handlers. This is allocated per-thread to * reduce stack consumption */ struct lquota_thread_info { @@ -290,6 +312,11 @@ struct lquota_thread_info *lquota_info(const struct lu_env *env) return info; } +#define req_is_acq(flags) ((flags & QUOTA_DQACQ_FL_ACQ) != 0) +#define req_is_preacq(flags) ((flags & QUOTA_DQACQ_FL_PREACQ) != 0) +#define req_is_rel(flags) ((flags & QUOTA_DQACQ_FL_REL) != 0) +#define req_has_rep(flags) ((flags & QUOTA_DQACQ_FL_REPORT) != 0) + /* debugging macros */ #ifdef LIBCFS_DEBUG #define lquota_lqe_debug(msgdata, mask, cdls, lqe, fmt, a...) do { \ @@ -335,8 +362,9 @@ void lquota_lqe_debug0(struct lquota_entry *lqe, struct dt_object *acct_obj_lookup(const struct lu_env *, struct dt_device *, int); void lquota_generate_fid(struct lu_fid *, int, int, int); -int lquota_extract_fid(struct lu_fid *, int *, int *, int *); +int lquota_extract_fid(const struct lu_fid *, int *, int *, int *); const struct dt_index_features *glb_idx_feature(struct lu_fid *); +extern struct kmem_cache *lqe_kmem; /* lquota_entry.c */ /* site create/destroy */ @@ -366,7 +394,8 @@ int lquota_disk_for_each_slv(const struct lu_env *, struct dt_object *, struct lu_fid *, lquota_disk_slv_cb_t, void *); struct dt_object *lquota_disk_slv_find(const struct lu_env *, struct dt_device *, struct dt_object *, - struct lu_fid *, struct obd_uuid *); + const struct lu_fid *, + struct obd_uuid *); int lquota_disk_read(const struct lu_env *, struct dt_object *, union lquota_id *, struct dt_rec *); int lquota_disk_declare_write(const struct lu_env *, struct thandle *, @@ -377,6 +406,10 @@ int lquota_disk_write(const struct lu_env *, struct thandle *, int lquota_disk_update_ver(const struct lu_env *, struct dt_device *, struct dt_object *, __u64); +/* qmt_dev.c */ +int qmt_glb_init(void); +void qmt_glb_fini(void); + /* lproc_quota.c */ extern struct file_operations lprocfs_quota_seq_fops;