* GPL HEADER END
*/
/*
- * Copyright (c) 2012, Intel Corporation.
+ * Copyright (c) 2012, 2014, Intel Corporation.
* Use is subject to license terms.
*/
#ifndef _LQUOTA_INTERNAL_H
#define _LQUOTA_INTERNAL_H
-#define QTYPE_NAME(qtype) ((qtype) == USRQUOTA ? "usr" : "grp")
+/*
+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)
enum lquota_local_oid {
LQUOTA_USR_OID = 1UL, /* slave index copy for user quota */
LQUOTA_GRP_OID = 2UL, /* slave index copy for group quota */
+ LQUOTA_PRJ_OID = 3UL, /* slave index copy for project quota */
/* all OIDs after this are allocated dynamically by the QMT */
LQUOTA_GENERATED_OID = 4096UL,
};
+static inline __u32 qtype2slv_oid(int qtype)
+{
+ switch (qtype) {
+ case USRQUOTA:
+ return LQUOTA_USR_OID;
+ case GRPQUOTA:
+ return LQUOTA_GRP_OID;
+ case PRJQUOTA:
+ return LQUOTA_PRJ_OID;
+ }
+
+ LASSERTF(0, "invalid quota type: %d", qtype);
+ return LQUOTA_USR_OID;
+}
+
/*
* lquota_entry support
*/
__u64 lme_gracetime;
/* last time we glimpsed */
- __u64 lme_revoke_time;
+ time64_t lme_revoke_time;
/* r/w semaphore used to protect concurrent access to the quota
* parameters which are stored on disk */
__u64 lse_usage;
/* time to trigger quota adjust */
- __u64 lse_adjust_time;
+ time64_t lse_adjust_time;
/* return code of latest acquire RPC */
int lse_acq_rc;
/* when latest acquire RPC completed */
- __u64 lse_acq_time;
+ time64_t lse_acq_time;
/* when latest edquot set */
- __u64 lse_edquot_time;
+ time64_t lse_edquot_time;
};
/* In-memory entry for each enforced quota id
* A lquota_entry structure belong to a single lquota_site */
struct lquota_entry {
/* link to site hash table */
- cfs_hlist_node_t lqe_hash;
+ struct hlist_node lqe_hash;
/* quota identifier associated with this entry */
union lquota_id lqe_id;
struct lquota_site *lqe_site;
/* reference counter */
- cfs_atomic_t lqe_ref;
+ atomic_t lqe_ref;
/* linked to list of lqes which:
* - need quota space adjustment on slave
* - need glimpse to be sent on master */
- cfs_list_t lqe_link;
+ struct list_head lqe_link;
/* current quota settings/usage of this ID */
__u64 lqe_granted; /* granted limit, inodes or kbytes */
* present. */
struct lquota_site {
/* Hash table storing lquota_entry structures */
- cfs_hash_t *lqs_hash;
+ struct cfs_hash *lqs_hash;
/* Quota type, either user or group. */
int lqs_qtype;
#define LQUOTA_BUMP_VER 0x1
#define LQUOTA_SET_VER 0x2
+extern struct kmem_cache *lqe_kmem;
+
/* 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);
+ 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);
+ OBD_SLAB_FREE_PTR(lqe, lqe_kmem);
}
static inline int lqe_is_master(struct lquota_entry *lqe)
#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)
+static inline int lquota_over_fl(int qtype)
+{
+ switch (qtype) {
+ case USRQUOTA:
+ return QUOTA_FL_OVER_USRQUOTA;
+ case GRPQUOTA:
+ return QUOTA_FL_OVER_GRPQUOTA;
+ case PRJQUOTA:
+ return QUOTA_FL_OVER_PRJQUOTA;
+ }
+
+ LASSERTF(0, "invalid quota type: %d", qtype);
+ return QUOTA_FL_OVER_USRQUOTA;
+}
/* Common data shared by quota-level handlers. This is allocated per-thread to
* reduce stack consumption */
struct lu_buf qti_lb;
struct lu_attr qti_attr;
struct dt_object_format qti_dof;
- struct lustre_mdt_attrs qti_lma;
struct lu_fid qti_fid;
char qti_buf[LQUOTA_NAME_MAX];
};
__attribute__ ((format (printf, 3, 4)));
#define LQUOTA_DEBUG_LIMIT(mask, lqe, fmt, a...) do { \
- static cfs_debug_limit_state_t _lquota_cdls; \
+ static struct cfs_debug_limit_state _lquota_cdls; \
LIBCFS_DEBUG_MSG_DATA_DECL(msgdata, mask, &_lquota_cdls); \
lquota_lqe_debug(&msgdata, mask, &_lquota_cdls, lqe, "$$$ "fmt" ", \
##a); \
void lquota_generate_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 */
__u32, __u64 *);
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,
+ struct lquota_glb_rec *);
/* qmt_dev.c */
int qmt_glb_init(void);