Whamcloud - gitweb
land 0.5.20.3 b_devel onto HEAD (b_devel will remain)
[fs/lustre-release.git] / lustre / include / linux / lustre_mds.h
1 /* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
2  * vim:expandtab:shiftwidth=8:tabstop=8:
3  *
4  *  Copyright (C) 2001-2003 Cluster File Systems, Inc. <info@clusterfs.com>
5  *
6  *   This file is part of Lustre, http://www.lustre.org.
7  *
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.
11  *
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.
16  *
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.
20  *
21  * MDS data structures.
22  * See also lustre_idl.h for wire formats of requests.
23  *
24  */
25
26 #ifndef _LUSTRE_MDS_H
27 #define _LUSTRE_MDS_H
28
29 #ifdef __KERNEL__
30 #include <linux/fs.h>
31 #endif
32 #include <linux/kp30.h>
33 #include <linux/lustre_idl.h>
34
35 struct ldlm_lock_desc;
36 struct mds_obd;
37 struct ptlrpc_connection;
38 struct ptlrpc_client;
39 struct obd_export;
40 struct ptlrpc_request;
41 struct obd_device;
42 struct ll_file_data;
43
44 #define LUSTRE_MDS_NAME "mds"
45 #define LUSTRE_MDT_NAME "mdt"
46 #define LUSTRE_MDC_NAME "mdc"
47
48 struct mdc_rpc_lock {
49         struct semaphore rpcl_sem;
50         struct lookup_intent *rpcl_it;
51 };
52 extern struct mdc_rpc_lock mdc_rpc_lock;
53 extern struct mdc_rpc_lock mdc_setattr_lock;
54
55 static inline void mdc_init_rpc_lock(struct mdc_rpc_lock *lck)
56 {
57         sema_init(&lck->rpcl_sem, 1);
58         lck->rpcl_it = NULL;
59 }
60
61 static inline void mdc_get_rpc_lock(struct mdc_rpc_lock *lck, 
62                                     struct lookup_intent *it)
63 {
64         down(&lck->rpcl_sem);
65         if (it) { 
66                 lck->rpcl_it = it;
67                 it->it_iattr = (void *)1;
68         }
69 }
70
71 static inline void mdc_put_rpc_lock(struct mdc_rpc_lock *lck, 
72                                     struct lookup_intent *it)
73 {
74         if (it == NULL) {
75                 LASSERT(it == lck->rpcl_it);
76                 up(&lck->rpcl_sem);
77                 return;
78         }
79         if (it && it->it_iattr) {
80                 it->it_iattr = NULL;
81                 LASSERT(it == lck->rpcl_it);
82                 lck->rpcl_it = NULL;
83                 up(&lck->rpcl_sem);
84         }
85 }
86 struct  mdc_unlink_data {
87         struct inode *unl_dir;
88         struct inode *unl_de;
89         int unl_mode;
90         const char *unl_name;
91         int unl_len;
92 };
93
94 struct mds_update_record {
95         __u32 ur_fsuid;
96         __u32 ur_fsgid;
97         __u32 ur_cap;
98         __u32 ur_opcode;
99         struct ll_fid *ur_fid1;
100         struct ll_fid *ur_fid2;
101         int ur_namelen;
102         char *ur_name;
103         int ur_tgtlen;
104         char *ur_tgt;
105         struct iattr ur_iattr;
106         __u64 ur_rdev;
107         __u32 ur_mode;
108         __u32 ur_uid;
109         __u32 ur_gid;
110         __u64 ur_time;
111         __u32 ur_flags;
112         __u32 ur_suppgid1;
113         __u32 ur_suppgid2;
114 };
115
116 #define MDS_LR_CLIENT  8192
117 #define MDS_LR_SIZE     128
118
119 #define MDS_CLIENT_SLOTS 17
120
121 #define MDS_MOUNT_RECOV 2
122
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];
130 };
131
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];
142 };
143
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;
149         int                     med_off;
150         struct ptlrpc_request  *med_outstanding_reply;
151 };
152
153 /* file data for open files on MDS */
154 struct mds_file_data {
155         struct list_head     mfd_list;
156         __u64                mfd_servercookie;
157         __u64                mfd_xid;
158         struct file         *mfd_file;
159 };
160
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 *);
164
165 /* mds/mds_open.c */
166 int mds_open(struct mds_update_record *rec, int offset,
167              struct ptlrpc_request *req, struct lustre_handle *);
168
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 *);
177
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,
187                      int datalen);
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,
194                      int namelen);
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);
202
203 /* mds/handler.c */
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,
208                                       int dir_lock_mode);
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);
219
220 /* mds/mds_fs.c */
221 int mds_fs_setup(struct obd_device *obddev, struct vfsmount *mnt);
222 int mds_fs_cleanup(struct obd_device *obddev);
223
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);
266
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,
269                                 int repoff);
270
271 int mds_client_add(struct mds_obd *mds, struct mds_export_data *med,
272                    int cl_off);
273 int mds_client_free(struct obd_export *exp);
274
275
276 /* ioctls for trying requests */
277 #define IOC_REQUEST_TYPE                   'f'
278 #define IOC_REQUEST_MIN_NR                 30
279
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
287
288 #define MDS_CHECK_RESENT(req, reconstruct)                                     \
289 {                                                                              \
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) {                        \
294                         reconstruct;                                           \
295                         RETURN(0);                                             \
296                 }                                                              \
297                 DEBUG_REQ(D_HA, req, "no reply for RESENT req (have "LPD64")", \
298                           mcd->mcd_last_xid);                                  \
299         }                                                                      \
300 }
301
302 #endif