X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fquota%2Flquota_internal.h;h=2629882cb549b91beb2efb3ad1b468ff7f868a10;hb=refs%2Fchanges%2F94%2F39394%2F5;hp=ab1eab033ca5e024d7e1d13fb940dd13297b909e;hpb=530881fe4ee20b56b0426a5c4d3a2b5226768d06;p=fs%2Flustre-release.git diff --git a/lustre/quota/lquota_internal.h b/lustre/quota/lquota_internal.h index ab1eab0..2629882 100644 --- a/lustre/quota/lquota_internal.h +++ b/lustre/quota/lquota_internal.h @@ -76,12 +76,12 @@ struct lquota_entry_operations { /* Read quota settings from disk and update lquota entry */ int (*lqe_read)(const struct lu_env *, struct lquota_entry *, - void *arg); + void *arg, bool find); /* Print debug information about a given lquota entry */ void (*lqe_debug)(struct lquota_entry *, void *, - struct libcfs_debug_msg_data *, const char *, - va_list); + struct libcfs_debug_msg_data *, + struct va_format *vaf); }; /* Per-ID information specific to the quota master target */ @@ -171,6 +171,8 @@ struct lquota_entry { /* current quota settings/usage of this ID */ __u64 lqe_granted; /* granted limit, inodes or kbytes */ + /* used in quota pool recalc process (only on QMT) */ + __u64 lqe_recalc_granted; __u64 lqe_qunit; /* [ib]unit size, inodes or kbytes */ union { struct lquota_mst_entry me; /* params specific to QMT */ @@ -183,7 +185,32 @@ struct lquota_entry { lqe_edquot:1, /* id out of quota space on QMT */ lqe_gl:1, /* glimpse is in progress */ lqe_nopreacq:1, /* pre-acquire disabled */ - lqe_is_default:1; /* the default quota is used */ + lqe_is_default:1, /* the default quota is used */ + lqe_is_global:1; /* lqe belongs to global pool "0x0"*/ + + struct lqe_glbl_data *lqe_glbl_data; +}; + +#define lqe_qtype(lqe) (lqe->lqe_site->lqs_qtype) +#define lqe_rtype(lqe) (lqe2qpi(lqe)->qpi_rtype) + +struct lqe_glbl_entry { + __u64 lge_qunit; + unsigned long lge_edquot:1, + /* true when minimum qunit is set */ + lge_qunit_set:1, + /* qunit or edquot is changed - need + * to send glimpse to appropriate slave */ + lge_qunit_nu:1, + lge_edquot_nu:1; +}; + +struct lqe_glbl_data { + struct lqe_glbl_entry *lqeg_arr; + /* number of initialised entries */ + int lqeg_num_used; + /* number of allocated entries */ + int lqeg_num_alloc; }; /* Compartment within which lquota_entry are unique. @@ -295,7 +322,7 @@ static inline void lqe_read_unlock(struct lquota_entry *lqe) #define LQUOTA_LEAST_QUNIT(type) \ (type == LQUOTA_RES_MD ? (1 << 10) : toqb(OFD_MAX_BRW_SIZE)) -static inline int lquota_over_fl(int qtype) +static inline enum osd_quota_local_flags lquota_over_fl(int qtype) { switch (qtype) { case USRQUOTA: @@ -334,15 +361,7 @@ extern struct lu_context_key lquota_thread_key; static inline struct lquota_thread_info *lquota_info(const struct lu_env *env) { - struct lquota_thread_info *info; - - info = lu_context_key_get(&env->le_ctx, &lquota_thread_key); - if (info == NULL) { - lu_env_refill((struct lu_env *)env); - info = lu_context_key_get(&env->le_ctx, &lquota_thread_key); - } - LASSERT(info); - return info; + return lu_env_info(env, &lquota_thread_key); } #define req_is_acq(flags) ((flags & QUOTA_DQACQ_FL_ACQ) != 0) @@ -378,11 +397,37 @@ void lquota_lqe_debug0(struct lquota_entry *lqe, #define LQUOTA_CONSOLE(lqe, fmt, a...) \ LQUOTA_DEBUG_LIMIT(D_CONSOLE, lqe, fmt, ## a) -#define LQUOTA_DEBUG(lock, fmt, a...) do { \ +#define LQUOTA_ELEVEL_LQES(level, env, fmt, a...) do { \ + int i; \ + for (i = 0; i < qti_lqes_cnt(env); i++) { \ + LQUOTA_##level(qti_lqes(env)[i], fmt, ##a); \ + } \ +} while (0) +#define LQUOTA_WARN_LQES(lqe, fmt, a...) \ + LQUOTA_ELEVEL_LQES(WARN, env, fmt, ##a) +#define LQUOTA_CONSOLE_LQES(lqe, fmt, a...) \ + LQUOTA_ELEVEL_LQES(CONSOLE, env, fmt, ##a) +#define LQUOTA_ERROR_LQES(lqe, fmt, a...) \ + LQUOTA_ELEVEL_LQES(ERROR, env, fmt, ##a) + +#define LQUOTA_DEBUG(lqe, fmt, a...) do { \ LIBCFS_DEBUG_MSG_DATA_DECL(msgdata, D_QUOTA, NULL); \ lquota_lqe_debug(&msgdata, D_QUOTA, NULL, lqe, "$$$ "fmt" ", ##a); \ } while (0) + +#define LQUOTA_DEBUG_LQES(env, fmt, a...) do { \ + int i; \ + for (i = 0; i < qti_lqes_cnt(env); i++) { \ + LQUOTA_DEBUG(qti_lqes(env)[i], fmt, ##a); \ + } \ +} while (0) + + #else /* !LIBCFS_DEBUG */ +# define LQUOTA_DEBUG_LQES(lqe, fmt, a...) ((void)0) +# define LQUOTA_ERROR_LQES(lqe, fmt, a...) ((void)0) +# define LQUOTA_WARN_LQES(lqe, fmt, a...) ((void)0) +# define LQUOTA_CONSOLE_LQES(lqe, fmt, a...) ((void)0) # define LQUOTA_DEBUG(lqe, fmt, a...) ((void)0) # define LQUOTA_ERROR(lqe, fmt, a...) ((void)0) # define LQUOTA_WARN(lqe, fmt, a...) ((void)0) @@ -394,8 +439,8 @@ void lquota_lqe_debug0(struct lquota_entry *lqe, /* lquota_lib.c */ 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(const struct lu_fid *, int *, int *, int *); +void lquota_generate_fid(struct lu_fid *, int, int); +int lquota_extract_fid(const struct lu_fid *, int *, int *); const struct dt_index_features *glb_idx_feature(struct lu_fid *); /* lquota_entry.c */ @@ -404,8 +449,11 @@ struct lquota_site *lquota_site_alloc(const struct lu_env *, void *, bool, short, struct lquota_entry_operations *); void lquota_site_free(const struct lu_env *, struct lquota_site *); /* quota entry operations */ -struct lquota_entry *lqe_locate(const struct lu_env *, struct lquota_site *, - union lquota_id *); +#define lqe_locate(env, site, id) lqe_locate_find(env, site, id, false) +#define lqe_find(env, site, id) lqe_locate_find(env, site, id, true) +struct lquota_entry *lqe_locate_find(const struct lu_env *, + struct lquota_site *, + union lquota_id *, bool); /* lquota_disk.c */ struct dt_object *lquota_disk_dir_find_create(const struct lu_env *, @@ -445,7 +493,7 @@ int qmt_glb_init(void); void qmt_glb_fini(void); /* lproc_quota.c */ -extern struct file_operations lprocfs_quota_seq_fops; +extern const struct file_operations lprocfs_quota_seq_fops; /* qsd_lib.c */ int qsd_glb_init(void);