Whamcloud - gitweb
LU-5814 lov: remove LSM from struct lustre_md
[fs/lustre-release.git] / lustre / lov / lov_pack.c
index 7e95b3c..627d705 100644 (file)
@@ -202,7 +202,6 @@ __u16 lov_get_stripecnt(struct lov_obd *lov, __u32 magic, __u16 stripe_count)
         return stripe_count;
 }
 
-
 static int lov_verify_lmm(void *lmm, int lmm_bytes, __u16 *stripe_count)
 {
         int rc;
@@ -231,35 +230,37 @@ static int lov_verify_lmm(void *lmm, int lmm_bytes, __u16 *stripe_count)
         return rc;
 }
 
-int lov_alloc_memmd(struct lov_stripe_md **lsmp, __u16 stripe_count,
-                   int pattern, int magic)
+struct lov_stripe_md *lov_lsm_alloc(u16 stripe_count, u32 pattern, u32 magic)
 {
-       int i, lsm_size;
+       struct lov_stripe_md *lsm;
+       unsigned int i;
        ENTRY;
 
-       CDEBUG(D_INFO, "alloc lsm, stripe_count %d\n", stripe_count);
+       CDEBUG(D_INFO, "alloc lsm, stripe_count %u\n",
+              (unsigned int)stripe_count);
 
-       *lsmp = lsm_alloc_plain(stripe_count, &lsm_size);
-       if (!*lsmp) {
-               CERROR("can't allocate lsmp stripe_count %d\n", stripe_count);
-               RETURN(-ENOMEM);
+       lsm = lsm_alloc_plain(stripe_count);
+       if (lsm == NULL) {
+               CERROR("cannot allocate LSM stripe_count %u\n",
+                      (unsigned int)stripe_count);
+               RETURN(ERR_PTR(-ENOMEM));
        }
 
-       atomic_set(&(*lsmp)->lsm_refc, 1);
-       spin_lock_init(&(*lsmp)->lsm_lock);
-       (*lsmp)->lsm_magic = magic;
-       (*lsmp)->lsm_stripe_count = stripe_count;
-       (*lsmp)->lsm_maxbytes = LUSTRE_EXT3_STRIPE_MAXBYTES * stripe_count;
-       (*lsmp)->lsm_pattern = pattern;
-       (*lsmp)->lsm_pool_name[0] = '\0';
-       (*lsmp)->lsm_layout_gen = 0;
+       atomic_set(&lsm->lsm_refc, 1);
+       spin_lock_init(&lsm->lsm_lock);
+       lsm->lsm_magic = magic;
+       lsm->lsm_stripe_count = stripe_count;
+       lsm->lsm_maxbytes = LUSTRE_EXT3_STRIPE_MAXBYTES * stripe_count;
+       lsm->lsm_pattern = pattern;
+       lsm->lsm_pool_name[0] = '\0';
+       lsm->lsm_layout_gen = 0;
        if (stripe_count > 0)
-               (*lsmp)->lsm_oinfo[0]->loi_ost_idx = ~0;
+               lsm->lsm_oinfo[0]->loi_ost_idx = ~0;
 
        for (i = 0; i < stripe_count; i++)
-               loi_init((*lsmp)->lsm_oinfo[i]);
+               loi_init(lsm->lsm_oinfo[i]);
 
-       RETURN(lsm_size);
+       RETURN(lsm);
 }
 
 int lov_free_memmd(struct lov_stripe_md **lsmp)
@@ -280,58 +281,35 @@ int lov_free_memmd(struct lov_stripe_md **lsmp)
 /* Unpack LOV object metadata from disk storage.  It is packed in LE byte
  * order and is opaque to the networking layer.
  */
-int lov_unpackmd(struct obd_export *exp,  struct lov_stripe_md **lsmp,
-                 struct lov_mds_md *lmm, int lmm_bytes)
+struct lov_stripe_md *lov_unpackmd(struct lov_obd *lov, struct lov_mds_md *lmm,
+                                  size_t lmm_size)
 {
-        struct obd_device *obd = class_exp2obd(exp);
-        struct lov_obd *lov = &obd->u.lov;
-        int rc = 0, lsm_size;
-        __u16 stripe_count;
-        __u32 magic;
-       __u32 pattern;
-        ENTRY;
-
-        /* If passed an MDS struct use values from there, otherwise defaults */
-        if (lmm) {
-                rc = lov_verify_lmm(lmm, lmm_bytes, &stripe_count);
-                if (rc)
-                        RETURN(rc);
-                magic = le32_to_cpu(lmm->lmm_magic);
-               pattern = le32_to_cpu(lmm->lmm_pattern);
-        } else {
-                magic = LOV_MAGIC;
-                stripe_count = lov_get_stripecnt(lov, magic, 0);
-               pattern = LOV_PATTERN_RAID0;
-        }
+       struct lov_stripe_md *lsm;
+       u16 stripe_count;
+       u32 magic;
+       u32 pattern;
+       int rc;
+       ENTRY;
 
-        /* If we aren't passed an lsmp struct, we just want the size */
-        if (!lsmp) {
-                /* XXX LOV STACKING call into osc for sizes */
-                LBUG();
-                RETURN(lov_stripe_md_size(stripe_count));
-        }
-        /* If we are passed an allocated struct but nothing to unpack, free */
-        if (*lsmp && !lmm) {
-                lov_free_memmd(lsmp);
-                RETURN(0);
-        }
+       rc = lov_verify_lmm(lmm, lmm_size, &stripe_count);
+       if (rc != 0)
+               RETURN(ERR_PTR(rc));
 
-        lsm_size = lov_alloc_memmd(lsmp, stripe_count, pattern, magic);
-        if (lsm_size < 0)
-                RETURN(lsm_size);
+       magic = le32_to_cpu(lmm->lmm_magic);
+       pattern = le32_to_cpu(lmm->lmm_pattern);
 
-        /* If we are passed a pointer but nothing to unpack, we only alloc */
-        if (!lmm)
-                RETURN(lsm_size);
+       lsm = lov_lsm_alloc(stripe_count, pattern, magic);
+       if (IS_ERR(lsm))
+               RETURN(lsm);
 
-        LASSERT(lsm_op_find(magic) != NULL);
-        rc = lsm_op_find(magic)->lsm_unpackmd(lov, *lsmp, lmm);
-        if (rc) {
-                lov_free_memmd(lsmp);
-                RETURN(rc);
-        }
+       LASSERT(lsm_op_find(magic) != NULL);
+       rc = lsm_op_find(magic)->lsm_unpackmd(lov, lsm, lmm);
+       if (rc != 0) {
+               lov_free_memmd(&lsm);
+               RETURN(ERR_PTR(rc));
+       }
 
-        RETURN(lsm_size);
+       RETURN(lsm);
 }
 
 /* Retrieve object striping information.