Author: arekm                        Date: Thu Jul  1 16:04:31 2010 GMT
Module: packages                      Tag: HEAD
---- Log message:
- tuxonice 3.1.1.1

---- Files affected:
packages/kernel:
   kernel-tuxonice.patch (1.13 -> 1.14) , kernel.spec (1.792 -> 1.793) 

---- Diffs:

================================================================
Index: packages/kernel/kernel-tuxonice.patch
diff -u packages/kernel/kernel-tuxonice.patch:1.13 
packages/kernel/kernel-tuxonice.patch:1.14
--- packages/kernel/kernel-tuxonice.patch:1.13  Sun May 23 15:36:51 2010
+++ packages/kernel/kernel-tuxonice.patch       Thu Jul  1 18:04:25 2010
@@ -1609,7 +1609,7 @@
         * If it's a regular read/write or a barrier with data attached,
         * go through the normal accounting stuff before submission.
 diff --git a/block/genhd.c b/block/genhd.c
-index d13ba76..a69521c 100644
+index d13ba76..efa1792 100644
 --- a/block/genhd.c
 +++ b/block/genhd.c
 @@ -18,6 +18,8 @@
@@ -1617,33 +1617,35 @@
  #include <linux/mutex.h>
  #include <linux/idr.h>
 +#include <linux/ctype.h>
-+#include <linux/uuid.h>
++#include <linux/fs_uuid.h>
  
  #include "blk.h"
  
-@@ -1286,3 +1288,82 @@ int invalidate_partition(struct gendisk *disk, int 
partno)
+@@ -1286,3 +1288,84 @@ int invalidate_partition(struct gendisk *disk, int 
partno)
  }
  
  EXPORT_SYMBOL(invalidate_partition);
 +
-+dev_t blk_lookup_uuid(const char *uuid)
++dev_t blk_lookup_fs_info(struct fs_info *seek)
 +{
 +      dev_t devt = MKDEV(0, 0);
 +      struct class_dev_iter iter;
 +      struct device *dev;
++      int best_score = 0;
 +
 +      class_dev_iter_init(&iter, &block_class, NULL, &disk_type);
-+      while (!devt && (dev = class_dev_iter_next(&iter))) {
++      while (best_score < 3 && (dev = class_dev_iter_next(&iter))) {
 +              struct gendisk *disk = dev_to_disk(dev);
 +              struct disk_part_iter piter;
 +              struct hd_struct *part;
 +
 +              disk_part_iter_init(&piter, disk, DISK_PITER_INCL_PART0);
 +
-+              while ((part = disk_part_iter_next(&piter))) {
-+                      if (part_matches_uuid(part, uuid)) {
++              while (best_score < 3 && (part = disk_part_iter_next(&piter))) {
++                      int score = part_matches_fs_info(part, seek);
++                      if (score > best_score) {
 +                              devt = part_devt(part);
-+                              break;
++                              best_score = score;
 +                      }
 +              }
 +              disk_part_iter_exit(&piter);
@@ -1651,7 +1653,7 @@
 +      class_dev_iter_exit(&iter);
 +      return devt;
 +}
-+EXPORT_SYMBOL_GPL(blk_lookup_uuid);
++EXPORT_SYMBOL_GPL(blk_lookup_fs_info);
 +
 +/* Caller uses NULL, key to start. For each match found, we return a bdev on
 + * which we have done blkdev_get, and we do the blkdev_put on block devices
@@ -1706,13 +1708,13 @@
 +EXPORT_SYMBOL_GPL(next_bdev_of_type);
 diff --git a/block/uuid.c b/block/uuid.c
 new file mode 100644
-index 0000000..0feb956
+index 0000000..37fd8e4
 --- /dev/null
 +++ b/block/uuid.c
-@@ -0,0 +1,527 @@
+@@ -0,0 +1,492 @@
 +#include <linux/blkdev.h>
 +#include <linux/ctype.h>
-+#include <linux/uuid.h>
++#include <linux/fs_uuid.h>
 +#include <linux/slab.h>
 +
 +static int debug_enabled;
@@ -1857,7 +1859,8 @@
 +{
 +      struct page *page = bio->bi_io_vec[0].bv_page;
 +
-+      BUG_ON(!test_bit(BIO_UPTODATE, &bio->bi_flags));
++      if(!test_bit(BIO_UPTODATE, &bio->bi_flags))
++              SetPageError(page);
 +
 +      unlock_page(page);
 +      bio_put(bio);
@@ -1899,7 +1902,7 @@
 +              __free_page(page);
 +              printk(KERN_DEBUG "read_bdev_page freed page %p (in error "
 +                              "path).\n", page);
-+              return ERR_PTR(-EFAULT);
++              return NULL;
 +      }
 +
 +      lock_page(page);
@@ -1907,6 +1910,10 @@
 +                      (1 << BIO_RW_UNPLUG), bio);
 +
 +      wait_on_page_locked(page);
++      if (PageError(page)) {
++              __free_page(page);
++              page = NULL;
++      }
 +      return page;
 +}
 +
@@ -1954,10 +1961,8 @@
 +                      if (data_page)
 +                              __free_page(data_page);
 +                      data_page = read_bdev_page(bdev, pg_num);
-+                      if (!data_page) {
-+                              result = -ENOMEM;
-+                              break;
-+                      }
++                      if (!data_page)
++                              continue;
 +                      data = page_address(data_page);
 +              }
 +
@@ -1976,29 +1981,35 @@
 +      return result;
 +}
 +
-+int part_matches_uuid(struct hd_struct *part, const char *uuid)
++/* 
++ * part_matches_fs_info - Does the given partition match the details given?
++ *
++ * Returns a score saying how good the match is.
++ * 0 = no UUID match.
++ * 1 = UUID but last mount time differs.
++ * 2 = UUID, last mount time but not dev_t
++ * 3 = perfect match
++ *
++ * This lets us cope elegantly with probing resulting in dev_ts changing
++ * from boot to boot, and with the case where a user copies a partition
++ * (UUID is non unique), and we need to check the last mount time of the
++ * correct partition.
++ */
++int part_matches_fs_info(struct hd_struct *part, struct fs_info *seek)
 +{
 +      struct block_device *bdev;
-+      unsigned char *data = NULL;
-+      struct page *data_page = NULL;
-+
-+      int dev_offset, pg_num, pg_off;
-+      int uuid_pg_num, uuid_pg_off, i;
-+      unsigned char *uuid_data = NULL;
-+      struct page *uuid_data_page = NULL;
-+
-+      int last_pg_num = -1, last_uuid_pg_num = 0;
++      struct fs_info *got;
 +      int result = 0;
 +      char buf[50];
 +
-+      if (null_uuid(uuid)) {
++      if (null_uuid((char *) &seek->uuid)) {
 +              PRINTK("Refusing to find a NULL uuid.\n");
 +              return 0;
 +      }
 +
 +      bdev = bdget(part_devt(part));
 +
-+      PRINTK("blkdev_get %p.\n", part);
++      PRINTK("part_matches fs info considering %x.\n", part_devt(part));
 +
 +      if (blkdev_get(bdev, FMODE_READ)) {
 +              PRINTK("blkdev_get failed.\n");
@@ -2017,72 +2028,32 @@
 +              goto out;
 +      }
 +
-+      for (i = 0; uuid_list[i].name; i++) {
-+              struct uuid_info *dat = &uuid_list[i];
-+              dev_offset = (dat->bkoff << 10) + dat->sboff;
-+              pg_num = dev_offset >> 12;
-+              pg_off = dev_offset & 0xfff;
-+              uuid_pg_num = dat->uuid_offset >> 12;
-+              uuid_pg_off = dat->uuid_offset & 0xfff;
-+
-+              if ((((pg_num + 1) << 3) - 1) > part->nr_sects >> 1)
-+                      continue;
++      got = fs_info_from_block_dev(bdev);
 +
-+              /* Ignore partition types with no UUID offset */
-+              if (!dat->uuid_offset)
-+                      continue;
-+
-+              if (pg_num != last_pg_num) {
-+                      if (data_page)
-+                              __free_page(data_page);
-+                      data_page = read_bdev_page(bdev, pg_num);
-+                      if (!data_page) {
-+                              result = -ENOMEM;
-+                              break;
-+                      }
-+                      data = page_address(data_page);
-+              }
-+
-+              last_pg_num = pg_num;
-+
-+              if (strncmp(&data[pg_off], dat->magic, dat->sig_len))
-+                      continue;
-+
-+              /* Does the UUID match? */
-+              if (uuid_pg_num > part->nr_sects >> 3)
-+                      continue;
-+
-+              if (!uuid_data || uuid_pg_num != last_uuid_pg_num) {
-+                      if (uuid_data_page)
-+                              __free_page(uuid_data_page);
-+                      uuid_data_page = read_bdev_page(bdev, uuid_pg_num);
-+                      if (!uuid_data_page) {
-+                              result = -ENOMEM;
-+                              break;
-+                      }
-+                      uuid_data = page_address(uuid_data_page);
-+              }
-+
-+              last_uuid_pg_num = uuid_pg_num;
++      if (got && !memcmp(got->uuid, seek->uuid, 16)) {
++              PRINTK(" Having matching UUID.\n");
++              PRINTK(" Got: LMS %d, LM %p.\n", got->last_mount_size, 
got->last_mount);
++              PRINTK(" Seek: LMS %d, LM %p.\n", seek->last_mount_size, 
seek->last_mount);
++              result = 1;
 +
-+              if (!memcmp(&uuid_data[uuid_pg_off], uuid, 16)) {
-+                      PRINT_HEX_DUMP(KERN_EMERG, "part_matches_uuid "
-+                              "matched ",     DUMP_PREFIX_NONE, 16, 1,
-+                              &uuid_data[uuid_pg_off], 16, 0);
-+
-+                      PRINTK("UUID found on device %s, type %s.\n", buf,
-+                                      dat->name);
-+                      result = 1;
-+                      break;
++              if (got->last_mount_size == seek->last_mount_size &&
++                  got->last_mount && seek->last_mount &&
++                  !memcmp(got->last_mount, seek->last_mount,
++                          got->last_mount_size)) {
++                      result = 2;
++
++                      PRINTK(" Matching last mount time.\n");
++
++                      if (part_devt(part) == seek->dev_t) {
++                              result = 3;
++                              PRINTK(" Matching dev_t.\n");
++                      } else
++                              PRINTK("Dev_ts differ (%x vs %x).\n", 
part_devt(part), seek->dev_t);
 +              }
 +      }
 +
-+      if (data_page)
-+              __free_page(data_page);
-+
-+      if (uuid_data_page)
-+              __free_page(uuid_data_page);
-+
++      PRINTK(" Score for %x is %d.\n", part_devt(part), result);
++      free_fs_info(got);
 +out:
 +      blkdev_put(bdev, FMODE_READ);
 +      return result;
@@ -2116,8 +2087,7 @@
 +
 +      bdevname(bdev, buf);
 +
-+      PRINTK(KERN_EMERG "uuid_from_block_dev looking for partition type "
-+                      "of %s.\n", buf);
++      PRINTK("uuid_from_block_dev looking for partition type of %s.\n", buf);
 +
 +      for (i = 0; uuid_list[i].name; i++) {
 +              struct uuid_info *dat = &uuid_list[i];
@@ -2138,10 +2108,8 @@
 +                      if (data_page)
 +                              __free_page(data_page);
 +                      data_page = read_bdev_page(bdev, pg_num);
-+                      if (!data_page) {
-+                              fs_info = ERR_PTR(-ENOMEM);
-+                              break;
-+                      }
++                      if (!data_page)
++                              continue;
 +                      data = page_address(data_page);
 +              }
 +
@@ -2169,15 +2137,14 @@
 +                      if (uuid_data_page)
 +                              __free_page(uuid_data_page);
 +                      uuid_data_page = read_bdev_page(bdev, uuid_pg_num);
-+                      if (!uuid_data_page) {
-+                              fs_info = ERR_PTR(-ENOMEM);
-+                              break;
-+                      }
++                      if (!uuid_data_page)
++                              continue;
 +                      uuid_data = page_address(uuid_data_page);
 +              }
 +
 +              last_uuid_pg_num = uuid_pg_num;
 +              memcpy(&fs_info->uuid, &uuid_data[uuid_pg_off], 16);
++              fs_info->dev_t = bdev->bd_dev;
 +
 +no_uuid:
 +              PRINT_HEX_DUMP(KERN_EMERG, "fs_info_from_block_dev "
@@ -3313,6 +3280,31 @@
  #else
  static inline void bd_forget(struct inode *inode) {}
  static inline int sync_blockdev(struct block_device *bdev) { return 0; }
+diff --git a/include/linux/fs_uuid.h b/include/linux/fs_uuid.h
+new file mode 100644
+index 0000000..3234135
+--- /dev/null
++++ b/include/linux/fs_uuid.h
+@@ -0,0 +1,19 @@
++#include <linux/device.h>
++
++struct hd_struct;
++struct block_device;
++
++struct fs_info {
++      char uuid[16];
++      dev_t dev_t;
++      char *last_mount;
++      int last_mount_size;
++};
++
++int part_matches_fs_info(struct hd_struct *part, struct fs_info *seek);
++dev_t blk_lookup_fs_info(struct fs_info *seek);
++struct fs_info *fs_info_from_block_dev(struct block_device *bdev);
++void free_fs_info(struct fs_info *fs_info);
++int bdev_matches_key(struct block_device *bdev, const char *key);
++struct block_device *next_bdev_of_type(struct block_device *last,
++      const char *key);
 diff --git a/include/linux/mm.h b/include/linux/mm.h
 index 462acaf..cd1c705 100644
 --- a/include/linux/mm.h
@@ -3453,30 +3445,6 @@
  extern int reuse_swap_page(struct page *);
  extern int try_to_free_swap(struct page *);
  struct backing_dev_info;
-diff --git a/include/linux/uuid.h b/include/linux/uuid.h
-new file mode 100644
-index 0000000..a968f0f
---- /dev/null
-+++ b/include/linux/uuid.h
-@@ -0,0 +1,18 @@
-+#include <linux/device.h>
-+
-+struct hd_struct;
-+struct block_device;
-+
-+struct fs_info {
-+      char uuid[16];
-+      char *last_mount;
-+      int last_mount_size;
-+};
-+
-+int part_matches_uuid(struct hd_struct *part, const char *uuid);
-+dev_t blk_lookup_uuid(const char *uuid);
-+struct fs_info *fs_info_from_block_dev(struct block_device *bdev);
-+void free_fs_info(struct fs_info *fs_info);
-+int bdev_matches_key(struct block_device *bdev, const char *key);
-+struct block_device *next_bdev_of_type(struct block_device *last,
-+      const char *key);
 diff --git a/init/do_mounts.c b/init/do_mounts.c
 index 02e3ca4..5af8c3e 100644
 --- a/init/do_mounts.c
@@ -4799,7 +4767,7 @@
   *    suspend_finish - Do final work before exiting suspend sequence.
 diff --git a/kernel/power/tuxonice.h b/kernel/power/tuxonice.h
 new file mode 100644
-index 0000000..e7bc111
+index 0000000..537291e
 --- /dev/null
 +++ b/kernel/power/tuxonice.h
 @@ -0,0 +1,211 @@
@@ -4826,8 +4794,8 @@
 +#include "tuxonice_pageflags.h"
 +#include "power.h"
 +
-+#define TOI_CORE_VERSION "3.1"
-+#define       TOI_HEADER_VERSION 2
++#define TOI_CORE_VERSION "3.1.1.1"
++#define       TOI_HEADER_VERSION 3
 +#define MY_BOOT_KERNEL_DATA_VERSION 3
 +
 +struct toi_boot_kernel_data {
@@ -6976,10 +6944,10 @@
 +}
 diff --git a/kernel/power/tuxonice_bio_core.c 
b/kernel/power/tuxonice_bio_core.c
 new file mode 100644
-index 0000000..225aa49
+index 0000000..414d249
 --- /dev/null
 +++ b/kernel/power/tuxonice_bio_core.c
-@@ -0,0 +1,1809 @@
+@@ -0,0 +1,1822 @@
 +/*
 + * kernel/power/tuxonice_bio.c
 + *
@@ -6997,7 +6965,7 @@
 +#include <linux/syscalls.h>
 +#include <linux/suspend.h>
 +#include <linux/ctype.h>
-+#include <linux/uuid.h>
++#include <linux/fs_uuid.h>
 +#include <scsi/scsi_scan.h>
 +
 +#include "tuxonice.h"
@@ -7130,7 +7098,11 @@
 +      char buf[32];
 +
 +      if (uuid) {
-+              device = blk_lookup_uuid(uuid);
++              struct fs_info seek;
++              strncpy((char *) &seek.uuid, uuid, 16);
++              seek.dev_t = 0;
++              seek.last_mount_size = 0;
++              device = blk_lookup_fs_info(&seek);
 +              if (!device) {
 +                      device = default_device;
 +                      printk(KERN_DEBUG "Unable to resolve uuid. Falling back"
@@ -8412,10 +8384,15 @@
 +      toi_message(TOI_IO, TOI_VERBOSE, 0, "Header dev_t is %lx.",
 +                      toi_sig_data->header_dev_t);
 +      if (toi_sig_data->have_uuid) {
++              struct fs_info seek;
 +              dev_t device;
-+              device = blk_lookup_uuid(toi_sig_data->header_uuid);
++
++              strncpy((char *) seek.uuid, toi_sig_data->header_uuid, 16);
++              seek.dev_t = toi_sig_data->header_dev_t;
++              seek.last_mount_size = 0;
++              device = blk_lookup_fs_info(&seek);
 +              if (device) {
-+                      printk("Using dev_t %s, returned by blk_lookup_uuid.\n",
++                      printk("Using dev_t %s, returned by 
blk_lookup_fs_info.\n",
 +                                      format_dev_t(buf, device));
 +                      toi_sig_data->header_dev_t = device;
 +              }
@@ -8547,7 +8524,11 @@
 +              retry_if_fails(toi_bio_scan_for_image(quiet));
 +
 +      if (uuid) {
-+              retry_if_fails(resume_dev_t = blk_lookup_uuid(uuid));
++              struct fs_info seek;
++              strncpy((char *) &seek.uuid, uuid, 16);
++              seek.dev_t = resume_dev_t;
++              seek.last_mount_size = 0;
++              retry_if_fails(resume_dev_t = blk_lookup_fs_info(&seek));
 +              kfree(uuid);
 +      }
 +
@@ -8883,7 +8864,7 @@
 +int open_resume_dev_t(int force, int quiet);
 diff --git a/kernel/power/tuxonice_bio_signature.c 
b/kernel/power/tuxonice_bio_signature.c
 new file mode 100644
-index 0000000..7913c12
+index 0000000..2ebee7e
 --- /dev/null
 +++ b/kernel/power/tuxonice_bio_signature.c
 @@ -0,0 +1,404 @@
@@ -8896,7 +8877,7 @@
 + *
 + */
 +
-+#include <linux/uuid.h>
++#include <linux/fs_uuid.h>
 +
 +#include "tuxonice.h"
 +#include "tuxonice_sysfs.h"
@@ -9293,10 +9274,10 @@
 +}
 diff --git a/kernel/power/tuxonice_builtin.c b/kernel/power/tuxonice_builtin.c
 new file mode 100644
-index 0000000..d9704f2
+index 0000000..bc967d6
 --- /dev/null
 +++ b/kernel/power/tuxonice_builtin.c
-@@ -0,0 +1,360 @@
+@@ -0,0 +1,372 @@
 +/*
 + * Copyright (C) 2004-2010 Nigel Cunningham (nigel at tuxonice net)
 + *
@@ -9596,6 +9577,18 @@
 +__nosavedata struct pbe *restore_highmem_pblist;
 +EXPORT_SYMBOL_GPL(restore_highmem_pblist);
 +
++void toi_read_lock_tasklist(void)
++{
++      read_lock(&tasklist_lock);
++}
++EXPORT_SYMBOL_GPL(toi_read_lock_tasklist);
++
++void toi_read_unlock_tasklist(void)
++{
++      read_unlock(&tasklist_lock);
++}
++EXPORT_SYMBOL_GPL(toi_read_unlock_tasklist);
++
 +static int __init toi_wait_setup(char *str)
 +{
 +      int value;
@@ -9659,10 +9652,10 @@
 +__setup("toi_no_multithreaded", toi_force_no_multithreaded_setup);
 diff --git a/kernel/power/tuxonice_builtin.h b/kernel/power/tuxonice_builtin.h
 new file mode 100644
-index 0000000..56ede35
+index 0000000..ab67d31
 --- /dev/null
 +++ b/kernel/power/tuxonice_builtin.h
-@@ -0,0 +1,30 @@
+@@ -0,0 +1,32 @@
 +/*
 + * Copyright (C) 2004-2010 Nigel Cunningham (nigel at tuxonice net)
 + *
@@ -9693,6 +9686,8 @@
 +extern int toi_wait;
 +extern int toi_translate_err_default;
 +extern int toi_force_no_multithreaded;
++extern void toi_read_lock_tasklist(void);
++extern void toi_read_unlock_tasklist(void);
 diff --git a/kernel/power/tuxonice_checksum.c 
b/kernel/power/tuxonice_checksum.c
 new file mode 100644
 index 0000000..3ec2c76
@@ -11896,7 +11891,7 @@
 +#endif
 diff --git a/kernel/power/tuxonice_file.c b/kernel/power/tuxonice_file.c
 new file mode 100644
-index 0000000..e40f5d8
+index 0000000..7a4614a
 --- /dev/null
 +++ b/kernel/power/tuxonice_file.c
 @@ -0,0 +1,496 @@
@@ -11934,7 +11929,7 @@
 +#include <linux/blkdev.h>
 +#include <linux/mount.h>
 +#include <linux/fs.h>
-+#include <linux/uuid.h>
++#include <linux/fs_uuid.h>
 +
 +#include "tuxonice.h"
 +#include "tuxonice_modules.h"
@@ -13717,10 +13712,10 @@
 +#endif
 diff --git a/kernel/power/tuxonice_io.c b/kernel/power/tuxonice_io.c
 new file mode 100644
-index 0000000..94c8b88
+index 0000000..6030dc6
 --- /dev/null
 +++ b/kernel/power/tuxonice_io.c
-@@ -0,0 +1,1822 @@
+@@ -0,0 +1,1836 @@
 +/*
 + * kernel/power/tuxonice_io.c
 + *
@@ -13744,7 +13739,7 @@
 +#include <linux/cpu.h>
 +#include <linux/fs_struct.h>
 +#include <linux/bio.h>
-+#include <linux/uuid.h>
++#include <linux/fs_uuid.h>
 +#include <asm/tlbflush.h>
 +
 +#include "tuxonice.h"
@@ -13764,12 +13759,12 @@
 +/* Version read from image header at resume */
 +static int toi_image_header_version;
 +
-+#define read_if_version(VERS, VAR, DESC) do {                                 
\
++#define read_if_version(VERS, VAR, DESC, ERR_ACT) do {                        
                \
 +      if (likely(toi_image_header_version >= VERS))                           
\
 +              if (toiActiveAllocator->rw_header_chunk(READ, NULL,             
\
 +                                      (char *) &VAR, sizeof(VAR))) {          
\
 +                      abort_hibernate(TOI_FAILED_IO, "Failed to read DESC."); 
\
-+                      goto out_remove_image;                                  
\
++                      ERR_ACT;                                        \
 +              }                                                               
\
 +} while(0)                                                                    
\
 +
@@ -14870,7 +14865,8 @@
 +
 +              fs = fs_info_from_block_dev(sb->s_bdev);
 +              if (save_fs_info(fs, sb->s_bdev))
-+                      result += 16 + sizeof(int) + fs->last_mount_size;
++                      result += 16 + sizeof(dev_t) + sizeof(int) +
++                              fs->last_mount_size;
 +              free_fs_info(fs);
 +      }
 +      return result;
@@ -14923,6 +14919,12 @@
<<Diff was trimmed, longer than 597 lines>>

---- CVS-web:
    
http://cvs.pld-linux.org/cgi-bin/cvsweb.cgi/packages/kernel/kernel-tuxonice.patch?r1=1.13&r2=1.14&f=u
    
http://cvs.pld-linux.org/cgi-bin/cvsweb.cgi/packages/kernel/kernel.spec?r1=1.792&r2=1.793&f=u

_______________________________________________
pld-cvs-commit mailing list
[email protected]
http://lists.pld-linux.org/mailman/listinfo/pld-cvs-commit

Reply via email to