4 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 only,
8 * as published by the Free Software Foundation.
10 * This program is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * General Public License version 2 for more details (a copy is included
14 * in the LICENSE file that accompanied this code).
16 * You should have received a copy of the GNU General Public License
17 * version 2 along with this program; If not, see
18 * http://www.gnu.org/licenses/gpl-2.0.html
23 * Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved.
24 * Use is subject to license terms.
26 * Copyright (c) 2011, 2015, Intel Corporation.
29 * This file is part of Lustre, http://www.lustre.org/
30 * Lustre is a trademark of Sun Microsystems, Inc.
33 #ifndef _LMV_INTERNAL_H_
34 #define _LMV_INTERNAL_H_
36 #include <uapi/linux/lustre/lustre_idl.h>
38 #include <lustre_lmv.h>
40 #define LMV_MAX_TGT_COUNT 128
42 #define LL_IT2STR(it) \
43 ((it) ? ldlm_it2str((it)->it_op) : "0")
45 int lmv_intent_lock(struct obd_export
*exp
, struct md_op_data
*op_data
,
46 struct lookup_intent
*it
, struct ptlrpc_request
**reqp
,
47 ldlm_blocking_callback cb_blocking
,
48 __u64 extra_lock_flags
);
50 int lmv_fld_lookup(struct lmv_obd
*lmv
, const struct lu_fid
*fid
, u32
*mds
);
51 int __lmv_fid_alloc(struct lmv_obd
*lmv
, struct lu_fid
*fid
, u32 mds
);
52 int lmv_fid_alloc(const struct lu_env
*env
, struct obd_export
*exp
,
53 struct lu_fid
*fid
, struct md_op_data
*op_data
);
55 int lmv_revalidate_slaves(struct obd_export
*exp
,
56 const struct lmv_stripe_md
*lsm
,
57 ldlm_blocking_callback cb_blocking
,
58 int extra_lock_flags
);
60 static inline struct obd_device
*lmv2obd_dev(struct lmv_obd
*lmv
)
62 return container_of0(lmv
, struct obd_device
, u
.lmv
);
65 static inline struct lmv_tgt_desc
*
66 lmv_get_target(struct lmv_obd
*lmv
, u32 mdt_idx
, int *index
)
70 for (i
= 0; i
< lmv
->desc
.ld_tgt_count
; i
++) {
74 if (lmv
->tgts
[i
]->ltd_idx
== mdt_idx
) {
81 return ERR_PTR(-ENODEV
);
85 lmv_find_target_index(struct lmv_obd
*lmv
, const struct lu_fid
*fid
)
87 struct lmv_tgt_desc
*ltd
;
91 if (lmv
->desc
.ld_tgt_count
> 1) {
94 rc
= lmv_fld_lookup(lmv
, fid
, &mdt_idx
);
99 ltd
= lmv_get_target(lmv
, mdt_idx
, &index
);
106 static inline struct lmv_tgt_desc
*
107 lmv_find_target(struct lmv_obd
*lmv
, const struct lu_fid
*fid
)
111 index
= lmv_find_target_index(lmv
, fid
);
113 return ERR_PTR(index
);
115 return lmv
->tgts
[index
];
118 static inline int lmv_stripe_md_size(int stripe_count
)
120 struct lmv_stripe_md
*lsm
;
122 return sizeof(*lsm
) + stripe_count
* sizeof(lsm
->lsm_md_oinfo
[0]);
125 int lmv_name_to_stripe_index(enum lmv_hash_type hashtype
,
126 unsigned int max_mdt_index
,
127 const char *name
, int namelen
);
129 static inline const struct lmv_oinfo
*
130 lsm_name_to_stripe_info(const struct lmv_stripe_md
*lsm
, const char *name
,
135 stripe_index
= lmv_name_to_stripe_index(lsm
->lsm_md_hash_type
,
136 lsm
->lsm_md_stripe_count
,
138 if (stripe_index
< 0)
139 return ERR_PTR(stripe_index
);
141 LASSERTF(stripe_index
< lsm
->lsm_md_stripe_count
,
142 "stripe_index = %d, stripe_count = %d hash_type = %x name = %.*s\n",
143 stripe_index
, lsm
->lsm_md_stripe_count
,
144 lsm
->lsm_md_hash_type
, namelen
, name
);
146 return &lsm
->lsm_md_oinfo
[stripe_index
];
149 static inline bool lmv_need_try_all_stripes(const struct lmv_stripe_md
*lsm
)
151 return !lmv_is_known_hash_type(lsm
->lsm_md_hash_type
) ||
152 lsm
->lsm_md_hash_type
& LMV_HASH_FLAG_MIGRATION
;
156 *lmv_locate_mds(struct lmv_obd
*lmv
, struct md_op_data
*op_data
,
159 void lprocfs_lmv_init_vars(struct lprocfs_static_vars
*lvars
);
161 extern const struct file_operations lmv_proc_target_fops
;