Whamcloud - gitweb
LU-2240 mds: Assign special fid sequence to root.
[fs/lustre-release.git] / lustre / mdd / mdd_internal.h
index d5e4286..97f6cb6 100644 (file)
@@ -52,6 +52,8 @@
 #include <lprocfs_status.h>
 #include <lustre_log.h>
 
+#include "mdd_lfsck.h"
+
 /* PDO lock is unnecessary for current MDT stack because operations
  * are already protected by ldlm lock */
 #define MDD_DISABLE_PDO_LOCK    1
@@ -92,28 +94,7 @@ struct mdd_dot_lustre_objs {
 };
 
 extern const char lfsck_bookmark_name[];
-
-struct md_lfsck {
-       struct mutex          ml_mutex;
-       spinlock_t            ml_lock;
-       struct ptlrpc_thread  ml_thread;
-       struct dt_object     *ml_bookmark_obj;
-       struct dt_object     *ml_it_obj;
-       __u32                 ml_new_scanned;
-       /* Arguments for low layer iteration. */
-       __u32                 ml_args;
-
-       /* Raw value for LFSCK speed limit. */
-       __u32                 ml_speed_limit;
-
-       /* Schedule for every N objects. */
-       __u32                 ml_sleep_rate;
-
-       /* Sleep N jiffies for each schedule. */
-       __u32                 ml_sleep_jif;
-       __u16                 ml_version;
-       unsigned int          ml_paused:1; /* The lfsck is paused. */
-};
+extern const char lfsck_namespace_name[];
 
 struct mdd_device {
         struct md_device                 mdd_md_dev;
@@ -121,6 +102,7 @@ struct mdd_device {
         struct dt_device                *mdd_child;
        struct dt_device                *mdd_bottom;
         struct lu_fid                    mdd_root_fid;
+       struct lu_fid                    mdd_local_root_fid;
         struct dt_device_param           mdd_dt_conf;
         struct dt_object                *mdd_orphans; /* PENDING directory */
         struct dt_object                *mdd_capa;
@@ -167,10 +149,10 @@ struct mdd_thread_info {
        struct lu_attr            mti_cattr;
         struct md_attr            mti_ma;
         struct obd_info           mti_oi;
-       /* mti_orph_ent and mti_orph_key must be conjoint,
-        * then mti_orph_ent::lde_name will be mti_orph_key. */
-       struct lu_dirent          mti_orph_ent;
-        char                      mti_orph_key[NAME_MAX + 1];
+       /* mti_ent and mti_key must be conjoint,
+        * then mti_ent::lde_name will be mti_key. */
+       struct lu_dirent          mti_ent;
+       char                      mti_key[NAME_MAX + 16];
         struct obd_trans_info     mti_oti;
         struct lu_buf             mti_buf;
         struct lu_buf             mti_big_buf; /* biggish persistent buf */
@@ -187,6 +169,22 @@ struct mdd_thread_info {
         struct obd_quotactl       mti_oqctl;
 };
 
+/**
+ * The data that link search is done on.
+ */
+struct mdd_link_data {
+       /**
+        * Buffer to keep link EA body.
+        */
+       struct lu_buf           *ml_buf;
+       /**
+        * The matched header, entry and its lenght in the EA
+        */
+       struct link_ea_header   *ml_leh;
+       struct link_ea_entry    *ml_lee;
+       int                      ml_reclen;
+};
+
 extern const char orph_index_name[];
 
 extern const struct dt_index_features orph_index_features;
@@ -289,6 +287,8 @@ void mdd_pdo_write_unlock(const struct lu_env *env, struct mdd_object *obj,
 void mdd_pdo_read_unlock(const struct lu_env *env, struct mdd_object *obj,
                          void *dlh);
 /* mdd_dir.c */
+int mdd_parent_fid(const struct lu_env *env, struct mdd_object *obj,
+                  struct lu_fid *fid);
 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,
@@ -312,6 +312,21 @@ int mdd_is_root(struct mdd_device *mdd, const struct lu_fid *fid);
 int mdd_lookup(const struct lu_env *env,
                struct md_object *pobj, const struct lu_name *lname,
                struct lu_fid* fid, struct md_op_spec *spec);
+int mdd_links_read(const struct lu_env *env, struct mdd_object *mdd_obj,
+                  struct mdd_link_data *ldata);
+int mdd_links_find(const struct lu_env *env, struct mdd_object *mdd_obj,
+                  struct mdd_link_data *ldata, const struct lu_name *lname,
+                  const struct lu_fid  *pfid);
+int mdd_links_new(const struct lu_env *env, struct mdd_link_data *ldata);
+int mdd_links_add_buf(const struct lu_env *env, struct mdd_link_data *ldata,
+                     const struct lu_name *lname, const struct lu_fid *pfid);
+void mdd_links_del_buf(const struct lu_env *env, struct mdd_link_data *ldata,
+                      const struct lu_name *lname);
+int mdd_declare_links_add(const struct lu_env *env,
+                         struct mdd_object *mdd_obj,
+                         struct thandle *handle);
+int mdd_links_write(const struct lu_env *env, struct mdd_object *mdd_obj,
+                   struct mdd_link_data *ldata, struct thandle *handle);
 struct lu_buf *mdd_links_get(const struct lu_env *env,
                              struct mdd_object *mdd_obj);
 void mdd_lee_unpack(const struct link_ea_entry *lee, int *reclen,
@@ -341,6 +356,8 @@ int mdd_lovobj_unlink(const struct lu_env *env, struct mdd_device *mdd,
 
 struct mdd_thread_info *mdd_env_info(const struct lu_env *env);
 
+const struct lu_name *mdd_name_get_const(const struct lu_env *env,
+                                        const void *area, ssize_t len);
 struct lu_buf *mdd_buf_get(const struct lu_env *env, void *area, ssize_t len);
 const struct lu_buf *mdd_buf_get_const(const struct lu_env *env,
                                        const void *area, ssize_t len);
@@ -389,6 +406,10 @@ int mdd_declare_changelog_store(const struct lu_env *env,
                                struct thandle *handle);
 int mdd_changelog_store(const struct lu_env *env, struct mdd_device *mdd,
                        struct llog_changelog_rec *rec, struct thandle *th);
+int mdd_changelog_ns_store(const struct lu_env *env, struct mdd_device *mdd,
+                          enum changelog_rec_type type, unsigned flags,
+                          struct mdd_object *target, struct mdd_object *parent,
+                          const struct lu_name *tname, struct thandle *handle);
 int mdd_declare_object_create_internal(const struct lu_env *env,
                                       struct mdd_object *p,
                                       struct mdd_object *c,
@@ -403,6 +424,11 @@ int mdd_lov_destroy(const struct lu_env *env, struct mdd_device *mdd,
 void mdd_object_make_hint(const struct lu_env *env, struct mdd_object *parent,
                          struct mdd_object *child, struct lu_attr *attr);
 
+static inline void mdd_object_get(struct mdd_object *o)
+{
+       lu_object_get(&o->mod_obj.mo_lu);
+}
+
 static inline void mdd_object_put(const struct lu_env *env,
                                   struct mdd_object *o)
 {
@@ -421,12 +447,16 @@ int mdd_txn_start_cb(const struct lu_env *env, struct thandle *,
                      void *cookie);
 
 /* mdd_lfsck.c */
-void mdd_lfsck_set_speed(struct md_lfsck *lfsck, __u32 limit);
+int mdd_lfsck_set_speed(const struct lu_env *env, struct md_lfsck *lfsck,
+                       __u32 limit);
 int mdd_lfsck_start(const struct lu_env *env, struct md_lfsck *lfsck,
                    struct lfsck_start *start);
-int mdd_lfsck_stop(const struct lu_env *env, struct md_lfsck *lfsck);
+int mdd_lfsck_stop(const struct lu_env *env, struct md_lfsck *lfsck,
+                  bool pause);
 int mdd_lfsck_setup(const struct lu_env *env, struct mdd_device *mdd);
 void mdd_lfsck_cleanup(const struct lu_env *env, struct mdd_device *mdd);
+int mdd_lfsck_dump(const struct lu_env *env, struct md_lfsck *lfsck,
+                  __u16 type, char *buf, int len);
 
 /* mdd_device.c */
 struct lu_object *mdd_object_alloc(const struct lu_env *env,
@@ -543,11 +573,21 @@ static inline int mdd_object_exists(struct mdd_object *obj)
         return lu_object_exists(mdd2lu_obj(obj));
 }
 
+static inline int mdd_object_remote(struct mdd_object *obj)
+{
+       return lu_object_remote(mdd2lu_obj(obj));
+}
+
 static inline const struct lu_fid *mdd_object_fid(struct mdd_object *obj)
 {
         return lu_object_fid(mdd2lu_obj(obj));
 }
 
+static inline struct seq_server_site *mdd_seq_site(struct mdd_device *mdd)
+{
+       return mdd2lu_dev(mdd)->ld_site->ld_seq_site;
+}
+
 static inline struct lustre_capa *mdd_object_capa(const struct lu_env *env,
                                                   const struct mdd_object *obj)
 {
@@ -734,7 +774,13 @@ int mdo_declare_index_insert(const struct lu_env *env, struct mdd_object *obj,
          * if the object doesn't exist yet, then it's supposed to be created
          * and declaration of the creation should be enough to insert ./..
          */
-        if (mdd_object_exists(obj)) {
+        /* FIXME: remote object should not be awared by MDD layer, but local
+         * creation does not declare insert ./.. (comments above), which
+         * is required by remote directory creation.
+         * This remote check should be removed when mdd_object_exists check is
+         * removed.
+         */
+        if (mdd_object_exists(obj) || mdd_object_remote(obj)) {
                 rc = -ENOTDIR;
                 if (dt_try_as_dir(env, next))
                         rc = dt_declare_insert(env, next,
@@ -827,12 +873,14 @@ int mdo_create_obj(const struct lu_env *env, struct mdd_object *o,
         *  LU-974 enforce client umask in creation.
         * TODO: CMD needs to handle this for remote object.
         */
-       saved = xchg(&current->fs->umask, uc->uc_umask & S_IRWXUGO);
+       if (likely(uc != NULL))
+               saved = xchg(&current->fs->umask, uc->uc_umask & S_IRWXUGO);
 
        rc = next->do_ops->do_create(env, next, attr, hint, dof, handle);
 
        /* restore previous umask value */
-       current->fs->umask = saved;
+       if (likely(uc != NULL))
+               current->fs->umask = saved;
 
        return rc;
 }