linux/drivers/staging/lustre/lustre/include/obd_lov.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) 2002, 2010, Oracle and/or its affiliates. All rights reserved.
  28 * Use is subject to license terms.
  29 *
  30 * Copyright (c) 2011, 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 _OBD_LOV_H__
  38#define _OBD_LOV_H__
  39
  40#define LOV_DEFAULT_STRIPE_SIZE (1 << LNET_MTU_BITS)
  41
  42static inline int lov_stripe_md_size(__u16 stripes)
  43{
  44        return sizeof(struct lov_stripe_md) + stripes*sizeof(struct lov_oinfo*);
  45}
  46
  47static inline __u32 lov_mds_md_size(__u16 stripes, __u32 lmm_magic)
  48{
  49        if (lmm_magic == LOV_MAGIC_V3)
  50                return sizeof(struct lov_mds_md_v3) +
  51                        stripes * sizeof(struct lov_ost_data_v1);
  52        else
  53                return sizeof(struct lov_mds_md_v1) +
  54                        stripes * sizeof(struct lov_ost_data_v1);
  55}
  56
  57struct lov_version_size {
  58        __u32   lvs_magic;
  59        size_t  lvs_lmm_size;
  60        size_t  lvs_lod_size;
  61};
  62
  63static inline __u32 lov_mds_md_stripecnt(int ea_size, __u32 lmm_magic)
  64{
  65        static const struct lov_version_size lmm_ver_size[] = {
  66                        { .lvs_magic = LOV_MAGIC_V3,
  67                          .lvs_lmm_size = sizeof(struct lov_mds_md_v3),
  68                          .lvs_lod_size = sizeof(struct lov_ost_data_v1) },
  69                        { .lvs_magic = LOV_MAGIC_V1,
  70                          .lvs_lmm_size = sizeof(struct lov_mds_md_v1),
  71                          .lvs_lod_size = sizeof(struct lov_ost_data_v1)} };
  72        int i;
  73
  74        for (i = 0; i < ARRAY_SIZE(lmm_ver_size); i++) {
  75                if (lmm_magic == lmm_ver_size[i].lvs_magic) {
  76                        if (ea_size <= lmm_ver_size[i].lvs_lmm_size)
  77                                return 0;
  78                        return (ea_size - lmm_ver_size[i].lvs_lmm_size) /
  79                                lmm_ver_size[i].lvs_lod_size;
  80                }
  81        }
  82
  83        /* Invalid LOV magic, so no stripes could fit */
  84        return 0;
  85}
  86
  87/* lov_do_div64(a, b) returns a % b, and a = a / b.
  88 * The 32-bit code is LOV-specific due to knowing about stripe limits in
  89 * order to reduce the divisor to a 32-bit number.  If the divisor is
  90 * already a 32-bit value the compiler handles this directly. */
  91#if BITS_PER_LONG > 32
  92# define lov_do_div64(n,base) ({                                        \
  93        uint64_t __base = (base);                                       \
  94        uint64_t __rem;                                                 \
  95        __rem = ((uint64_t)(n)) % __base;                               \
  96        (n) = ((uint64_t)(n)) / __base;                                 \
  97        __rem;                                                          \
  98  })
  99#else
 100# define lov_do_div64(n,base) ({                                        \
 101        uint64_t __rem;                                                 \
 102        if ((sizeof(base) > 4) && (((base) & 0xffffffff00000000ULL) != 0)) {  \
 103                int __remainder;                                              \
 104                LASSERTF(!((base) & (LOV_MIN_STRIPE_SIZE - 1)), "64 bit lov " \
 105                         "division %llu / %llu\n", (n), (uint64_t)(base));    \
 106                __remainder = (n) & (LOV_MIN_STRIPE_SIZE - 1);          \
 107                (n) >>= LOV_MIN_STRIPE_BITS;                            \
 108                __rem = do_div(n, (base) >> LOV_MIN_STRIPE_BITS);       \
 109                __rem <<= LOV_MIN_STRIPE_BITS;                          \
 110                __rem += __remainder;                                   \
 111        } else {                                                        \
 112                __rem = do_div(n, base);                                \
 113        }                                                               \
 114        __rem;                                                          \
 115  })
 116#endif
 117
 118#define IOC_LOV_TYPE               'g'
 119#define IOC_LOV_MIN_NR           50
 120#define IOC_LOV_SET_OSC_ACTIVE   _IOWR('g', 50, long)
 121#define IOC_LOV_MAX_NR           50
 122
 123#define QOS_DEFAULT_THRESHOLD      10 /* MB */
 124#define QOS_DEFAULT_MAXAGE            5  /* Seconds */
 125
 126#endif
 127