Whamcloud - gitweb
LU-2240 mds: Assign special fid sequence to root.
[fs/lustre-release.git] / lustre / mdd / mdd_internal.h
index 5351615..97f6cb6 100644 (file)
@@ -27,7 +27,7 @@
  * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
  * Use is subject to license terms.
  *
- * Copyright (c) 2011, 2012, Whamcloud, Inc.
+ * Copyright (c) 2011, 2012, Intel Corporation.
  */
 /*
  * This file is part of Lustre, http://www.lustre.org/
@@ -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
 #define CLM_PURGE 0x40000
 
 struct mdd_changelog {
-        cfs_spinlock_t                   mc_lock;    /* for index */
-        int                              mc_flags;
-        int                              mc_mask;
-        __u64                            mc_index;
-        __u64                            mc_starttime;
-        cfs_spinlock_t                   mc_user_lock;
-        int                              mc_lastuser;
+       spinlock_t              mc_lock;        /* for index */
+       int                     mc_flags;
+       int                     mc_mask;
+       __u64                   mc_index;
+       __u64                   mc_starttime;
+       spinlock_t              mc_user_lock;
+       int                     mc_lastuser;
 };
 
 static inline __u64 cl_time(void) {
@@ -92,28 +94,7 @@ struct mdd_dot_lustre_objs {
 };
 
 extern const char lfsck_bookmark_name[];
-
-struct md_lfsck {
-       cfs_mutex_t           ml_mutex;
-       cfs_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,11 +102,11 @@ 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;
         cfs_proc_dir_entry_t            *mdd_proc_entry;
-        struct lprocfs_stats            *mdd_stats;
         struct mdd_changelog             mdd_cl;
         unsigned long                    mdd_atime_diff;
         struct mdd_object               *mdd_dot_lustre;
@@ -143,14 +124,6 @@ enum mod_flags {
         ORPHAN_OBJ = 1 << 3,
 };
 
-enum mdd_object_role {
-        MOR_SRC_PARENT,
-        MOR_SRC_CHILD,
-        MOR_TGT_PARENT,
-        MOR_TGT_CHILD,
-        MOR_TGT_ORPHAN
-};
-
 struct mdd_object {
         struct md_object   mod_obj;
         /* open count */
@@ -176,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 */
@@ -196,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;
@@ -298,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,
@@ -321,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,
@@ -350,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);
@@ -362,7 +370,7 @@ int __mdd_orphan_del(const struct lu_env *, struct mdd_object *,
 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 *,
-                              struct thandle *);
+                             cfs_umode_t mode, struct thandle *);
 int orph_declare_index_delete(const struct lu_env *, struct mdd_object *,
                               struct thandle *);
 
@@ -370,9 +378,6 @@ int orph_declare_index_delete(const struct lu_env *, struct mdd_object *,
 void lprocfs_mdd_init_vars(struct lprocfs_static_vars *lvars);
 int mdd_procfs_init(struct mdd_device *mdd, const char *name);
 int mdd_procfs_fini(struct mdd_device *mdd);
-void mdd_lprocfs_time_start(const struct lu_env *env);
-void mdd_lprocfs_time_end(const struct lu_env *env,
-                          struct mdd_device *mdd, int op);
 
 /* mdd_object.c */
 int mdd_get_flags(const struct lu_env *env, struct mdd_object *obj);
@@ -401,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,
@@ -415,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)
 {
@@ -433,33 +447,22 @@ 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,
                                    const struct lu_object_header *hdr,
                                    struct lu_device *d);
 
-/* mdd_permission.c */
-#define mdd_cap_t(x) (x)
-
-#define MDD_CAP_TO_MASK(x) (1 << (x))
-
-#define mdd_cap_raised(c, flag) (mdd_cap_t(c) & MDD_CAP_TO_MASK(flag))
-
-/* capable() is copied from linux kernel! */
-static inline int mdd_capable(struct md_ucred *uc, cfs_cap_t cap)
-{
-        if (mdd_cap_raised(uc->mu_cap, cap))
-                return 1;
-        return 0;
-}
-
 int mdd_acl_chmod(const struct lu_env *env, struct mdd_object *o, __u32 mode,
                   struct thandle *handle);
 int __mdd_declare_acl_init(const struct lu_env *env, struct mdd_object *obj,
@@ -570,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)
 {
@@ -761,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,
@@ -846,7 +865,7 @@ int mdo_create_obj(const struct lu_env *env, struct mdd_object *o,
                    struct thandle *handle)
 {
         struct dt_object *next = mdd_object_child(o);
-       struct md_ucred *uc = md_ucred(env);
+       struct lu_ucred *uc = lu_ucred(env);
        __u32 saved;
        int rc;
 
@@ -854,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->mu_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;
 }