/** metadata attributes */
enum ma_valid {
- MA_INODE = (1 << 0),
- MA_LOV = (1 << 1),
- MA_COOKIE = (1 << 2),
- MA_FLAGS = (1 << 3),
- MA_LMV = (1 << 4),
- MA_ACL_DEF = (1 << 5),
- MA_LOV_DEF = (1 << 6),
- MA_LAY_GEN = (1 << 7),
- MA_HSM = (1 << 8),
- MA_SOM = (1 << 9),
- MA_PFID = (1 << 10)
+ MA_INODE = (1 << 0),
+ MA_LOV = (1 << 1),
+ MA_COOKIE = (1 << 2),
+ MA_FLAGS = (1 << 3),
+ MA_LMV = (1 << 4),
+ MA_ACL_DEF = (1 << 5),
+ MA_LOV_DEF = (1 << 6),
+ MA_LAY_GEN = (1 << 7),
+ MA_HSM = (1 << 8),
+ MA_SOM = (1 << 9),
+ MA_PFID = (1 << 10),
+ MA_LMV_DEF = (1 << 11)
};
typedef enum {
struct lu_fid ma_pfid;
struct md_hsm ma_hsm;
struct lov_mds_md *ma_lmm;
- struct lmv_stripe_md *ma_lmv;
+ union lmv_mds_md *ma_lmv;
void *ma_acl;
- struct llog_cookie *ma_cookie;
struct lustre_capa *ma_capa;
struct md_som_data *ma_som;
int ma_lmm_size;
int ma_lmv_size;
int ma_acl_size;
- int ma_cookie_size;
__u16 ma_layout_gen;
};
const struct dt_index_features *sp_feat;
};
+union ldlm_policy_data;
/**
* Operations implemented for each md object (both directory and leaf).
*/
int (*moo_object_lock)(const struct lu_env *env, struct md_object *obj,
struct lustre_handle *lh,
struct ldlm_enqueue_info *einfo,
- void *policy);
+ union ldlm_policy_data *policy);
+ int (*moo_object_unlock)(const struct lu_env *env,
+ struct md_object *obj,
+ struct ldlm_enqueue_info *einfo,
+ union ldlm_policy_data *policy);
};
/**
struct md_object *cobj, const struct lu_name *lname,
struct md_attr *ma, int no_name);
+ int (*mdo_migrate)(const struct lu_env *env, struct md_object *pobj,
+ struct md_object *sobj, const struct lu_name *lname,
+ struct md_object *tobj, struct md_attr *ma);
/** This method is used to compare a requested layout to an existing
* layout (struct lov_mds_md_v1/3 vs struct lov_mds_md_v1/3) */
int (*mdo_lum_lmm_cmp)(const struct lu_env *env,
const struct md_dir_operations *mo_dir_ops;
};
+/* Mark the object to be dead, and can not be accessed anymore.
+ * XXX, right now, it will only be used for striped directory to
+ * mark the slave stripes dead, when deleting master object. It will be
+ * stored in slave LMV EA (see lod_mark_dead_object), which is only
+ * temporary, and will be removed later when we have proper way to mark
+ * the dead object. */
+#define LUSTRE_SLAVE_DEAD_FL 0x80000000
+
/**
* seq-server site.
*/
return (obj ? lu2md(lu_object_next(&obj->mo_lu)) : NULL);
}
-static inline struct md_device *md_obj2dev(const struct md_object *o)
-{
- LASSERT(o == NULL || IS_ERR(o) || lu_device_is_md(o->mo_lu.lo_dev));
- return container_of0(o->mo_lu.lo_dev, struct md_device, md_lu_dev);
-}
-
static inline int md_device_init(struct md_device *md, struct lu_device_type *t)
{
return lu_device_init(&md->md_lu_dev, t);
struct md_object *m,
struct lustre_handle *lh,
struct ldlm_enqueue_info *einfo,
- void *policy)
+ union ldlm_policy_data *policy)
{
LASSERT(m->mo_ops->moo_object_lock);
return m->mo_ops->moo_object_lock(env, m, lh, einfo, policy);
}
+static inline int mo_object_unlock(const struct lu_env *env,
+ struct md_object *m,
+ struct ldlm_enqueue_info *einfo,
+ union ldlm_policy_data *policy)
+{
+ LASSERT(m->mo_ops->moo_object_unlock);
+ return m->mo_ops->moo_object_unlock(env, m, einfo, policy);
+}
+
static inline int mdo_lookup(const struct lu_env *env,
struct md_object *p,
const struct lu_name *lname,
ma);
}
+static inline int mdo_migrate(const struct lu_env *env,
+ struct md_object *pobj,
+ struct md_object *sobj,
+ const struct lu_name *lname,
+ struct md_object *tobj,
+ struct md_attr *ma)
+{
+ LASSERT(pobj->mo_dir_ops->mdo_migrate);
+ return pobj->mo_dir_ops->mdo_migrate(env, pobj, sobj, lname, tobj, ma);
+}
+
static inline int mdo_is_subdir(const struct lu_env *env,
struct md_object *mo,
const struct lu_fid *fid,
__u32 llod_oid;
int llod_is_index;
const struct dt_index_features *llod_feat;
- cfs_list_t llod_linkage;
+ struct list_head llod_linkage;
};
int lustre_buf2som(void *buf, int rc, struct md_som_data *msd);