linux/drivers/staging/lustre/lustre/lov/lov_internal.h
<<
>>
Prefs
   1/*
   2 * GPL HEADER START
   3 *
   4 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   5 *
   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.
   9 *
  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).
  15 *
  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.sun.com/software/products/lustre/docs/GPLv2.pdf
  19 *
  20 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
  21 * CA 95054 USA or visit www.sun.com if you need additional information or
  22 * have any questions.
  23 *
  24 * GPL HEADER END
  25 */
  26/*
  27 * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
  28 * Use is subject to license terms.
  29 *
  30 * Copyright (c) 2011, 2015, Intel Corporation.
  31 */
  32/*
  33 * This file is part of Lustre, http://www.lustre.org/
  34 * Lustre is a trademark of Sun Microsystems, Inc.
  35 */
  36
  37#ifndef LOV_INTERNAL_H
  38#define LOV_INTERNAL_H
  39
  40#include "../include/obd_class.h"
  41#include "../include/lustre/lustre_user.h"
  42
  43/* lov_do_div64(a, b) returns a % b, and a = a / b.
  44 * The 32-bit code is LOV-specific due to knowing about stripe limits in
  45 * order to reduce the divisor to a 32-bit number.  If the divisor is
  46 * already a 32-bit value the compiler handles this directly.
  47 */
  48#if BITS_PER_LONG == 64
  49# define lov_do_div64(n, base) ({                                       \
  50        uint64_t __base = (base);                                       \
  51        uint64_t __rem;                                                 \
  52        __rem = ((uint64_t)(n)) % __base;                               \
  53        (n) = ((uint64_t)(n)) / __base;                                 \
  54        __rem;                                                          \
  55})
  56#elif BITS_PER_LONG == 32
  57# define lov_do_div64(n, base) ({                                       \
  58        uint64_t __rem;                                                 \
  59        if ((sizeof(base) > 4) && (((base) & 0xffffffff00000000ULL) != 0)) {  \
  60                int __remainder;                                              \
  61                LASSERTF(!((base) & (LOV_MIN_STRIPE_SIZE - 1)), "64 bit lov " \
  62                         "division %llu / %llu\n", (n), (uint64_t)(base));    \
  63                __remainder = (n) & (LOV_MIN_STRIPE_SIZE - 1);          \
  64                (n) >>= LOV_MIN_STRIPE_BITS;                            \
  65                __rem = do_div(n, (base) >> LOV_MIN_STRIPE_BITS);       \
  66                __rem <<= LOV_MIN_STRIPE_BITS;                          \
  67                __rem += __remainder;                                   \
  68        } else {                                                        \
  69                __rem = do_div(n, base);                                \
  70        }                                                               \
  71        __rem;                                                          \
  72})
  73#endif
  74
  75struct lov_request {
  76        struct obd_info   rq_oi;
  77        struct lov_request_set  *rq_rqset;
  78
  79        struct list_head               rq_link;
  80
  81        int                   rq_idx;   /* index in lov->tgts array */
  82        int                   rq_stripe;     /* stripe number */
  83        int                   rq_complete;
  84        int                   rq_rc;
  85
  86        u32                   rq_oabufs;
  87        u32                   rq_pgaidx;
  88};
  89
  90struct lov_request_set {
  91        struct ldlm_enqueue_info        *set_ei;
  92        struct obd_info                 *set_oi;
  93        atomic_t                        set_refcount;
  94        struct obd_export               *set_exp;
  95        /* XXX: There is @set_exp already, however obd_statfs gets obd_device
  96         * only.
  97         */
  98        struct obd_device               *set_obd;
  99        int                             set_count;
 100        atomic_t                        set_completes;
 101        atomic_t                        set_success;
 102        atomic_t                        set_finish_checked;
 103        struct llog_cookie              *set_cookies;
 104        int                             set_cookie_sent;
 105        struct obd_trans_info           *set_oti;
 106        struct list_head                        set_list;
 107        wait_queue_head_t                       set_waitq;
 108        spinlock_t                      set_lock;
 109};
 110
 111extern struct kmem_cache *lov_oinfo_slab;
 112
 113extern struct lu_kmem_descr lov_caches[];
 114
 115void lov_finish_set(struct lov_request_set *set);
 116
 117static inline void lov_get_reqset(struct lov_request_set *set)
 118{
 119        LASSERT(atomic_read(&set->set_refcount) > 0);
 120        atomic_inc(&set->set_refcount);
 121}
 122
 123static inline void lov_put_reqset(struct lov_request_set *set)
 124{
 125        if (atomic_dec_and_test(&set->set_refcount))
 126                lov_finish_set(set);
 127}
 128
 129#define lov_uuid2str(lv, index) \
 130        (char *)((lv)->lov_tgts[index]->ltd_uuid.uuid)
 131
 132/* lov_merge.c */
 133void lov_merge_attrs(struct obdo *tgt, struct obdo *src, u64 valid,
 134                     struct lov_stripe_md *lsm, int stripeno, int *set);
 135int lov_adjust_kms(struct obd_export *exp, struct lov_stripe_md *lsm,
 136                   u64 size, int shrink);
 137int lov_merge_lvb_kms(struct lov_stripe_md *lsm,
 138                      struct ost_lvb *lvb, __u64 *kms_place);
 139
 140/* lov_offset.c */
 141u64 lov_stripe_size(struct lov_stripe_md *lsm, u64 ost_size, int stripeno);
 142int lov_stripe_offset(struct lov_stripe_md *lsm, u64 lov_off,
 143                      int stripeno, u64 *u64);
 144u64 lov_size_to_stripe(struct lov_stripe_md *lsm, u64 file_size, int stripeno);
 145int lov_stripe_intersects(struct lov_stripe_md *lsm, int stripeno,
 146                          u64 start, u64 end,
 147                          u64 *obd_start, u64 *obd_end);
 148int lov_stripe_number(struct lov_stripe_md *lsm, u64 lov_off);
 149
 150/* lov_qos.c */
 151#define LOV_USES_ASSIGNED_STRIPE        0
 152#define LOV_USES_DEFAULT_STRIPE  1
 153
 154/* lov_request.c */
 155int lov_update_common_set(struct lov_request_set *set,
 156                          struct lov_request *req, int rc);
 157int lov_prep_getattr_set(struct obd_export *exp, struct obd_info *oinfo,
 158                         struct lov_request_set **reqset);
 159int lov_fini_getattr_set(struct lov_request_set *set);
 160int lov_prep_destroy_set(struct obd_export *exp, struct obd_info *oinfo,
 161                         struct obdo *src_oa, struct lov_stripe_md *lsm,
 162                         struct obd_trans_info *oti,
 163                         struct lov_request_set **reqset);
 164int lov_fini_destroy_set(struct lov_request_set *set);
 165int lov_prep_setattr_set(struct obd_export *exp, struct obd_info *oinfo,
 166                         struct obd_trans_info *oti,
 167                         struct lov_request_set **reqset);
 168int lov_update_setattr_set(struct lov_request_set *set,
 169                           struct lov_request *req, int rc);
 170int lov_fini_setattr_set(struct lov_request_set *set);
 171int lov_prep_statfs_set(struct obd_device *obd, struct obd_info *oinfo,
 172                        struct lov_request_set **reqset);
 173int lov_fini_statfs(struct obd_device *obd, struct obd_statfs *osfs,
 174                    int success);
 175int lov_fini_statfs_set(struct lov_request_set *set);
 176int lov_statfs_interpret(struct ptlrpc_request_set *rqset, void *data, int rc);
 177
 178/* lov_obd.c */
 179void lov_fix_desc(struct lov_desc *desc);
 180void lov_fix_desc_stripe_size(__u64 *val);
 181void lov_fix_desc_stripe_count(__u32 *val);
 182void lov_fix_desc_pattern(__u32 *val);
 183void lov_fix_desc_qos_maxage(__u32 *val);
 184__u16 lov_get_stripecnt(struct lov_obd *lov, __u32 magic, __u16 stripe_count);
 185int lov_connect_obd(struct obd_device *obd, __u32 index, int activate,
 186                    struct obd_connect_data *data);
 187int lov_setup(struct obd_device *obd, struct lustre_cfg *lcfg);
 188int lov_process_config_base(struct obd_device *obd, struct lustre_cfg *lcfg,
 189                            __u32 *indexp, int *genp);
 190int lov_del_target(struct obd_device *obd, __u32 index,
 191                   struct obd_uuid *uuidp, int gen);
 192
 193/* lov_pack.c */
 194int lov_packmd(struct obd_export *exp, struct lov_mds_md **lmm,
 195               struct lov_stripe_md *lsm);
 196int lov_unpackmd(struct obd_export *exp, struct lov_stripe_md **lsmp,
 197                 struct lov_mds_md *lmm, int lmm_bytes);
 198int lov_getstripe(struct obd_export *exp,
 199                  struct lov_stripe_md *lsm, struct lov_user_md __user *lump);
 200int lov_alloc_memmd(struct lov_stripe_md **lsmp, __u16 stripe_count,
 201                    int pattern, int magic);
 202int lov_free_memmd(struct lov_stripe_md **lsmp);
 203
 204void lov_dump_lmm_v1(int level, struct lov_mds_md_v1 *lmm);
 205void lov_dump_lmm_v3(int level, struct lov_mds_md_v3 *lmm);
 206void lov_dump_lmm_common(int level, void *lmmp);
 207
 208/* lov_ea.c */
 209struct lov_stripe_md *lsm_alloc_plain(__u16 stripe_count, int *size);
 210void lsm_free_plain(struct lov_stripe_md *lsm);
 211void dump_lsm(unsigned int level, const struct lov_stripe_md *lsm);
 212
 213/* lproc_lov.c */
 214extern const struct file_operations lov_proc_target_fops;
 215void lprocfs_lov_init_vars(struct lprocfs_static_vars *lvars);
 216
 217/* lov_cl.c */
 218extern struct lu_device_type lov_device_type;
 219
 220/* pools */
 221extern struct cfs_hash_ops pool_hash_operations;
 222/* ost_pool methods */
 223int lov_ost_pool_init(struct ost_pool *op, unsigned int count);
 224int lov_ost_pool_extend(struct ost_pool *op, unsigned int min_count);
 225int lov_ost_pool_add(struct ost_pool *op, __u32 idx, unsigned int min_count);
 226int lov_ost_pool_remove(struct ost_pool *op, __u32 idx);
 227int lov_ost_pool_free(struct ost_pool *op);
 228
 229/* high level pool methods */
 230int lov_pool_new(struct obd_device *obd, char *poolname);
 231int lov_pool_del(struct obd_device *obd, char *poolname);
 232int lov_pool_add(struct obd_device *obd, char *poolname, char *ostname);
 233int lov_pool_remove(struct obd_device *obd, char *poolname, char *ostname);
 234struct pool_desc *lov_find_pool(struct lov_obd *lov, char *poolname);
 235int lov_check_index_in_pool(__u32 idx, struct pool_desc *pool);
 236void lov_pool_putref(struct pool_desc *pool);
 237
 238static inline struct lov_stripe_md *lsm_addref(struct lov_stripe_md *lsm)
 239{
 240        LASSERT(atomic_read(&lsm->lsm_refc) > 0);
 241        atomic_inc(&lsm->lsm_refc);
 242        return lsm;
 243}
 244
 245static inline bool lov_oinfo_is_dummy(const struct lov_oinfo *loi)
 246{
 247        if (unlikely(loi->loi_oi.oi.oi_id == 0 &&
 248                     loi->loi_oi.oi.oi_seq == 0 &&
 249                     loi->loi_ost_idx == 0 &&
 250                     loi->loi_ost_gen == 0))
 251                return true;
 252
 253        return false;
 254}
 255
 256#endif
 257