Whamcloud - gitweb
LU-10337 mdt: Allow open of open orphans
[fs/lustre-release.git] / lustre / mdd / mdd_internal.h
index aeb0791..78863de 100644 (file)
@@ -23,7 +23,7 @@
  * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
  * Use is subject to license terms.
  *
- * Copyright (c) 2011, 2016, Intel Corporation.
+ * Copyright (c) 2011, 2017, Intel Corporation.
  */
 /*
  * This file is part of Lustre, http://www.lustre.org/
 #include <lustre_log.h>
 #include <lustre_linkea.h>
 
+/* ChangeLog params for automatic purge mechanism */
+/* max time allowed for a user to stay idle in seconds */
+#define CHLOG_MAX_IDLE_TIME 2592000 /* = 30 days */
+/* max gap allowed for a user to stay idle in number of ChangeLog records
+ * this is an evaluation, assuming that chunk-size is LLOG_MIN_CHUNK_SIZE, of
+ * the indexes gap for half full changelogs */
+#define CHLOG_MAX_IDLE_INDEXES (((LLOG_MIN_CHUNK_SIZE - \
+                                 offsetof(struct llog_log_hdr, \
+                                          llh_bitmap[0]) - \
+                                 sizeof(struct llog_rec_tail)) * 4) * \
+                               ((LLOG_MIN_CHUNK_SIZE - \
+                                 offsetof(struct llog_log_hdr, \
+                                          llh_bitmap[0]) - \
+                                 sizeof(struct llog_rec_tail)) * 8))
+/* min time in seconds between two gc thread runs if none already started */
+#define CHLOG_MIN_GC_INTERVAL 3600
+/* minimum number of free ChangeLog catalog entries (ie, between cur and
+ * last indexes) before starting garbage collect */
+#define CHLOG_MIN_FREE_CAT_ENTRIES 2
+
 /* Changelog flags */
 /** changelog is recording */
 #define CLM_ON    0x00001
 
 #define LLOG_CHANGELOG_HDR_SZ (sizeof(struct llog_changelog_rec) - \
                               sizeof(struct changelog_rec))
+/* mc_gc_task values */
+/** no GC thread to be started **/
+#define MDD_CHLG_GC_NONE NULL
+/** a GC thread need to be started **/
+#define MDD_CHLG_GC_NEED (struct task_struct *)(-1)
+/** a GC thread will be started now **/
+#define MDD_CHLG_GC_START (struct task_struct *)(-2)
+/** else the started task_struct address when running **/
 
 struct mdd_changelog {
        spinlock_t              mc_lock;        /* for index */
@@ -72,6 +100,12 @@ struct mdd_changelog {
        ktime_t                 mc_starttime;
        spinlock_t              mc_user_lock;
        int                     mc_lastuser;
+       int                     mc_users;      /* registered users number */
+       struct task_struct      *mc_gc_task;
+       time64_t                mc_gc_time;    /* last GC check or run time */
+       unsigned int            mc_deniednext; /* interval for recording denied
+                                               * accesses
+                                               */
 };
 
 static inline __u64 cl_time(void)
@@ -107,13 +141,18 @@ struct mdd_device {
         struct dt_object                *mdd_orphans; /* PENDING directory */
        struct proc_dir_entry            *mdd_proc_entry;
         struct mdd_changelog             mdd_cl;
-        unsigned long                    mdd_atime_diff;
+       unsigned int                     mdd_changelog_gc;
+       time64_t                         mdd_changelog_max_idle_time;
+       unsigned long                    mdd_changelog_max_idle_indexes;
+       time64_t                         mdd_changelog_min_gc_interval;
+       unsigned int                     mdd_changelog_min_free_cat_entries;
+       time64_t                         mdd_atime_diff;
         struct mdd_object               *mdd_dot_lustre;
         struct mdd_dot_lustre_objs       mdd_dot_lustre_objs;
        unsigned int                     mdd_sync_permission;
        int                              mdd_connects;
        struct local_oid_storage        *mdd_los;
-       struct mdd_generic_thread        mdd_orph_cleanup_thread;
+       struct mdd_generic_thread        mdd_orphan_cleanup_thread;
 };
 
 enum mod_flags {
@@ -130,6 +169,7 @@ struct mdd_object {
        u32                     mod_valid;
        ktime_t                 mod_cltime;
        unsigned long           mod_flags;
+       struct list_head        mod_users;  /**< unique user opens */
 };
 
 struct mdd_thread_info {
@@ -150,11 +190,13 @@ struct mdd_thread_info {
        * then mti_ent::lde_name will be mti_key. */
        struct lu_dirent          mti_ent;
        char                      mti_key[NAME_MAX + 16];
+       char                      mti_name[NAME_MAX + 1];
        struct lu_buf             mti_buf[4];
        struct lu_buf             mti_big_buf; /* biggish persistent buf */
        struct lu_buf             mti_link_buf; /* buf for link ea */
        struct lu_buf             mti_xattr_buf;
        struct obdo               mti_oa;
+       struct lmv_user_md        mti_lmu;
        struct dt_allocation_hint mti_hint;
        struct dt_object_format   mti_dof;
        struct linkea_data        mti_link_data;
@@ -162,10 +204,9 @@ struct mdd_thread_info {
        struct dt_insert_rec      mti_dt_rec;
        struct lfsck_req_local    mti_lrl;
        struct lu_seq_range       mti_range;
+       union lmv_mds_md          mti_lmv;
 };
 
-extern const char orph_index_name[];
-
 int mdd_la_get(const struct lu_env *env, struct mdd_object *obj,
               struct lu_attr *la);
 int mdd_attr_get(const struct lu_env *env, struct md_object *obj,
@@ -196,8 +237,6 @@ void mdd_read_unlock(const struct lu_env *env, struct mdd_object *obj);
 int mdd_write_locked(const struct lu_env *env, struct mdd_object *obj);
 
 /* mdd_dir.c */
-int mdd_is_subdir(const struct lu_env *env, struct md_object *mo,
-                  const struct lu_fid *fid, struct lu_fid *sfid);
 int mdd_may_create(const struct lu_env *env, struct mdd_object *pobj,
                   const struct lu_attr *pattr, struct mdd_object *cobj,
                   bool check_perm);
@@ -232,6 +271,9 @@ int mdd_links_rename(const struct lu_env *env,
                     struct thandle *handle,
                     struct linkea_data *ldata,
                     int first, int check);
+int mdd_dir_layout_shrink(const struct lu_env *env,
+                         struct md_object *md_obj,
+                         const struct lu_buf *lmu_buf);
 
 struct mdd_thread_info *mdd_env_info(const struct lu_env *env);
 
@@ -242,16 +284,16 @@ const struct lu_buf *mdd_buf_get_const(const struct lu_env *env,
                                        const void *area, ssize_t len);
 
 int mdd_orphan_cleanup(const struct lu_env *env, struct mdd_device *d);
-int __mdd_orphan_add(const struct lu_env *, struct mdd_object *,
-                     struct thandle *);
-int __mdd_orphan_del(const struct lu_env *, struct mdd_object *,
-                     struct thandle *);
-int orph_index_init(const struct lu_env *env, struct mdd_device *mdd);
-void orph_index_fini(const struct lu_env *env, struct mdd_device *mdd);
-int orph_declare_index_insert(const struct lu_env *, struct mdd_object *,
-                             umode_t mode, struct thandle *);
-int orph_declare_index_delete(const struct lu_env *, struct mdd_object *,
-                              struct thandle *);
+int mdd_orphan_insert(const struct lu_env *env, struct mdd_object *obj,
+                     struct thandle *thandle);
+int mdd_orphan_delete(const struct lu_env *env, struct mdd_object *obj,
+                     struct thandle *thandle);
+int mdd_orphan_index_init(const struct lu_env *env, struct mdd_device *mdd);
+void mdd_orphan_index_fini(const struct lu_env *env, struct mdd_device *mdd);
+int mdd_orphan_declare_insert(const struct lu_env *env, struct mdd_object *obj,
+                             umode_t mode, struct thandle *thandle);
+int mdd_orphan_declare_delete(const struct lu_env *env, struct mdd_object *obj,
+                             struct thandle *thandle);
 
 /* mdd_lproc.c */
 int mdd_procfs_init(struct mdd_device *mdd, const char *name);
@@ -273,12 +315,20 @@ struct mdd_object *mdd_object_find(const struct lu_env *env,
 int mdd_readpage(const struct lu_env *env, struct md_object *obj,
                  const struct lu_rdpg *rdpg);
 int mdd_declare_changelog_store(const struct lu_env *env,
-                                      struct mdd_device *mdd,
-                                      const struct lu_name *tname,
-                                      const struct lu_name *sname,
-                                      struct thandle *handle);
+                               struct mdd_device *mdd,
+                               enum changelog_rec_type type,
+                               const struct lu_name *tname,
+                               const struct lu_name *sname,
+                               struct thandle *handle);
 void mdd_changelog_rec_ext_jobid(struct changelog_rec *rec, const char *jobid);
 void mdd_changelog_rec_ext_extra_flags(struct changelog_rec *rec, __u64 eflags);
+void mdd_changelog_rec_extra_uidgid(struct changelog_rec *rec,
+                                   __u64 uid, __u64 gid);
+void mdd_changelog_rec_extra_nid(struct changelog_rec *rec,
+                                lnet_nid_t nid);
+void mdd_changelog_rec_extra_omode(struct changelog_rec *rec, int flags);
+void mdd_changelog_rec_extra_xattr(struct changelog_rec *rec,
+                                  const char *xattr_name);
 int mdd_changelog_store(const struct lu_env *env, struct mdd_device *mdd,
                        struct llog_changelog_rec *rec, struct thandle *th);
 int mdd_changelog_data_store(const struct lu_env *env, struct mdd_device *mdd,
@@ -303,8 +353,14 @@ int mdd_declare_create_object_internal(const struct lu_env *env,
                                       struct thandle *handle,
                                       const struct md_op_spec *spec,
                                       struct dt_allocation_hint *hint);
-int mdd_get_lov_ea(const struct lu_env *env, struct mdd_object *obj,
-                  struct lu_buf *lmm_buf);
+int mdd_stripe_get(const struct lu_env *env, struct mdd_object *obj,
+                  struct lu_buf *lmm_buf, const char *name);
+int mdd_changelog_data_store_xattr(const struct lu_env *env,
+                                  struct mdd_device *mdd,
+                                  enum changelog_rec_type type,
+                                  int flags, struct mdd_object *mdd_obj,
+                                  const char *xattr_name,
+                                  struct thandle *handle);
 
 /* mdd_trans.c */
 void mdd_object_make_hint(const struct lu_env *env, struct mdd_object *parent,
@@ -352,6 +408,8 @@ int mdd_permission(const struct lu_env *env,
 int mdd_generic_thread_start(struct mdd_generic_thread *thread,
                             int (*func)(void *), void *data, char *name);
 void mdd_generic_thread_stop(struct mdd_generic_thread *thread);
+int mdd_changelog_user_purge(const struct lu_env *env, struct mdd_device *mdd,
+                            __u32 id);
 
 /* mdd_prepare.c */
 int mdd_compat_fixes(const struct lu_env *env, struct mdd_device *mdd);
@@ -436,6 +494,11 @@ static inline bool mdd_is_volatile_obj(struct mdd_object *obj)
        return obj->mod_flags & VOLATILE_OBJ;
 }
 
+static inline bool mdd_is_orphan_obj(struct mdd_object *obj)
+{
+       return obj->mod_flags & ORPHAN_OBJ;
+}
+
 static inline int mdd_object_exists(struct mdd_object *obj)
 {
         return lu_object_exists(mdd2lu_obj(obj));
@@ -702,4 +765,20 @@ int mdo_destroy(const struct lu_env *env, struct mdd_object *o,
         return dt_destroy(env, next, handle);
 }
 
+static inline bool mdd_changelog_enabled(const struct lu_env *env,
+                                       struct mdd_device *mdd,
+                                       enum changelog_rec_type type)
+{
+       const struct lu_ucred *uc;
+
+       if ((mdd->mdd_cl.mc_flags & CLM_ON) &&
+           (mdd->mdd_cl.mc_mask & (1 << type))) {
+               uc = lu_ucred_check(env);
+
+               return uc != NULL ? uc->uc_enable_audit : true;
+       } else {
+               return false;
+       }
+}
+
 #endif