1 /* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
2 * vim:expandtab:shiftwidth=8:tabstop=8:
4 * Copyright (C) 2002, 2003, 2004, 2005, 2006 Cluster File Systems, Inc.
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.
22 #ifndef _LMV_INTERNAL_H_
23 #define _LMV_INTERNAL_H_
25 #include <lustre/lustre_idl.h>
29 /* XXX: dirty hack, needs to be fixed more clever way. */
37 #define LMV_MAX_TGT_COUNT 128
39 #define lmv_init_lock(lmv) down(&lmv->init_sem);
40 #define lmv_init_unlock(lmv) up(&lmv->init_sem);
42 #define LL_IT2STR(it) \
43 ((it) ? ldlm_it2str((it)->it_op) : "0")
46 struct lu_fid li_fid; /* id of dirobj */
47 mdsno_t li_mds; /* cached mdsno where @li_fid lives */
48 unsigned long li_size; /* slave size value */
52 #define O_FREEING (1 << 0)
55 struct list_head lo_list;
56 struct semaphore lo_guard;
57 int lo_state; /* object state. */
58 atomic_t lo_count; /* ref counter. */
59 struct lu_fid lo_fid; /* master id of dir */
60 void *lo_update; /* bitmap of status (up-to-date) */
62 int lo_objcount; /* number of slaves */
63 struct lmv_inode *lo_inodes; /* array of sub-objs */
64 struct obd_device *lo_obd; /* pointer to LMV itself */
67 int lmv_obj_setup(struct obd_device *obd);
68 void lmv_obj_cleanup(struct obd_device *obd);
71 lmv_obj_lock(struct lmv_obj *obj)
78 lmv_obj_unlock(struct lmv_obj *obj)
84 void lmv_obj_add(struct lmv_obj *obj);
85 void lmv_obj_del(struct lmv_obj *obj);
87 void lmv_obj_put(struct lmv_obj *obj);
88 void lmv_obj_free(struct lmv_obj *obj);
90 struct lmv_obj *lmv_obj_get(struct lmv_obj *obj);
92 struct lmv_obj *lmv_obj_grab(struct obd_device *obd,
93 const struct lu_fid *fid);
95 struct lmv_obj *lmv_obj_alloc(struct obd_device *obd,
96 const struct lu_fid *fid,
97 struct lmv_stripe_md *mea);
99 struct lmv_obj *lmv_obj_create(struct obd_export *exp,
100 const struct lu_fid *fid,
101 struct lmv_stripe_md *mea);
103 int lmv_obj_delete(struct obd_export *exp,
104 const struct lu_fid *fid);
106 int lmv_check_connect(struct obd_device *obd);
108 int lmv_intent_lock(struct obd_export *exp, struct md_op_data *op_data,
109 void *lmm, int lmmsize, struct lookup_intent *it,
110 int flags, struct ptlrpc_request **reqp,
111 ldlm_blocking_callback cb_blocking,
112 int extra_lock_flags);
114 int lmv_intent_lookup(struct obd_export *exp, struct md_op_data *op_data,
115 void *lmm, int lmmsize, struct lookup_intent *it,
116 int flags, struct ptlrpc_request **reqp,
117 ldlm_blocking_callback cb_blocking,
118 int extra_lock_flags);
120 int lmv_intent_open(struct obd_export *exp, struct md_op_data *op_data,
121 void *lmm, int lmmsize, struct lookup_intent *it,
122 int flags, struct ptlrpc_request **reqp,
123 ldlm_blocking_callback cb_blocking,
124 int extra_lock_flags);
126 int lmv_intent_getattr(struct obd_export *exp, struct md_op_data *op_data,
127 void *lmm, int lmmsize, struct lookup_intent *it,
128 int flags, struct ptlrpc_request **reqp,
129 ldlm_blocking_callback cb_blocking,
130 int extra_lock_flags);
132 int lmv_revalidate_slaves(struct obd_export *, struct ptlrpc_request **,
133 const struct lu_fid *, struct lookup_intent *, int,
134 ldlm_blocking_callback cb_blocking,
135 int extra_lock_flags);
137 int lmv_handle_split(struct obd_export *, const struct lu_fid *);
138 int lmv_blocking_ast(struct ldlm_lock *, struct ldlm_lock_desc *,
140 int lmv_fld_lookup(struct lmv_obd *lmv, const struct lu_fid *fid,
142 int __lmv_fid_alloc(struct lmv_obd *lmv, struct lu_fid *fid,
144 int lmv_fid_alloc(struct obd_export *exp, struct lu_fid *fid,
145 struct md_op_data *op_data);
146 int lmv_alloc_slave_fids(struct obd_device *obd, struct lu_fid *pid,
147 struct md_op_data *op, struct lu_fid *fid);
149 static inline struct lmv_stripe_md *
150 lmv_get_mea(struct ptlrpc_request *req, int offset)
152 struct mdt_body *body;
153 struct lmv_stripe_md *mea;
157 body = lustre_msg_buf(req->rq_repmsg, offset, sizeof(*body));
159 if (!body || !S_ISDIR(body->mode) || !body->eadatasize)
162 mea = lustre_msg_buf(req->rq_repmsg, offset + 1,
166 if (mea->mea_count == 0)
172 static inline int lmv_get_easize(struct lmv_obd *lmv)
174 return sizeof(struct lmv_stripe_md) +
175 lmv->desc.ld_tgt_count *
176 sizeof(struct lu_fid);
179 static inline struct lmv_tgt_desc *
180 lmv_get_target(struct lmv_obd *lmv, mdsno_t mds)
182 return &lmv->tgts[mds];
185 static inline struct obd_export *
186 lmv_get_export(struct lmv_obd *lmv, mdsno_t mds)
188 return lmv_get_target(lmv, mds)->ltd_exp;
191 static inline struct lmv_tgt_desc *
192 lmv_find_target(struct lmv_obd *lmv, const struct lu_fid *fid)
197 rc = lmv_fld_lookup(lmv, fid, &mds);
201 return lmv_get_target(lmv, mds);
204 static inline struct obd_export *
205 lmv_find_export(struct lmv_obd *lmv, const struct lu_fid *fid)
207 return lmv_find_target(lmv, fid)->ltd_exp;
211 extern struct file_operations lmv_proc_target_fops;