X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Finclude%2Fobd_lov.h;h=b9904a47d9f54d8029b40eb9a85baaf35a8fd114;hb=4072f026a706fcabb9b8cbaec4dcd534e9de7c95;hp=da3ca5112c531fc8aef48b72ded0f83d851502c1;hpb=665e36b780faa2144cecccd29a0d8a8196a76903;p=fs%2Flustre-release.git diff --git a/lustre/include/obd_lov.h b/lustre/include/obd_lov.h index da3ca51..b9904a4 100644 --- a/lustre/include/obd_lov.h +++ b/lustre/include/obd_lov.h @@ -26,7 +26,7 @@ * GPL HEADER END */ /* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved + * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved. * Use is subject to license terms. */ /* @@ -37,12 +37,12 @@ #ifndef _OBD_LOV_H__ #define _OBD_LOV_H__ -static inline int lov_stripe_md_size(int stripes) +static inline int lov_stripe_md_size(__u16 stripes) { return sizeof(struct lov_stripe_md) + stripes*sizeof(struct lov_oinfo*); } -static inline int lov_mds_md_size(int stripes, int lmm_magic) +static inline __u32 lov_mds_md_size(__u16 stripes, __u32 lmm_magic) { if (lmm_magic == LOV_MAGIC_V3) return sizeof(struct lov_mds_md_v3) + @@ -52,6 +52,35 @@ static inline int lov_mds_md_size(int stripes, int lmm_magic) stripes * sizeof(struct lov_ost_data_v1); } +struct lov_version_size { + __u32 lvs_magic; + size_t lvs_lmm_size; + size_t lvs_lod_size; +}; + +static inline __u32 lov_mds_md_stripecnt(int ea_size, __u32 lmm_magic) +{ + static const struct lov_version_size lmm_ver_size[] = { + { .lvs_magic = LOV_MAGIC_V3, + .lvs_lmm_size = sizeof(struct lov_mds_md_v3), + .lvs_lod_size = sizeof(struct lov_ost_data_v1) }, + { .lvs_magic = LOV_MAGIC_V1, + .lvs_lmm_size = sizeof(struct lov_mds_md_v1), + .lvs_lod_size = sizeof(struct lov_ost_data_v1)} }; + int i; + + for (i = 0; i < ARRAY_SIZE(lmm_ver_size); i++) { + if (lmm_magic == lmm_ver_size[i].lvs_magic) { + if (ea_size <= lmm_ver_size[i].lvs_lmm_size) + return 0; + return (ea_size - lmm_ver_size[i].lvs_lmm_size) / + lmm_ver_size[i].lvs_lod_size; + } + } + + /* Invalid LOV magic, so no stripes could fit */ + return 0; +} #define IOC_LOV_TYPE 'g' #define IOC_LOV_MIN_NR 50