All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH]add supporting second super block of nilfs2
@ 2010-05-12 14:15 Jiro SEKIBA
  2010-05-18 16:21 ` Vladimir 'φ-coder/phcoder' Serbinenko
  0 siblings, 1 reply; 6+ messages in thread
From: Jiro SEKIBA @ 2010-05-12 14:15 UTC (permalink / raw)
  To: grub-devel

[-- Attachment #1: Type: text/plain, Size: 435 bytes --]

Hi,

This is a patch to support second super block of nilfs2.
It will use the second super block when first one is accidentally
collapsed or not synced properly.

NILFS has redundant super blocks.  Those are identical if unmounted cleanly.
However when one of these is collapsed or old, correct one or newer one
should be used to find latest log correctly.

Test on both PPC and x86.

Thanks,

Regards,
-- 
Jiro SEKIBA <jir@unicus.jp>

[-- Attachment #2: nilfs2-support-2nd-sb.patch --]
[-- Type: text/plain, Size: 2111 bytes --]

=== modified file 'fs/nilfs2.c'
--- fs/nilfs2.c	2010-04-24 20:09:08 +0000
+++ fs/nilfs2.c	2010-05-12 13:53:04 +0000
@@ -703,6 +703,42 @@
   return 1;
 }
 
+static grub_err_t
+grub_nilfs2_load_sb (struct grub_nilfs2_data *data)
+{
+  grub_disk_t disk = data->disk;
+  struct grub_nilfs2_super_block sb2;
+  int valid[2];
+  int swp = 0;
+
+  /* Read first super block. */
+  grub_disk_read (disk, 1 * 2, 0, sizeof (struct grub_nilfs2_super_block),
+		  &data->sblock);
+
+  /* Read second super block. */
+  grub_disk_read (disk, (disk->total_sectors - 8), 0,
+		  sizeof (struct grub_nilfs2_super_block), &sb2);
+
+  /* Make sure super blocks are valid.  */
+  valid[0] = grub_nilfs2_valid_sb (&data->sblock);
+  valid[1] = grub_nilfs2_valid_sb (&sb2);
+
+  if (!valid[0] && !valid[1])
+    return grub_error (GRUB_ERR_BAD_FS, "not a nilfs2 filesystem");
+
+  swp = valid[1] && (!valid[0] ||
+		     grub_le_to_cpu64 (data->sblock.s_last_cno) <
+		     grub_le_to_cpu64 (sb2.s_last_cno));
+
+  /* Swap if first super block is invalid or oloder than second one. */
+  if (swp)
+    grub_memcpy (&data->sblock, &sb2,
+		 sizeof (struct grub_nilfs2_super_block));
+
+  grub_errno = GRUB_ERR_NONE;
+  return grub_errno;
+}
+
 static struct grub_nilfs2_data *
 grub_nilfs2_mount (grub_disk_t disk)
 {
@@ -717,19 +753,13 @@
   if (!data)
     return 0;
 
+  data->disk = disk;
+
   /* Read the superblock.  */
-  grub_disk_read (disk, 1 * 2, 0, sizeof (struct grub_nilfs2_super_block),
-		  &data->sblock);
+  grub_nilfs2_load_sb (data);
   if (grub_errno)
     goto fail;
 
-  /* Make sure this is an nilfs2 filesystem.  */
-  if (!grub_nilfs2_valid_sb (&data->sblock))
-    {
-      grub_error (GRUB_ERR_BAD_FS, "not a nilfs2 filesystem");
-      goto fail;
-    }
-
   nilfs2_block_count = (1 << LOG2_NILFS2_BLOCK_SIZE (data));
 
   /* Read the last segment summary. */
@@ -748,8 +778,6 @@
   if (grub_errno)
     goto fail;
 
-  data->disk = disk;
-
   grub_nilfs2_read_last_checkpoint (data, &last_checkpoint);
 
   if (grub_errno)


[-- Attachment #3: Type: text/plain, Size: 2 bytes --]



^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2010-05-31 18:50 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-05-12 14:15 [PATCH]add supporting second super block of nilfs2 Jiro SEKIBA
2010-05-18 16:21 ` Vladimir 'φ-coder/phcoder' Serbinenko
2010-05-23 11:59   ` Jiro SEKIBA
2010-05-24  2:48     ` Jiro SEKIBA
2010-05-24 11:06       ` Jiro SEKIBA
2010-05-31 18:50         ` Vladimir 'φ-coder/phcoder' Serbinenko

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.