#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
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. */
-};
-
struct mdd_device {
struct md_device mdd_md_dev;
struct obd_export *mdd_child_exp;
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;
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 */
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;
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,
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,
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);
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,
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)
{
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);
* LU-974 enforce client umask in creation.
* TODO: CMD needs to handle this for remote object.
*/
- saved = xchg(¤t->fs->umask, uc->uc_umask & S_IRWXUGO);
+ if (likely(uc != NULL))
+ saved = xchg(¤t->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;
}