X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fquota%2Flquota_internal.h;h=323cec85b60ee8968812ab30e6bc4f02ee1dcc23;hb=b881bd1051451ed18610e0cc3c3cd56c8803cbc9;hp=5361b7d0a28a423b0c9a388878f93fb5803446da;hpb=2e2c8d59cfdb6d7078f9627ca970920059fcf90f;p=fs%2Flustre-release.git diff --git a/lustre/quota/lquota_internal.h b/lustre/quota/lquota_internal.h index 5361b7d..323cec8 100644 --- a/lustre/quota/lquota_internal.h +++ b/lustre/quota/lquota_internal.h @@ -21,32 +21,17 @@ * GPL HEADER END */ /* - * Copyright (c) 2012, 2014, Intel Corporation. + * Copyright (c) 2012, 2017, Intel Corporation. * Use is subject to license terms. */ #include +#include #include #ifndef _LQUOTA_INTERNAL_H #define _LQUOTA_INTERNAL_H -/* -static inline char *qtype_name(int qtype) -{ - switch (qtype) { - case USRQUOTA: - return "usr"; - case GRPQUOTA: - return "grp"; - case PRJQUOTA: - return "prj"; - break; - } - return "unknown"; -} -*/ - #define RES_NAME(res) ((res) == LQUOTA_RES_MD ? "md" : "dt") #define QIF_IFLAGS (QIF_INODES | QIF_ITIME | QIF_ILIMITS) @@ -77,7 +62,7 @@ static inline __u32 qtype2slv_oid(int qtype) return LQUOTA_PRJ_OID; } - LASSERTF(0, "invalid quota type: %d", qtype); + /* should not come here, just make compile happy */ return LQUOTA_USR_OID; } @@ -92,12 +77,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 */ @@ -187,6 +172,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 */ @@ -194,11 +181,45 @@ struct lquota_entry { } u; /* flags describing the state of the lquota_entry */ - unsigned long lqe_enforced:1,/* quota enforced or not */ - lqe_uptodate:1,/* successfully read from disk */ - lqe_edquot:1, /* id out of quota space on QMT */ - lqe_gl:1, /* glimpse is in progress */ - lqe_nopreacq:1;/* pre-acquire disabled */ + unsigned long lqe_enforced:1, /* quota enforced or not */ + lqe_uptodate:1, /* successfully read from disk */ + 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_global:1, /* lqe belongs to global pool "0x0"*/ + lqe_is_deleted:1, /* lqe will be deleted soon */ + lqe_is_reset:1, /* lqe has been reset */ + lqe_revoke:1; /* all extra grant will be revoked */ + + /* the lock to protect lqe_glbl_data */ + struct mutex lqe_glbl_data_lock; + struct lqe_glbl_data *lqe_glbl_data; + struct work_struct lqe_work; /* workitem to free lvbo */ +}; + +#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_idx:16, + /* index of target */ + 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. @@ -216,7 +237,7 @@ struct lquota_site { /* Vector of operations which can be done on lquota entry belonging to * this quota site */ - struct lquota_entry_operations *lqs_ops; + const struct lquota_entry_operations *lqs_ops; /* Backpointer to parent structure, either QMT pool info for master or * QSD for slave */ @@ -310,7 +331,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: @@ -321,7 +342,7 @@ static inline int lquota_over_fl(int qtype) return QUOTA_FL_OVER_PRJQUOTA; } - LASSERTF(0, "invalid quota type: %d", qtype); + /* should not come here, just make compile happy */ return QUOTA_FL_OVER_USRQUOTA; } @@ -349,15 +370,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) @@ -368,8 +381,6 @@ struct lquota_thread_info *lquota_info(const struct lu_env *env) /* debugging macros */ #ifdef LIBCFS_DEBUG #define lquota_lqe_debug(msgdata, mask, cdls, lqe, fmt, a...) do { \ - CFS_CHECK_STACK(msgdata, mask, cdls); \ - \ if (((mask) & D_CANTMASK) != 0 || \ ((libcfs_debug & (mask)) != 0 && \ (libcfs_subsystem_debug & DEBUG_SUBSYSTEM) != 0)) \ @@ -393,11 +404,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) @@ -409,18 +446,37 @@ 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 *); +int lquota_obj_iter(const struct lu_env *env, struct dt_device *dev, + struct dt_object *obj, struct obd_quotactl *oqctl, + char *buffer, int size, bool is_glb, bool is_md); /* lquota_entry.c */ /* site create/destroy */ -struct lquota_site *lquota_site_alloc(const struct lu_env *, void *, bool, - short, struct lquota_entry_operations *); +struct lquota_site *lquota_site_alloc(const struct lu_env *env, void *parent, + bool master, short qtype, + const struct lquota_entry_operations *op); 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); + +static inline void lqe_set_deleted(struct lquota_entry *lqe) +{ + lqe->lqe_enforced = 0; + lqe->lqe_edquot = 0; + lqe->lqe_is_default = 0; + lqe->lqe_hardlimit = 0; + lqe->lqe_softlimit = 0; + lqe->lqe_gracetime = 0; + + lqe->lqe_is_deleted = 1; +} /* lquota_disk.c */ struct dt_object *lquota_disk_dir_find_create(const struct lu_env *, @@ -450,6 +506,8 @@ int lquota_disk_declare_write(const struct lu_env *, struct thandle *, int lquota_disk_write(const struct lu_env *, struct thandle *, struct dt_object *, union lquota_id *, struct dt_rec *, __u32, __u64 *); +int lquota_disk_delete(const struct lu_env *env, struct thandle *th, + struct dt_object *obj, __u64 qid, __u64 *ver); int lquota_disk_update_ver(const struct lu_env *, struct dt_device *, struct dt_object *, __u64); int lquota_disk_write_glb(const struct lu_env *, struct dt_object *, __u64, @@ -460,7 +518,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 proc_ops lprocfs_quota_seq_fops; /* qsd_lib.c */ int qsd_glb_init(void);