Whamcloud - gitweb
LU-16915 tests: except sanity-sec test_51
[fs/lustre-release.git] / lustre / quota / lquota_internal.h
index 5361b7d..323cec8 100644 (file)
  * GPL HEADER END
  */
 /*
- * Copyright (c) 2012, 2014, Intel Corporation.
+ * Copyright (c) 2012, 2017, Intel Corporation.
  * Use is subject to license terms.
  */
 
 #include <obd.h>
+#include <dt_object.h>
 #include <lustre_quota.h>
 
 #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);