X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Flov%2Flov_ea.c;h=34ab86d67569d4c8aefb20c6196f5ae22b25d72e;hb=08aa217ce49aba1ded52e0f7adb8a607035123fd;hp=4785944985b0f1e64a4b73397d1ae2f74a77a733;hpb=4c01e64e0a72c1682ebf0a8bd4cccf99fd04cd88;p=fs%2Flustre-release.git diff --git a/lustre/lov/lov_ea.c b/lustre/lov/lov_ea.c old mode 100755 new mode 100644 index 4785944..34ab86d --- a/lustre/lov/lov_ea.c +++ b/lustre/lov/lov_ea.c @@ -1,6 +1,4 @@ -/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- - * vim:expandtab:shiftwidth=8:tabstop=8: - * +/* * GPL HEADER START * * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. @@ -26,8 +24,10 @@ * GPL HEADER END */ /* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved + * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. * Use is subject to license terms. + * + * Copyright (c) 2011, 2012, Intel Corporation. */ /* * This file is part of Lustre, http://www.lustre.org/ @@ -38,9 +38,6 @@ * Author: Wang Di */ -#ifndef EXPORT_SYMTAB -# define EXPORT_SYMTAB -#endif #define DEBUG_SUBSYSTEM S_LOV #ifdef __KERNEL__ @@ -53,7 +50,6 @@ #include #include #include -#include #include "lov_internal.h" @@ -63,7 +59,7 @@ struct lovea_unpack_args { }; static int lsm_lmm_verify_common(struct lov_mds_md *lmm, int lmm_bytes, - int stripe_count) + __u16 stripe_count) { if (stripe_count == 0 || stripe_count > LOV_V1_INSANE_STRIPE_COUNT) { @@ -94,18 +90,18 @@ static int lsm_lmm_verify_common(struct lov_mds_md *lmm, int lmm_bytes, return 0; } -struct lov_stripe_md *lsm_alloc_plain(int stripe_count, int *size) +struct lov_stripe_md *lsm_alloc_plain(__u16 stripe_count, int *size) { struct lov_stripe_md *lsm; - int i, oinfo_ptrs_size; - struct lov_oinfo *loi; + struct lov_oinfo *loi; + int i, oinfo_ptrs_size; - LASSERT(stripe_count > 0); + LASSERT(stripe_count <= LOV_MAX_STRIPE_COUNT); oinfo_ptrs_size = sizeof(struct lov_oinfo *) * stripe_count; *size = sizeof(struct lov_stripe_md) + oinfo_ptrs_size; - OBD_ALLOC(lsm, *size); + OBD_ALLOC_LARGE(lsm, *size); if (!lsm) return NULL;; @@ -116,26 +112,25 @@ struct lov_stripe_md *lsm_alloc_plain(int stripe_count, int *size) lsm->lsm_oinfo[i] = loi; } lsm->lsm_stripe_count = stripe_count; - lsm->lsm_pool_name[0] = '\0'; return lsm; err: while (--i >= 0) OBD_SLAB_FREE(lsm->lsm_oinfo[i], lov_oinfo_slab, sizeof(*loi)); - OBD_FREE(lsm, *size); + OBD_FREE_LARGE(lsm, *size); return NULL; } void lsm_free_plain(struct lov_stripe_md *lsm) { - int stripe_count = lsm->lsm_stripe_count; + __u16 stripe_count = lsm->lsm_stripe_count; int i; for (i = 0; i < stripe_count; i++) OBD_SLAB_FREE(lsm->lsm_oinfo[i], lov_oinfo_slab, sizeof(struct lov_oinfo)); - OBD_FREE(lsm, sizeof(struct lov_stripe_md) + - stripe_count * sizeof(struct lov_oinfo *)); + OBD_FREE_LARGE(lsm, sizeof(struct lov_stripe_md) + + stripe_count * sizeof(struct lov_oinfo *)); } static void lsm_unpackmd_common(struct lov_stripe_md *lsm, @@ -149,6 +144,7 @@ static void lsm_unpackmd_common(struct lov_stripe_md *lsm, lsm->lsm_object_seq = le64_to_cpu(lmm->lmm_object_seq); lsm->lsm_stripe_size = le32_to_cpu(lmm->lmm_stripe_size); lsm->lsm_pattern = le32_to_cpu(lmm->lmm_pattern); + lsm->lsm_layout_gen = le16_to_cpu(lmm->lmm_layout_gen); lsm->lsm_pool_name[0] = '\0'; } @@ -174,8 +170,31 @@ static int lsm_destroy_plain(struct lov_stripe_md *lsm, struct obdo *oa, return 0; } +/* Find minimum stripe maxbytes value. For inactive or + * reconnecting targets use LUSTRE_STRIPE_MAXBYTES. */ +static void lov_tgt_maxbytes(struct lov_tgt_desc *tgt, __u64 *stripe_maxbytes) +{ + struct obd_import *imp = tgt->ltd_obd->u.cli.cl_import; + + if (imp == NULL || !tgt->ltd_active) { + *stripe_maxbytes = LUSTRE_STRIPE_MAXBYTES; + return; + } + + spin_lock(&imp->imp_lock); + if (imp->imp_state == LUSTRE_IMP_FULL && + (imp->imp_connect_data.ocd_connect_flags & OBD_CONNECT_MAXBYTES) && + imp->imp_connect_data.ocd_maxbytes > 0) { + if (*stripe_maxbytes > imp->imp_connect_data.ocd_maxbytes) + *stripe_maxbytes = imp->imp_connect_data.ocd_maxbytes; + } else { + *stripe_maxbytes = LUSTRE_STRIPE_MAXBYTES; + } + spin_unlock(&imp->imp_lock); +} + static int lsm_lmm_verify_v1(struct lov_mds_md_v1 *lmm, int lmm_bytes, - int *stripe_count) + __u16 *stripe_count) { if (lmm_bytes < sizeof(*lmm)) { CERROR("lov_mds_md_v1 too small: %d, need at least %d\n", @@ -183,7 +202,7 @@ static int lsm_lmm_verify_v1(struct lov_mds_md_v1 *lmm, int lmm_bytes, return -EINVAL; } - *stripe_count = le32_to_cpu(lmm->lmm_stripe_count); + *stripe_count = le16_to_cpu(lmm->lmm_stripe_count); if (lmm_bytes < lov_mds_md_size(*stripe_count, LOV_MAGIC_V1)) { CERROR("LOV EA V1 too small: %d, need %d\n", @@ -200,6 +219,7 @@ int lsm_unpackmd_v1(struct lov_obd *lov, struct lov_stripe_md *lsm, { struct lov_oinfo *loi; int i; + __u64 stripe_maxbytes = OBD_OBJECT_EOF; lsm_unpackmd_common(lsm, lmm); @@ -221,8 +241,13 @@ int lsm_unpackmd_v1(struct lov_obd *lov, struct lov_stripe_md *lsm, lov_dump_lmm_v1(D_WARNING, lmm); return -EINVAL; } + /* calculate the minimum stripe max bytes */ + lov_tgt_maxbytes(lov->lov_tgts[loi->loi_ost_idx], + &stripe_maxbytes); } + lsm->lsm_maxbytes = stripe_maxbytes * lsm->lsm_stripe_count; + return 0; } @@ -236,7 +261,7 @@ const struct lsm_operations lsm_v1_ops = { }; static int lsm_lmm_verify_v3(struct lov_mds_md *lmmv1, int lmm_bytes, - int *stripe_count) + __u16 *stripe_count) { struct lov_mds_md_v3 *lmm; @@ -248,7 +273,7 @@ static int lsm_lmm_verify_v3(struct lov_mds_md *lmmv1, int lmm_bytes, return -EINVAL; } - *stripe_count = le32_to_cpu(lmm->lmm_stripe_count); + *stripe_count = le16_to_cpu(lmm->lmm_stripe_count); if (lmm_bytes < lov_mds_md_size(*stripe_count, LOV_MAGIC_V3)) { CERROR("LOV EA V3 too small: %d, need %d\n", @@ -267,6 +292,7 @@ int lsm_unpackmd_v3(struct lov_obd *lov, struct lov_stripe_md *lsm, struct lov_mds_md_v3 *lmm; struct lov_oinfo *loi; int i; + __u64 stripe_maxbytes = OBD_OBJECT_EOF; lmm = (struct lov_mds_md_v3 *)lmmv1; @@ -291,8 +317,13 @@ int lsm_unpackmd_v3(struct lov_obd *lov, struct lov_stripe_md *lsm, lov_dump_lmm_v3(D_WARNING, lmm); return -EINVAL; } + /* calculate the minimum stripe max bytes */ + lov_tgt_maxbytes(lov->lov_tgts[loi->loi_ost_idx], + &stripe_maxbytes); } + lsm->lsm_maxbytes = stripe_maxbytes * lsm->lsm_stripe_count; + return 0; }