#define _LUSTRE_MDS_H
#ifdef __KERNEL__
-#include <linux/fs.h>
+# include <linux/fs.h>
+# include <linux/dcache.h>
#endif
+#include <linux/lustre_handles.h>
#include <linux/kp30.h>
#include <linux/lustre_idl.h>
+#include <linux/lustre_lib.h>
+#include <linux/lustre_dlm.h>
struct ldlm_lock_desc;
struct mds_obd;
lck->rpcl_it = NULL;
}
+#ifdef __KERNEL__
+/* Compat code for kernel patch v18 users, can be removed when everyone has
+ * upgraded --phik 02 June 2003 */
+#ifdef IT_FL_LOCKED
+static inline void mdc_get_rpc_lock(struct mdc_rpc_lock *lck,
+ struct lookup_intent *it)
+{
+ down(&lck->rpcl_sem);
+ if (it) {
+ lck->rpcl_it = it;
+ it->it_int_flags |= IT_FL_LOCKED;
+ }
+}
+
+static inline void mdc_put_rpc_lock(struct mdc_rpc_lock *lck,
+ struct lookup_intent *it)
+{
+ if (it == NULL) {
+ LASSERT(it == lck->rpcl_it);
+ up(&lck->rpcl_sem);
+ return;
+ }
+ if (it != NULL && (it->it_int_flags & IT_FL_LOCKED)) {
+ it->it_int_flags &= ~IT_FL_LOCKED;
+ LASSERT(it == lck->rpcl_it);
+ lck->rpcl_it = NULL;
+ up(&lck->rpcl_sem);
+ }
+}
+#else
static inline void mdc_get_rpc_lock(struct mdc_rpc_lock *lck,
struct lookup_intent *it)
{
up(&lck->rpcl_sem);
}
}
-struct mdc_unlink_data {
- struct inode *unl_dir;
- struct inode *unl_de;
- int unl_mode;
- const char *unl_name;
- int unl_len;
+#endif
+#endif
+
+struct mdc_op_data {
+ __u64 ino1;
+ __u32 gen1;
+ __u32 typ1;
+ __u32 gid1;
+ __u64 ino2;
+ __u32 gen2;
+ __u32 typ2;
+ __u32 gid2;
+ const char *name;
+ int namelen;
+ int mode;
};
struct mds_update_record {
- __u32 ur_fsuid;
- __u32 ur_fsgid;
- __u32 ur_cap;
__u32 ur_opcode;
struct ll_fid *ur_fid1;
struct ll_fid *ur_fid2;
char *ur_name;
int ur_tgtlen;
char *ur_tgt;
+ int ur_eadatalen;
+ void *ur_eadata;
struct iattr ur_iattr;
+ struct obd_ucred ur_uc;
__u64 ur_rdev;
__u32 ur_mode;
__u32 ur_uid;
__u32 ur_gid;
__u64 ur_time;
__u32 ur_flags;
- __u32 ur_suppgid1;
- __u32 ur_suppgid2;
};
+#define ur_fsuid ur_uc.ouc_fsuid
+#define ur_fsgid ur_uc.ouc_fsgid
+#define ur_cap ur_uc.ouc_cap
+#define ur_suppgid1 ur_uc.ouc_suppgid1
+#define ur_suppgid2 ur_uc.ouc_suppgid2
+
#define MDS_LR_CLIENT 8192
#define MDS_LR_SIZE 128
__u8 padding[MDS_LR_SIZE - 74];
};
-/* In-memory access to client data from MDS struct */
-struct mds_export_data {
- struct list_head med_open_head;
- spinlock_t med_open_lock;
- struct mds_client_data *med_mcd;
- int med_off;
- struct ptlrpc_request *med_outstanding_reply;
-};
-
/* file data for open files on MDS */
struct mds_file_data {
- struct list_head mfd_list;
- __u64 mfd_servercookie;
- __u64 mfd_xid;
- struct file *mfd_file;
+ struct portals_handle mfd_handle; /* must be first */
+ atomic_t mfd_refcount;
+ struct list_head mfd_list;
+ __u64 mfd_xid;
+ int mfd_mode;
+ struct dentry *mfd_dentry;
};
/* mds/mds_reint.c */
int mds_open(struct mds_update_record *rec, int offset,
struct ptlrpc_request *req, struct lustre_handle *);
-/* lib/mds_updates.c */
-void mds_unpack_body(struct mds_body *b);
-void mds_unpack_fid(struct ll_fid *fid);
-void mds_pack_fid(struct ll_fid *fid);
-void mds_pack_req_body(struct ptlrpc_request *);
-void mds_pack_rep_body(struct ptlrpc_request *);
-int mds_update_unpack(struct ptlrpc_request *, int offset,
- struct mds_update_record *);
-
-void mds_readdir_pack(struct ptlrpc_request *req, __u64 offset, obd_id ino,
- int type, __u64 xid);
-void mds_getattr_pack(struct ptlrpc_request *req, int valid, int offset, int fl,
- struct inode *inode, const char *name, int namelen);
-void mds_setattr_pack(struct ptlrpc_request *, struct inode *,
- struct iattr *, void *ea, int ealen);
-void mds_create_pack(struct ptlrpc_request *, int offset, struct inode *dir,
- __u32 mode, __u64 rdev, __u32 uid, __u32 gid, __u64 time,
- const char *name, int namelen, const void *data,
- int datalen);
-void mds_open_pack(struct ptlrpc_request *, int offset, struct inode *dir,
- __u32 mode, __u64 rdev, __u32 uid, __u32 gid, __u64 time,
- __u32 flags, const char *name, int namelen,
- const void *data, int datalen);
-void mds_unlink_pack(struct ptlrpc_request *, int offset, struct inode *inode,
- struct inode *child, __u32 mode, const char *name,
- int namelen);
-void mds_link_pack(struct ptlrpc_request *, int offset, struct inode *ino,
- struct inode *dir, const char *name, int namelen);
-void mds_rename_pack(struct ptlrpc_request *, int offset, struct inode *srcdir,
- struct inode *tgtdir, const char *name, int namelen,
- const char *tgt, int tgtlen);
-void mds_pack_inode2fid(struct ll_fid *fid, struct inode *inode);
-void mds_pack_inode2body(struct mds_body *body, struct inode *inode);
-
/* mds/handler.c */
+#ifdef __KERNEL__
struct dentry *mds_name2locked_dentry(struct obd_device *, struct dentry *dir,
struct vfsmount **mnt, char *name,
int namelen, int lock_mode,
int mds_reint(struct ptlrpc_request *req, int offset, struct lustre_handle *);
int mds_pack_md(struct obd_device *mds, struct lustre_msg *msg,
int offset, struct mds_body *body, struct inode *inode);
-void mds_steal_ack_locks(struct mds_export_data *med,
+void mds_steal_ack_locks(struct obd_export *exp,
struct ptlrpc_request *req);
/* mds/mds_fs.c */
int mds_fs_setup(struct obd_device *obddev, struct vfsmount *mnt);
-int mds_fs_cleanup(struct obd_device *obddev);
+int mds_fs_cleanup(struct obd_device *obddev, int failover);
+#endif
/* mdc/mdc_request.c */
int mdc_enqueue(struct lustre_handle *conn, int lock_type,
- struct lookup_intent *it, int lock_mode, struct inode *dir,
- struct dentry *de, struct lustre_handle *lockh, char *tgt,
- int tgtlen, void *data, int datalen);
-int mdc_cancel_unused(struct lustre_handle *conn, struct inode *, int flags);
+ struct lookup_intent *it, int lock_mode,
+ struct mdc_op_data *enq_data,
+ struct lustre_handle *lockh, char *tgt, int tgtlen,
+ ldlm_completion_callback cb_completion,
+ ldlm_blocking_callback cb_blocking,
+ void *cb_data);
int mdc_getlovinfo(struct obd_device *obd, struct lustre_handle *mdc_connh,
struct ptlrpc_request **request);
int mdc_getstatus(struct lustre_handle *conn, struct ll_fid *rootfid);
-int mdc_getattr(struct lustre_handle *conn,
- obd_id ino, int type, unsigned long valid, unsigned int ea_size,
+int mdc_getattr(struct lustre_handle *conn, struct ll_fid *fid,
+ unsigned long valid, unsigned int ea_size,
struct ptlrpc_request **request);
-int mdc_getattr_name(struct lustre_handle *conn, struct inode *parent,
+int mdc_getattr_name(struct lustre_handle *conn, struct ll_fid *fid,
char *filename, int namelen, unsigned long valid,
unsigned int ea_size, struct ptlrpc_request **request);
int mdc_setattr(struct lustre_handle *conn,
- struct inode *, struct iattr *iattr,
- void *ea, int ealen, struct ptlrpc_request **);
+ struct mdc_op_data *data,
+ struct iattr *iattr, void *ea, int ealen,
+ struct ptlrpc_request **request);
int mdc_open(struct lustre_handle *conn, obd_id ino, int type, int flags,
struct lov_mds_md *lmm, int lmm_size, struct lustre_handle *fh,
struct ptlrpc_request **);
-void mdc_set_open_replay_data(struct ll_file_data *fd);
+struct obd_client_handle;
+void mdc_set_open_replay_data(struct obd_client_handle *och);
int mdc_close(struct lustre_handle *conn, obd_id ino, int type,
struct lustre_handle *fh, struct ptlrpc_request **req);
-int mdc_readpage(struct lustre_handle *conn, obd_id ino,
- int type, __u64 offset, char *addr, struct ptlrpc_request **);
-int mdc_create(struct lustre_handle *conn,
- struct inode *dir, const char *name, int namelen,
+int mdc_readpage(struct lustre_handle *conn, obd_id ino, int type, __u64 offset,
+ struct page *, struct ptlrpc_request **);
+int mdc_create(struct lustre_handle *conn, struct mdc_op_data *op_data,
const void *data, int datalen, int mode, __u32 uid, __u32 gid,
- __u64 time, __u64 rdev, struct ptlrpc_request **);
-int mdc_unlink(struct lustre_handle *, struct inode *dir, struct inode *child,
- __u32 mode, const char *name, int namelen,
- struct ptlrpc_request **);
-int mdc_link(struct lustre_handle *conn,
- struct inode *src, struct inode *dir, const char *name,
- int namelen, struct ptlrpc_request **);
-int mdc_rename(struct lustre_handle *conn,
- struct inode *src, struct inode *tgt, const char *old,
- int oldlen, const char *new, int newlen,
- struct ptlrpc_request **);
+ __u64 time, __u64 rdev, struct ptlrpc_request **request);
+int mdc_unlink(struct lustre_handle *conn, struct mdc_op_data *data,
+ struct ptlrpc_request **request);
+int mdc_link(struct lustre_handle *conn, struct mdc_op_data *data,
+ struct ptlrpc_request **);
+int mdc_rename(struct lustre_handle *conn, struct mdc_op_data *data,
+ const char *old, int oldlen, const char *new, int newlen,
+ struct ptlrpc_request **request);
int mdc_create_client(struct obd_uuid uuid, struct ptlrpc_client *cl);
-void mdc_lock_set_inode(struct lustre_handle *lock, struct inode *inode);
/* Store the generation of a newly-created inode in |req| for replay. */
void mdc_store_inode_generation(struct ptlrpc_request *req, int reqoff,
int repoff);
-int mds_client_add(struct mds_obd *mds, struct mds_export_data *med,
- int cl_off);
-int mds_client_free(struct obd_export *exp);
-
/* ioctls for trying requests */
#define IOC_REQUEST_TYPE 'f'