The following commit has been merged in the master branch:
commit a0fe8ebc7aaacb69117679403c9424cdea07520b
Author: Patrick Winnertz <win...@debian.org>
Date:   Fri Sep 24 11:00:33 2010 +0200

    bugzilla 21704 - lfsck doesn't work on pools
    
    Signed-off-by: Patrick Winnertz <win...@debian.org>

diff --git a/debian/patches/bug21704_mds_on_pools.patch 
b/debian/patches/bug21704_mds_on_pools.patch
new file mode 100644
index 0000000..b361bc2
--- /dev/null
+++ b/debian/patches/bug21704_mds_on_pools.patch
@@ -0,0 +1,287 @@
+diff -u e2fsprogs-1.41.12/e2fsck/lfsck.c e2fsprogs-1.41.12/e2fsck/lfsck.c
+--- e2fsprogs-1.41.12/e2fsck/lfsck.c
++++ e2fsprogs-1.41.12/e2fsck/lfsck.c
+@@ -922,7 +922,7 @@
+       }
+       lum->lmm_magic = LOV_USER_MAGIC;
+       lum->lmm_pattern = LOV_PATTERN_RAID0;
+-      lum->lmm_stripe_size = 65536;
++      lum->lmm_stripe_size = 1048576;
+       lum->lmm_stripe_offset = 0;
+       lum->lmm_stripe_count = 1;
+       lum->lmm_objects[0].l_object_id = ost_objid;
+@@ -1285,10 +1285,11 @@
+       return(rc);
+ }
+ 
+-int lfsck_validate_duplicate(__u64 mds_fid, const char *path,
+-                           __u32 ost_idx, __u64 ost_objid,
+-                           struct lov_user_md *lum)
++static int lfsck_validate_duplicate(__u64 mds_fid, const char *path,
++                                  __u32 ost_idx, __u64 ost_objid)
+ {
++      struct lov_user_md *lum;
++      struct lov_user_ost_data_v1 *loi;
+       struct stat64 st;
+       int rc, i;
+ 
+@@ -1309,33 +1310,55 @@
+               return -EBADF;
+       }
+ 
++      lum = malloc(LOV_EA_MAX(lum));
++      if (lum == NULL) {
++              log_write("%s: out of memory allocating LOV EA (%u)\n",
++                        progname, LOV_EA_MAX(lum));
++              return -ENOMEM;
++      }
++
+       rc = llapi_file_get_stripe(path, lum);
+       if (rc < 0) {
+               log_write("%s: unable to get LOV EA on %s: %s\n",
+                         progname, path, strerror(-rc));
+-              return rc;
++              goto out;
+       }
+ 
+       if (lum->lmm_pattern != LOV_PATTERN_RAID0) {
+               log_write("%s: unknown LOV stripe pattern %#08x\n",
+                         progname, lum->lmm_pattern);
+-              return -EINVAL;
++              rc = -EINVAL;
++              goto out;
++      }
++
++      if (lum->lmm_magic == LOV_USER_MAGIC_V1) {
++              loi = lum->lmm_objects;
++      } else if (lum->lmm_magic == LOV_USER_MAGIC_V3) {
++              loi = ((struct lov_user_md_v3 *)lum)->lmm_objects;
++      } else {
++              log_write("%s: unknown LOV magic %#08x\n",
++                        progname, lum->lmm_magic);
++              rc = -EINVAL;
++              goto out;
+       }
+ 
+       /* Verify that the object in question is still in the file */
+-      for (i = 0; i < lum->lmm_stripe_count; i++){
+-              if (lum->lmm_objects[i].l_ost_idx == ost_idx &&
+-                  lum->lmm_objects[i].l_object_id == ost_objid)
++      for (i = 0; i < lum->lmm_stripe_count; i++, loi++) {
++              if (loi->l_ost_idx == ost_idx &&
++                  loi->l_object_id == ost_objid)
+                       break;
+       }
+ 
+       if (i == lum->lmm_stripe_count) {
+               log_write("%s: couldn't find object %u:"LPU64" in\n"
+                         "\t%s\n", progname, ost_idx, ost_objid, path);
+-              return -EBADF;
++              rc = -EBADF;
++              goto out;
+       }
+ 
+-      return 0;
++out:
++      free(lum);
++      return rc;
+ }
+ 
+ #ifndef HAVE_LLAPI_CANCEL_OSC_LOCKS
+@@ -1387,7 +1410,6 @@
+ int lfsck_fix_duplicate(__u64 mds_fid, __u32 mds_generation,
+                       __u32 ost_idx, __u64 ost_objid, DB *mds_direntdb)
+ {
+-      struct lov_user_md *lum;
+       char path_tmp[PATH_MAX] = { 0 }, path[PATH_MAX] = { 0 };
+       char tmp[PATH_MAX * 2 + 10] = { 0 };
+       const char *base;
+@@ -1410,14 +1432,7 @@
+               return 0;
+       }
+ 
+-      lum = malloc(LOV_EA_MAX(lum));
+-      if (lum == NULL) {
+-              log_write("%s: out of memory allocating LOV EA (%u)\n",
+-                        progname, LOV_EA_MAX(lum));
+-              return -ENOMEM;
+-      }
+-
+-      rc = lfsck_validate_duplicate(mds_fid, path, ost_idx, ost_objid, lum);
++      rc = lfsck_validate_duplicate(mds_fid, path, ost_idx, ost_objid);
+       if (rc < 0)
+               goto out;
+ 
+@@ -1466,7 +1481,6 @@
+ out:
+       VERBOSE(2, "unlink %s\n", path_tmp);
+       unlink(path_tmp);
+-      free(lum);
+ 
+       return rc;
+ }
+diff -u e2fsprogs-1.41.12/e2fsck/lfsck.h e2fsprogs-1.41.12/e2fsck/lfsck.h
+--- e2fsprogs-1.41.12/e2fsck/lfsck.h
++++ e2fsprogs-1.41.12/e2fsck/lfsck.h
+@@ -66,8 +66,7 @@
+ 
+ #define LOV_MAX_OSTS 2048       /* XXX - Not permanent, change */
+ #define LOV_EA_SIZE(lum, num) (sizeof(*lum) + num * sizeof(*lum->lmm_objects))
+-#define LOV_MAX_STRIPE_COUNT    160
+-#define LOV_EA_MAX(lum) LOV_EA_SIZE(lum, LOV_MAX_STRIPE_COUNT)
++#define LOV_EA_MAX(lum) LOV_EA_SIZE(lum, LOV_MAX_OSTS)
+ 
+ /*XXX*/
+ #define STRTOUL strtoul
+@@ -189,7 +188,7 @@
+ extern void letocpu_mds_objent(struct lfsck_mds_objent *mds_objent);
+ extern void cputole_ost_objent(struct lfsck_ost_objent *ost_objent);
+ extern void letocpu_ost_objent(struct lfsck_ost_objent *ost_objent);
+-extern void letocpu_lov_user_md_v1(struct lov_user_md_v1 *lmm);
++extern void letocpu_lov_user_md(struct lov_user_md *lmm);
+ 
+ #define MDS_START_DIRENT_TABLE sizeof(struct lfsck_mds_hdr)
+ 
+diff -u e2fsprogs-1.41.12/e2fsck/lfsck_common.c 
e2fsprogs-1.41.12/e2fsck/lfsck_common.c
+--- e2fsprogs-1.41.12/e2fsck/lfsck_common.c
++++ e2fsprogs-1.41.12/e2fsck/lfsck_common.c
+@@ -299,8 +299,9 @@
+       ost_objent->ost_bytes = ext2fs_le64_to_cpu(ost_objent->ost_bytes);
+ }
+ 
+-void letocpu_lov_user_md_v1(struct lov_user_md_v1 *lmm)
++void letocpu_lov_user_md(struct lov_user_md *lmm)
+ {
++      struct lov_user_ost_data_v1 *loi;
+       int i;
+ 
+       lmm->lmm_magic = ext2fs_le32_to_cpu(lmm->lmm_magic);
+@@ -309,15 +310,20 @@
+       lmm->lmm_object_gr = ext2fs_le64_to_cpu(lmm->lmm_object_gr);
+       lmm->lmm_stripe_size = ext2fs_le32_to_cpu(lmm->lmm_stripe_size);
+       lmm->lmm_stripe_count = ext2fs_le16_to_cpu(lmm->lmm_stripe_count);
+-      for (i = 0; i < lmm->lmm_stripe_count; i++) {
+-              lmm->lmm_objects[i].l_object_id =
+-                      ext2fs_le64_to_cpu(lmm->lmm_objects[i].l_object_id);
+-              lmm->lmm_objects[i].l_object_gr =
+-                      ext2fs_le64_to_cpu(lmm->lmm_objects[i].l_object_gr);
+-              lmm->lmm_objects[i].l_ost_gen =
+-                      ext2fs_le32_to_cpu(lmm->lmm_objects[i].l_ost_gen);
+-              lmm->lmm_objects[i].l_ost_idx =
+-                      ext2fs_le32_to_cpu(lmm->lmm_objects[i].l_ost_idx);
++      /* No swabbing needed for the lov_user_md_v3 lmm_pool_name */
++
++      if (lmm->lmm_magic == LOV_USER_MAGIC_V3)
++              loi = ((struct lov_user_md_v3 *)lmm)->lmm_objects;
++      else /* if (lmm->lmm_magic == LOV_USER_MAGIC_V1) */
++              loi = lmm->lmm_objects;
++      /* If there is a bad magic, this will be found immediately in the
++       * call to lfsck_check_lov_ea() following this function. */
++
++      for (i = 0; i < lmm->lmm_stripe_count; i++, loi++) {
++              loi->l_object_id = ext2fs_le64_to_cpu(loi->l_object_id);
++              loi->l_object_gr = ext2fs_le64_to_cpu(loi->l_object_gr);
++              loi->l_ost_gen = ext2fs_le32_to_cpu(loi->l_ost_gen);
++              loi->l_ost_idx = ext2fs_le32_to_cpu(loi->l_ost_idx);
+       }
+ }
+ #endif
+diff -u e2fsprogs-1.41.12/e2fsck/pass6.c e2fsprogs-1.41.12/e2fsck/pass6.c
+--- e2fsprogs-1.41.12/e2fsck/pass6.c
++++ e2fsprogs-1.41.12/e2fsck/pass6.c
+@@ -214,12 +214,12 @@
+ }
+ 
+ static int e2fsck_lfsck_save_ea(e2fsck_t ctx, ext2_ino_t ino, __u32 
generation,
+-                              struct lov_user_md *mds_md)
++                              struct lov_user_md *lmm)
+ {
+       ext2_filsys fs = ctx->fs;
+       struct lfsck_mds_szinfo szinfo;
++      struct lov_user_ost_data_v1 *loi;
+       __u64 mds_fid;
+-      __u32 stripe_count = 0;
+       int rc, i;
+       DBT key, data;
+       DB *dbp;
+@@ -269,14 +269,22 @@
+                       lfsck_write_mds_hdrinfo(ctx, ctx->lfsck_oinfo);
+               }
+       }
++      if (lmm->lmm_magic == LOV_USER_MAGIC_V3)
++              loi = ((struct lov_user_md_v3 *)lmm)->lmm_objects;
++      else /* if (lmm->lmm_magic == LOV_USER_MAGIC_V1) */
++              loi = lmm->lmm_objects;
++
+       szinfo.mds_fid = ino;
+-      szinfo.mds_group = mds_md->lmm_object_gr;
+-      szinfo.mds_stripe_size = mds_md->lmm_stripe_size;
+-      szinfo.mds_stripe_start = mds_md->lmm_objects[0].l_ost_idx;
+-      szinfo.mds_stripe_count = mds_md->lmm_stripe_count;
++      /* XXX: We don't save the layout type here.  This doesn't matter for
++       *      now, we don't really need the pool information for lfsck, but
++       *      in the future we may need it for RAID-1 and other layouts. */
++      szinfo.mds_group = lmm->lmm_object_gr;
++      szinfo.mds_stripe_size = lmm->lmm_stripe_size;
++      szinfo.mds_stripe_start = loi->l_ost_idx;
++      szinfo.mds_stripe_count = lmm->lmm_stripe_count;
+       szinfo.mds_size = 0; /* XXX */
+       szinfo.mds_calc_size = 0;
+-      szinfo.mds_stripe_pattern = mds_md->lmm_pattern;
++      szinfo.mds_stripe_pattern = lmm->lmm_pattern;
+       memset(&key, 0, sizeof(key));
+       memset(&data, 0, sizeof(data));
+       mds_fid = szinfo.mds_fid;
+@@ -296,13 +304,12 @@
+               return (EIO);
+       }
+ #endif
+-      stripe_count = mds_md->lmm_stripe_count;
+-      for (i = 0; i < stripe_count; i++) {
+-              int ost_idx = mds_md->lmm_objects[i].l_ost_idx;
++      for (i = 0; i < lmm->lmm_stripe_count; i++, loi++) {
++              int ost_idx = loi->l_ost_idx;
+               struct lfsck_mds_objent mds_ent;
+               struct lfsck_ofile_ctx *ofile_ctx =
+                                        &ctx->lfsck_oinfo->ofile_ctx[ost_idx];
+-              __u64 objid = mds_md->lmm_objects[i].l_object_id;
++              __u64 objid = loi->l_object_id;
+ 
+               if (ost_idx >= LOV_MAX_OSTS) {
+                       fprintf(stderr, "invalid OST index %u ino %u[%d]\n",
+@@ -371,8 +378,9 @@
+ 
+ int lfsck_check_lov_ea(e2fsck_t ctx, struct lov_user_md *lmm)
+ {
+-      if (lmm->lmm_magic != LOV_USER_MAGIC_V1) {
+-              VERBOSE(ctx, "error: only handle v1 LOV EAs, not %08x\n",
++      if (lmm->lmm_magic != LOV_USER_MAGIC_V1 &&
++          lmm->lmm_magic != LOV_USER_MAGIC_V3) {
++              VERBOSE(ctx, "error: only handle v1/v3 LOV EAs, not %08x\n",
+                       lmm->lmm_magic);
+               return(-EINVAL);
+       }
+@@ -403,8 +411,8 @@
+ 
+       if (entry->e_name_index == EXT3_XATTR_INDEX_TRUSTED &&
+           !strncmp(entry->e_name,XATTR_LUSTRE_MDS_LOV_EA,entry->e_name_len)){
+-              struct lov_user_md_v1 *lmm = value;
+-              letocpu_lov_user_md_v1(lmm);
++              struct lov_user_md *lmm = value;
++              letocpu_lov_user_md(lmm);
+ 
+               if (lfsck_check_lov_ea(ctx, lmm)) {
+                       ctx->flags |= E2F_FLAG_ABORT;
+@@ -548,9 +556,10 @@
+ 
+       objent.ost_objid = objid;
+       objent.ost_flag = 0;
+-      objent.ost_size = inode.i_size;
+       if (LINUX_S_ISREG(inode.i_mode))
+-              objent.ost_size |= (__u64)inode.i_size_high << 32;
++              objent.ost_size = EXT2_I_SIZE(inode);
++      else
++              objent.ost_size = inode.i_size;
+       objent.ost_bytes = (__u64)inode.i_blocks * 512;
+ 
+       memset(&key, 0, sizeof(key));
diff --git a/debian/patches/series b/debian/patches/series
index 643518a..21fb004 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -31,3 +31,4 @@ e2fsprogs-add-io_channel_readahead.patch
 e2fsprogs-e2scan.patch 
 e2fsprogs-fid_in_dirent.patch
 static-linking.patch
+bug21704_mds_on_pools.patch

-- 
Repository for maintaining lidskfsprogs

_______________________________________________
Pkg-lustre-svn-commit mailing list
Pkg-lustre-svn-commit@lists.alioth.debian.org
http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-lustre-svn-commit

Reply via email to