* Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
* Use is subject to license terms.
*
- * Copyright (c) 2011, 2013, Intel Corporation.
+ * Copyright (c) 2011, 2014, Intel Corporation.
*/
/*
* This file is part of Lustre, http://www.lustre.org/
#ifndef _MDT_INTERNAL_H
#define _MDT_INTERNAL_H
-#if defined(__KERNEL__)
-#include <libcfs/lucache.h>
+#include <upcall_cache.h>
#include <lustre_net.h>
#include <lustre/lustre_idl.h>
#include <obd_class.h>
/* file data for open files on MDS */
struct mdt_file_data {
- struct portals_handle mfd_handle; /* must be first */
- __u64 mfd_mode; /* open mode provided by client */
- cfs_list_t mfd_list; /* protected by med_open_lock */
- __u64 mfd_xid; /* xid of the open request */
- struct lustre_handle mfd_old_handle; /* old handle in replay case */
- struct mdt_object *mfd_object; /* point to opened object */
+ /** portals handle must be first */
+ struct portals_handle mfd_handle;
+ /** open mode provided by client */
+ __u64 mfd_mode;
+ /** protected by med_open_lock */
+ struct list_head mfd_list;
+ /** xid of the open request */
+ __u64 mfd_xid;
+ /** old handle in replay case */
+ struct lustre_handle mfd_old_handle;
+ /** point to opened object */
+ struct mdt_object *mfd_object;
};
#define CDT_NONBLOCKING_RESTORE (1ULL << 0)
} mdt_opts;
/* mdt state flags */
unsigned long mdt_state;
- /* lock to protect IOepoch */
- spinlock_t mdt_ioepoch_lock;
- __u64 mdt_ioepoch;
/* transaction callbacks */
struct dt_txn_callback mdt_txn_cb;
/* these values should be updated from lov if necessary.
* or should be placed somewhere else. */
int mdt_max_mdsize;
- int mdt_max_cookiesize;
int mdt_max_ea_size;
struct ptlrpc_thread mdt_ck_thread;
struct lustre_capa_key mdt_capa_keys[2];
unsigned int mdt_capa_conf:1,
- mdt_som_conf:1,
/* Enable remote dir on non-MDT0 */
mdt_enable_remote_dir:1;
spinlock_t mdt_osfs_lock;
/* root squash */
- uid_t mdt_squash_uid;
- gid_t mdt_squash_gid;
- cfs_list_t mdt_nosquash_nids;
- char *mdt_nosquash_str;
- int mdt_nosquash_strlen;
- struct rw_semaphore mdt_squash_sem;
+ struct root_squash_info mdt_squash;
struct rename_stats mdt_rename_stats;
struct lu_fid mdt_md_root_fid;
};
#define MDT_SERVICE_WATCHDOG_FACTOR (2)
-#define MDT_ROCOMPAT_SUPP (OBD_ROCOMPAT_LOVOBJID)
-#define MDT_INCOMPAT_SUPP (OBD_INCOMPAT_MDT | OBD_INCOMPAT_COMMON_LR | \
- OBD_INCOMPAT_FID | OBD_INCOMPAT_IAM_DIR | \
- OBD_INCOMPAT_LMM_VER | OBD_INCOMPAT_MULTI_OI)
#define MDT_COS_DEFAULT (0)
+enum mdt_object_flags {
+ /** lov object has been created. */
+ MOF_LOV_CREATED = 1 << 0,
+};
+
struct mdt_object {
struct lu_object_header mot_header;
struct lu_object mot_obj;
- __u64 mot_ioepoch;
- __u64 mot_flags;
- int mot_ioepoch_count;
- int mot_writecount;
- /* Lock to protect object's IO epoch. */
- struct mutex mot_ioepoch_mutex;
+ enum mdt_object_flags mot_flags;
+ int mot_write_count;
+ spinlock_t mot_write_lock;
/* Lock to protect create_data */
struct mutex mot_lov_mutex;
/* Lock to protect lease open.
atomic_t mot_open_count;
};
-enum mdt_object_flags {
- /** SOM attributes are changed. */
- MOF_SOM_CHANGE = (1 << 0),
- /**
- * The SOM recovery state for mdt object.
- * This state is an in-memory equivalent of an absent SOM EA, used
- * instead of invalidating SOM EA while IOEpoch is still opened when
- * a client eviction occurs or a client fails to obtain SOM attributes.
- * It indicates that the last IOEpoch holder will need to obtain SOM
- * attributes under [0;EOF] extent lock to flush all the client's
- * cached of evicted from MDS clients (but not necessary evicted from
- * OST) before taking ost attributes.
- */
- MOF_SOM_RECOV = (1 << 1),
- /** File has been just created. */
- MOF_SOM_CREATED = (1 << 2),
- /** lov object has been created. */
- MOF_LOV_CREATED = (1 << 3),
-};
-
struct mdt_lock_handle {
/* Lock type, reg for cross-ref use or pdo lock. */
mdl_type_t mlh_type;
MDT_CROSS_LOCK
};
+/* Special magical errno for communicaiton between mdt_reint_open()
+ * and mdt_intent_reint() which means return the lock to the client
+ * for subsequent cross ref open. Previously we used plain -EREMOTE
+ * but other functions called in that path might return it too and
+ * confuse us. This is not returned to the client. See LU-5370. */
+#define MDT_EREMOTE_OPEN (EREMOTE + 1024)
+
struct mdt_reint_record {
mdt_reint_t rr_opcode;
const struct lustre_handle *rr_handle;
const struct lu_fid *rr_fid2;
struct lu_name rr_name;
struct lu_name rr_tgt_name;
- const void *rr_eadata;
+ void *rr_eadata;
int rr_eadatalen;
__u32 rr_flags;
};
/* for mdt_sendpage() */
struct l_wait_info mti_wait_info;
} rdpg;
- struct {
- struct md_attr attr;
- struct md_som_data data;
- } som;
+ struct {
+ struct md_attr attr;
+ } hsm;
} mti_u;
- /* IO epoch related stuff. */
- struct mdt_ioepoch *mti_ioepoch;
- __u64 mti_replayepoch;
-
+ struct lustre_handle mti_close_handle;
loff_t mti_off;
struct lu_buf mti_buf;
struct lu_buf mti_big_buf;
return mti;
}
-/* ptlrpc request handler for MDT. All handlers are
- * grouped into several slices - struct mdt_opc_slice,
- * and stored in an array - mdt_handlers[].
- */
-struct mdt_handler {
- /* The name of this handler. */
- const char *mh_name;
- /* Fail id for this handler, checked at the beginning of this handler*/
- int mh_fail_id;
- /* Operation code for this handler */
- __u32 mh_opc;
- /* flags are listed in enum mdt_handler_flags below. */
- __u32 mh_flags;
- /* The actual handler function to execute. */
- int (*mh_act)(struct mdt_thread_info *info);
- /* Request format for this request. */
- const struct req_format *mh_fmt;
-};
-
-struct mdt_opc_slice {
- __u32 mos_opc_start;
- int mos_opc_end;
- struct mdt_handler *mos_hs;
-};
-
struct cdt_req_progress {
struct mutex crp_lock; /**< protect tree */
struct interval_node *crp_root; /**< tree to track extent
};
struct cdt_agent_req {
- cfs_list_t car_request_list; /**< to chain all the req. */
+ struct list_head car_request_list; /**< to chain all the req. */
atomic_t car_refcount; /**< reference counter */
__u64 car_compound_id; /**< compound id */
__u64 car_flags; /**< request original flags */
extern struct kmem_cache *mdt_hsm_car_kmem;
struct hsm_agent {
- cfs_list_t ha_list; /**< to chain the agents */
+ struct list_head ha_list; /**< to chain the agents */
struct obd_uuid ha_uuid; /**< agent uuid */
__u32 *ha_archive_id; /**< archive id */
int ha_archive_cnt; /**< number of archive entries
};
struct cdt_restore_handle {
- cfs_list_t crh_list; /**< to chain the handle */
- struct lu_fid crh_fid; /**< fid of the object */
- struct ldlm_extent crh_extent; /**< extent of the restore */
- struct mdt_lock_handle crh_lh; /**< lock handle */
+ struct list_head crh_list; /**< to chain the handle */
+ struct lu_fid crh_fid; /**< fid of the object */
+ struct ldlm_extent crh_extent; /**< extent of the restore */
+ struct mdt_lock_handle crh_lh; /**< lock handle */
};
extern struct kmem_cache *mdt_hsm_cdt_kmem; /** restore handle slab cache */
/* Here we use LVB_TYPE to check dne client, because it is
* also landed on 2.4. */
-static inline int mdt_is_dne_client(struct obd_export *exp)
+static inline bool mdt_is_dne_client(struct obd_export *exp)
{
return !!(exp_connect_flags(exp) & OBD_CONNECT_LVB_TYPE);
}
+static inline bool mdt_is_striped_client(struct obd_export *exp)
+{
+ return exp_connect_flags(exp) & OBD_CONNECT_DIR_STRIPE;
+}
+
int mdt_get_disposition(struct ldlm_reply *rep, int flag);
void mdt_set_disposition(struct mdt_thread_info *info,
struct ldlm_reply *rep, int flag);
struct mdt_object *o,
struct mdt_lock_handle *lh);
+int mdt_check_resent_lock(struct mdt_thread_info *info,
+ struct mdt_object *mo,
+ struct mdt_lock_handle *lhc);
+
int mdt_object_lock(struct mdt_thread_info *,
struct mdt_object *,
struct mdt_lock_handle *,
void mdt_client_compatibility(struct mdt_thread_info *info);
int mdt_remote_object_lock(struct mdt_thread_info *mti,
- struct mdt_object *o, struct lustre_handle *lh,
+ struct mdt_object *o, const struct lu_fid *fid,
+ struct lustre_handle *lh,
ldlm_mode_t mode, __u64 ibits);
enum mdt_name_flags {
int mdt_close_unpack(struct mdt_thread_info *info);
int mdt_reint_unpack(struct mdt_thread_info *info, __u32 op);
int mdt_reint_rec(struct mdt_thread_info *, struct mdt_lock_handle *);
+#ifdef CONFIG_FS_POSIX_ACL
+int mdt_pack_acl2body(struct mdt_thread_info *info, struct mdt_body *repbody,
+ struct mdt_object *o, struct lu_nodemap *nodemap);
+#endif
void mdt_pack_attr2body(struct mdt_thread_info *info, struct mdt_body *b,
const struct lu_attr *attr, const struct lu_fid *fid);
const struct lustre_handle *handle,
bool is_replay);
-enum {
- MDT_IOEPOCH_CLOSED = 0,
- MDT_IOEPOCH_OPENED = 1,
- MDT_IOEPOCH_GETATTR = 2,
-};
-
-enum {
- MDT_SOM_DISABLE = 0,
- MDT_SOM_ENABLE = 1,
-};
-
int mdt_get_info(struct tgt_session_info *tsi);
int mdt_attr_get_complex(struct mdt_thread_info *info,
struct mdt_object *o, struct md_attr *ma);
+int mdt_big_xattr_get(struct mdt_thread_info *info, struct mdt_object *o,
+ const char *name);
int mdt_stripe_get(struct mdt_thread_info *info, struct mdt_object *o,
struct md_attr *ma, const char *name);
-int mdt_ioepoch_open(struct mdt_thread_info *info, struct mdt_object *o,
- int created);
-int mdt_object_is_som_enabled(struct mdt_object *mo);
int mdt_write_get(struct mdt_object *o);
void mdt_write_put(struct mdt_object *o);
int mdt_write_read(struct mdt_object *o);
int mdt_mfd_close(struct mdt_thread_info *info, struct mdt_file_data *mfd);
void mdt_mfd_free(struct mdt_file_data *mfd);
int mdt_close(struct tgt_session_info *tsi);
-int mdt_attr_set(struct mdt_thread_info *info, struct mdt_object *mo,
- struct md_attr *ma, int flags);
int mdt_add_dirty_flag(struct mdt_thread_info *info, struct mdt_object *mo,
struct md_attr *ma);
-int mdt_done_writing(struct tgt_session_info *tsi);
int mdt_fix_reply(struct mdt_thread_info *info);
int mdt_handle_last_unlink(struct mdt_thread_info *, struct mdt_object *,
const struct md_attr *);
const struct lu_buf *mdt_buf_const(const struct lu_env *env,
const void *area, ssize_t len);
-void mdt_dump_lmm(int level, const struct lov_mds_md *lmm);
+void mdt_dump_lmm(int level, const struct lov_mds_md *lmm, __u64 valid);
void mdt_dump_lmv(unsigned int level, const union lmv_mds_md *lmv);
+bool allow_client_chgrp(struct mdt_thread_info *info, struct lu_ucred *uc);
int mdt_check_ucred(struct mdt_thread_info *);
int mdt_init_ucred(struct mdt_thread_info *, struct mdt_body *);
int mdt_init_ucred_reint(struct mdt_thread_info *);
void mdt_thread_info_fini(struct mdt_thread_info *mti);
struct mdt_thread_info *tsi2mdt_info(struct tgt_session_info *tsi);
-extern struct lprocfs_vars lprocfs_mds_module_vars[];
-extern struct lprocfs_vars lprocfs_mds_obd_vars[];
-
int mdt_hsm_attr_set(struct mdt_thread_info *info, struct mdt_object *obj,
const struct md_hsm *mh);
int mdt_pack_remote_perm(struct mdt_thread_info *, struct mdt_object *, void *);
+/* mdt/mdt_recovery.c */
+void mdt_req_from_lcd(struct ptlrpc_request *req, struct lsd_client_data *lcd);
+
/* mdt/mdt_hsm.c */
int mdt_hsm_state_get(struct tgt_session_info *tsi);
int mdt_hsm_state_set(struct tgt_session_info *tsi);
int mdt_hsm_cdt_wakeup(struct mdt_device *mdt);
/* coordinator control /proc interface */
-int lprocfs_wr_hsm_cdt_control(struct file *file, const char *buffer,
- unsigned long count, void *data);
-int lprocfs_rd_hsm_cdt_control(char *page, char **start, off_t off,
- int count, int *eof, void *data);
+ssize_t mdt_hsm_cdt_control_seq_write(struct file *file, const char *buffer,
+ size_t count, loff_t *off);
+int mdt_hsm_cdt_control_seq_show(struct seq_file *m, void *data);
int hsm_cdt_procfs_init(struct mdt_device *mdt);
void hsm_cdt_procfs_fini(struct mdt_device *mdt);
struct lprocfs_vars *hsm_cdt_get_proc_vars(void);
};
void mdt_counter_incr(struct ptlrpc_request *req, int opcode);
void mdt_stats_counter_init(struct lprocfs_stats *stats);
-void lprocfs_mdt_init_vars(struct lprocfs_static_vars *lvars);
-void lprocfs_mds_init_vars(struct lprocfs_static_vars *lvars);
int mdt_procfs_init(struct mdt_device *mdt, const char *name);
void mdt_procfs_fini(struct mdt_device *mdt);
int mds_mod_init(void);
void mds_mod_exit(void);
-#endif /* __KERNEL__ */
-#endif /* _MDT_H */
+static inline char *mdt_req_get_jobid(struct ptlrpc_request *req)
+{
+ struct obd_export *exp = req->rq_export;
+ char *jobid = NULL;
+
+ if (exp_connect_flags(exp) & OBD_CONNECT_JOBSTATS)
+ jobid = lustre_msg_get_jobid(req->rq_reqmsg);
+
+ return jobid;
+}
+
+#endif /* _MDT_INTERNAL_H */