1 /* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
2 * vim:expandtab:shiftwidth=8:tabstop=8:
4 * Copyright (C) 2001-2003 Cluster File Systems, Inc. <info@clusterfs.com>
6 * This file is part of Lustre, http://www.lustre.org.
8 * Lustre is free software; you can redistribute it and/or
9 * modify it under the terms of version 2 of the GNU General Public
10 * License as published by the Free Software Foundation.
12 * Lustre is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with Lustre; if not, write to the Free Software
19 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 * MDS data structures.
22 * See also lustre_idl.h for wire formats of requests.
32 #include <linux/kp30.h>
33 #include <linux/lustre_idl.h>
35 struct ldlm_lock_desc;
37 struct ptlrpc_connection;
40 struct ptlrpc_request;
44 #define LUSTRE_MDS_NAME "mds"
45 #define LUSTRE_MDT_NAME "mdt"
46 #define LUSTRE_MDC_NAME "mdc"
49 struct semaphore rpcl_sem;
50 struct lookup_intent *rpcl_it;
52 extern struct mdc_rpc_lock mdc_rpc_lock;
53 extern struct mdc_rpc_lock mdc_setattr_lock;
55 static inline void mdc_init_rpc_lock(struct mdc_rpc_lock *lck)
57 sema_init(&lck->rpcl_sem, 1);
61 static inline void mdc_get_rpc_lock(struct mdc_rpc_lock *lck,
62 struct lookup_intent *it)
67 it->it_iattr = (void *)1;
71 static inline void mdc_put_rpc_lock(struct mdc_rpc_lock *lck,
72 struct lookup_intent *it)
75 LASSERT(it == lck->rpcl_it);
79 if (it && it->it_iattr) {
81 LASSERT(it == lck->rpcl_it);
86 struct mdc_unlink_data {
87 struct inode *unl_dir;
94 struct mds_update_record {
99 struct ll_fid *ur_fid1;
100 struct ll_fid *ur_fid2;
105 struct iattr ur_iattr;
116 #define MDS_LR_CLIENT 8192
117 #define MDS_LR_SIZE 128
119 #define MDS_CLIENT_SLOTS 17
121 #define MDS_MOUNT_RECOV 2
123 /* Data stored per server at the head of the last_rcvd file. In le32 order. */
124 struct mds_server_data {
125 __u8 msd_uuid[37]; /* server UUID */
126 __u8 uuid_padding[3]; /* unused */
127 __u64 msd_last_transno; /* last completed transaction ID */
128 __u64 msd_mount_count; /* MDS incarnation number */
129 __u8 padding[512 - 56];
132 /* Data stored per client in the last_rcvd file. In le32 order. */
133 struct mds_client_data {
134 __u8 mcd_uuid[37]; /* client UUID */
135 __u8 uuid_padding[3]; /* unused */
136 __u64 mcd_mount_count; /* MDS incarnation number */
137 __u64 mcd_last_transno; /* last completed transaction ID */
138 __u64 mcd_last_xid; /* xid for the last transaction */
139 __u32 mcd_last_result; /* result from last RPC */
140 __u32 mcd_last_data; /* per-op data (disposition for open &c.) */
141 __u8 padding[MDS_LR_SIZE - 58];
144 /* In-memory access to client data from MDS struct */
145 struct mds_export_data {
146 struct list_head med_open_head;
147 spinlock_t med_open_lock;
148 struct mds_client_data *med_mcd;
150 struct ptlrpc_request *med_outstanding_reply;
153 /* file data for open files on MDS */
154 struct mds_file_data {
155 struct list_head mfd_list;
156 __u64 mfd_servercookie;
158 struct file *mfd_file;
161 /* mds/mds_reint.c */
162 int mds_reint_rec(struct mds_update_record *r, int offset,
163 struct ptlrpc_request *req, struct lustre_handle *);
166 int mds_open(struct mds_update_record *rec, int offset,
167 struct ptlrpc_request *req, struct lustre_handle *);
169 /* lib/mds_updates.c */
170 void mds_unpack_body(struct mds_body *b);
171 void mds_unpack_fid(struct ll_fid *fid);
172 void mds_pack_fid(struct ll_fid *fid);
173 void mds_pack_req_body(struct ptlrpc_request *);
174 void mds_pack_rep_body(struct ptlrpc_request *);
175 int mds_update_unpack(struct ptlrpc_request *, int offset,
176 struct mds_update_record *);
178 void mds_readdir_pack(struct ptlrpc_request *req, __u64 offset, obd_id ino,
179 int type, __u64 xid);
180 void mds_getattr_pack(struct ptlrpc_request *req, int valid, int offset, int fl,
181 struct inode *inode, const char *name, int namelen);
182 void mds_setattr_pack(struct ptlrpc_request *, struct inode *,
183 struct iattr *, void *ea, int ealen);
184 void mds_create_pack(struct ptlrpc_request *, int offset, struct inode *dir,
185 __u32 mode, __u64 rdev, __u32 uid, __u32 gid, __u64 time,
186 const char *name, int namelen, const void *data,
188 void mds_open_pack(struct ptlrpc_request *, int offset, struct inode *dir,
189 __u32 mode, __u64 rdev, __u32 uid, __u32 gid, __u64 time,
190 __u32 flags, const char *name, int namelen,
191 const void *data, int datalen);
192 void mds_unlink_pack(struct ptlrpc_request *, int offset, struct inode *inode,
193 struct inode *child, __u32 mode, const char *name,
195 void mds_link_pack(struct ptlrpc_request *, int offset, struct inode *ino,
196 struct inode *dir, const char *name, int namelen);
197 void mds_rename_pack(struct ptlrpc_request *, int offset, struct inode *srcdir,
198 struct inode *tgtdir, const char *name, int namelen,
199 const char *tgt, int tgtlen);
200 void mds_pack_inode2fid(struct ll_fid *fid, struct inode *inode);
201 void mds_pack_inode2body(struct mds_body *body, struct inode *inode);
204 struct dentry *mds_name2locked_dentry(struct obd_device *, struct dentry *dir,
205 struct vfsmount **mnt, char *name,
206 int namelen, int lock_mode,
207 struct lustre_handle *lockh,
209 struct dentry *mds_fid2locked_dentry(struct obd_device *obd, struct ll_fid *fid,
210 struct vfsmount **mnt, int lock_mode,
211 struct lustre_handle *lockh);
212 struct dentry *mds_fid2dentry(struct mds_obd *mds, struct ll_fid *fid,
213 struct vfsmount **mnt);
214 int mds_reint(struct ptlrpc_request *req, int offset, struct lustre_handle *);
215 int mds_pack_md(struct obd_device *mds, struct lustre_msg *msg,
216 int offset, struct mds_body *body, struct inode *inode);
217 void mds_steal_ack_locks(struct mds_export_data *med,
218 struct ptlrpc_request *req);
221 int mds_fs_setup(struct obd_device *obddev, struct vfsmount *mnt);
222 int mds_fs_cleanup(struct obd_device *obddev);
224 /* mdc/mdc_request.c */
225 int mdc_enqueue(struct lustre_handle *conn, int lock_type,
226 struct lookup_intent *it, int lock_mode, struct inode *dir,
227 struct dentry *de, struct lustre_handle *lockh, char *tgt,
228 int tgtlen, void *data, int datalen);
229 int mdc_cancel_unused(struct lustre_handle *conn, struct inode *, int flags);
230 int mdc_getlovinfo(struct obd_device *obd, struct lustre_handle *mdc_connh,
231 struct ptlrpc_request **request);
232 int mdc_getstatus(struct lustre_handle *conn, struct ll_fid *rootfid);
233 int mdc_getattr(struct lustre_handle *conn,
234 obd_id ino, int type, unsigned long valid, unsigned int ea_size,
235 struct ptlrpc_request **request);
236 int mdc_getattr_name(struct lustre_handle *conn, struct inode *parent,
237 char *filename, int namelen, unsigned long valid,
238 unsigned int ea_size, struct ptlrpc_request **request);
239 int mdc_setattr(struct lustre_handle *conn,
240 struct inode *, struct iattr *iattr,
241 void *ea, int ealen, struct ptlrpc_request **);
242 int mdc_open(struct lustre_handle *conn, obd_id ino, int type, int flags,
243 struct lov_mds_md *lmm, int lmm_size, struct lustre_handle *fh,
244 struct ptlrpc_request **);
245 void mdc_set_open_replay_data(struct ll_file_data *fd);
246 int mdc_close(struct lustre_handle *conn, obd_id ino, int type,
247 struct lustre_handle *fh, struct ptlrpc_request **req);
248 int mdc_readpage(struct lustre_handle *conn, obd_id ino,
249 int type, __u64 offset, char *addr, struct ptlrpc_request **);
250 int mdc_create(struct lustre_handle *conn,
251 struct inode *dir, const char *name, int namelen,
252 const void *data, int datalen, int mode, __u32 uid, __u32 gid,
253 __u64 time, __u64 rdev, struct ptlrpc_request **);
254 int mdc_unlink(struct lustre_handle *, struct inode *dir, struct inode *child,
255 __u32 mode, const char *name, int namelen,
256 struct ptlrpc_request **);
257 int mdc_link(struct lustre_handle *conn,
258 struct inode *src, struct inode *dir, const char *name,
259 int namelen, struct ptlrpc_request **);
260 int mdc_rename(struct lustre_handle *conn,
261 struct inode *src, struct inode *tgt, const char *old,
262 int oldlen, const char *new, int newlen,
263 struct ptlrpc_request **);
264 int mdc_create_client(struct obd_uuid uuid, struct ptlrpc_client *cl);
265 void mdc_lock_set_inode(struct lustre_handle *lock, struct inode *inode);
267 /* Store the generation of a newly-created inode in |req| for replay. */
268 void mdc_store_inode_generation(struct ptlrpc_request *req, int reqoff,
271 int mds_client_add(struct mds_obd *mds, struct mds_export_data *med,
273 int mds_client_free(struct obd_export *exp);
276 /* ioctls for trying requests */
277 #define IOC_REQUEST_TYPE 'f'
278 #define IOC_REQUEST_MIN_NR 30
280 #define IOC_REQUEST_GETATTR _IOWR('f', 30, long)
281 #define IOC_REQUEST_READPAGE _IOWR('f', 31, long)
282 #define IOC_REQUEST_SETATTR _IOWR('f', 32, long)
283 #define IOC_REQUEST_CREATE _IOWR('f', 33, long)
284 #define IOC_REQUEST_OPEN _IOWR('f', 34, long)
285 #define IOC_REQUEST_CLOSE _IOWR('f', 35, long)
286 #define IOC_REQUEST_MAX_NR 35
288 #define MDS_CHECK_RESENT(req, reconstruct) \
290 if (lustre_msg_get_flags(req->rq_reqmsg) & MSG_RESENT) { \
291 struct mds_client_data *mcd = \
292 req->rq_export->exp_mds_data.med_mcd; \
293 if (mcd->mcd_last_xid == req->rq_xid) { \
297 DEBUG_REQ(D_HA, req, "no reply for RESENT req (have "LPD64")", \
298 mcd->mcd_last_xid); \