#include <lvfs.h>
#include <lustre_idmap.h>
#include <lustre_eacl.h>
+#include <lustre_fsfilt.h>
static inline __u64 lcd_last_transno(struct lsd_client_data *lcd)
{
mo_acl :1,
mo_compat_resname:1,
mo_mds_capa :1,
- mo_oss_capa :1;
+ mo_oss_capa :1,
+ mo_cos :1;
} mdt_opts;
/* mdt state flags */
__u32 mdt_fl_cfglog:1,
struct lustre_capa_key mdt_capa_keys[2];
unsigned int mdt_capa_conf:1;
+ /* root squash */
+ uid_t mdt_squash_uid;
+ gid_t mdt_squash_gid;
+ struct list_head mdt_nosquash_nids;
+ char *mdt_nosquash_str;
+ int mdt_nosquash_strlen;
+ struct rw_semaphore mdt_squash_sem;
+
cfs_proc_dir_entry_t *mdt_proc_entry;
struct lprocfs_stats *mdt_stats;
+ int mdt_sec_level;
};
#define MDT_SERVICE_WATCHDOG_FACTOR (2000)
#define MDT_ROCOMPAT_SUPP (OBD_ROCOMPAT_LOVOBJID)
#define MDT_INCOMPAT_SUPP (OBD_INCOMPAT_MDT | OBD_INCOMPAT_COMMON_LR)
+#define MDT_COS_DEFAULT (1)
struct mdt_object {
struct lu_object_header mot_header;
/*
* XXX: Part Three:
- * The following members will be filled explictly
+ * The following members will be filled explicitly
* with zero in mdt_reint_unpack(), because they are only used
* by reint requests (including mdt_reint_open()).
*/
/* Ops object filename */
struct lu_name mti_name;
+ struct md_attr mti_tmp_attr;
};
typedef void (*mdt_cb_t)(const struct mdt_device *mdt, __u64 transno,
void *mdt_cb_data;
};
+enum mdt_txn_op {
+ MDT_TXN_CAPA_KEYS_WRITE_OP,
+ MDT_TXN_LAST_RCVD_WRITE_OP,
+};
+
+
/*
* Info allocated per-transaction.
*/
extern struct lu_context_key mdt_txn_key;
static inline void mdt_trans_add_cb(const struct thandle *th,
- mdt_cb_t cb_func, void *cb_data)
+ mdt_cb_t cb_func, void *cb_data)
{
struct mdt_txn_info *txi;
-
+
txi = lu_context_key_get(&th->th_ctx, &mdt_txn_key);
LASSERT(txi->txi_cb_count < ARRAY_SIZE(txi->txi_cb));
return lu_object_fid(&o->mot_obj.mo_lu);
}
+static inline struct lu_site *mdt_lu_site(const struct mdt_device *mdt)
+{
+ return mdt->mdt_md_dev.md_lu_dev.ld_site;
+}
+
+static inline struct md_site *mdt_md_site(const struct mdt_device *mdt)
+{
+ return lu_site2md(mdt_lu_site(mdt));
+}
static inline void mdt_export_evict(struct obd_export *exp)
{
extern void target_recovery_init(struct obd_device *obd,
svc_handler_t handler);
int mdt_fs_setup(const struct lu_env *, struct mdt_device *,
- struct obd_device *);
+ struct obd_device *, struct lustre_sb_info *lsi);
void mdt_fs_cleanup(const struct lu_env *, struct mdt_device *);
int mdt_client_del(const struct lu_env *env,
int mdt_client_new(const struct lu_env *env,
struct mdt_device *mdt);
+int mdt_export_stats_init(struct obd_device *obd,
+ struct obd_export *exp,
+ void *client_nid);
+
int mdt_pin(struct mdt_thread_info* info);
int mdt_lock_new_child(struct mdt_thread_info *info,
int mdt_handle_last_unlink(struct mdt_thread_info *, struct mdt_object *,
const struct md_attr *);
void mdt_reconstruct_open(struct mdt_thread_info *, struct mdt_lock_handle *);
+
+void mdt_trans_credit_init(const struct lu_env *env,
+ struct mdt_device *mdt,
+ enum mdt_txn_op op);
struct thandle* mdt_trans_start(const struct lu_env *env,
- struct mdt_device *mdt, int credits);
+ struct mdt_device *mdt);
void mdt_trans_stop(const struct lu_env *env,
struct mdt_device *mdt, struct thandle *th);
int mdt_record_write(const struct lu_env *env,
void mdt_exit_ucred(struct mdt_thread_info *);
/* mdt_idmap.c */
+int mdt_init_sec_level(struct mdt_thread_info *);
int mdt_init_idmap(struct mdt_thread_info *);
-
void mdt_cleanup_idmap(struct mdt_export_data *);
-
int mdt_handle_idmap(struct mdt_thread_info *);
-
int ptlrpc_user_desc_do_idmap(struct ptlrpc_request *,
struct ptlrpc_user_desc *);
-
void mdt_body_reverse_idmap(struct mdt_thread_info *,
struct mdt_body *);
-
int mdt_remote_perm_reverse_idmap(struct ptlrpc_request *,
struct mdt_remote_perm *);
-
int mdt_fix_attr_ucred(struct mdt_thread_info *, __u32);
static inline struct mdt_device *mdt_dev(struct lu_device *d)
return cache ? (strcmp(cache->uc_upcall, "NONE") == 0) : 1;
}
+int mdt_blocking_ast(struct ldlm_lock*, struct ldlm_lock_desc*, void*, int);
+
/* Issues dlm lock on passed @ns, @f stores it lock handle into @lh. */
static inline int mdt_fid_lock(struct ldlm_namespace *ns,
struct lustre_handle *lh,
ldlm_mode_t mode,
ldlm_policy_data_t *policy,
const struct ldlm_res_id *res_id,
- int flags)
+ int flags, const __u64 *client_cookie)
{
int rc;
LASSERT(lh != NULL);
rc = ldlm_cli_enqueue_local(ns, res_id, LDLM_IBITS, policy,
- mode, &flags, ldlm_blocking_ast,
- ldlm_completion_ast, NULL, NULL,
- 0, NULL, lh);
+ mode, &flags, mdt_blocking_ast,
+ ldlm_completion_ast,
+ NULL, NULL, 0, NULL, client_cookie, lh);
return rc == ELDLM_OK ? 0 : -EIO;
}
return tlname;
}
+void mdt_enable_cos(struct mdt_device *, int);
+int mdt_cos_is_enabled(struct mdt_device *);
+
/* lprocfs stuff */
void lprocfs_mdt_init_vars(struct lprocfs_static_vars *lvars);
int mdt_procfs_init(struct mdt_device *mdt, const char *name);
const struct lu_fid *fid,
struct lustre_capa *capa)
{
- struct mdt_device *dev = info->mti_mdt;
struct md_capainfo *ci;
LASSERT(offset >= 0 && offset <= MD_CAPAINFO_MAX);
- if (!dev->mdt_opts.mo_mds_capa)
+ if (!info->mti_mdt->mdt_opts.mo_mds_capa ||
+ !(info->mti_exp->exp_connect_flags & OBD_CONNECT_MDS_CAPA))
return;
ci = md_capainfo(info->mti_env);
}
}
+static inline struct obd_device *mdt2obd_dev(const struct mdt_device *mdt)
+{
+ return mdt->mdt_md_dev.md_lu_dev.ld_obd;
+}
#endif /* __KERNEL__ */
#endif /* _MDT_H */