/* 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 *,
/* 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 */
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.
#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:
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)
#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)
/* 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 */
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 *,