]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
imsm: Clear migration record when no migration in progress
authorAdam Kwolek <adam.kwolek@intel.com>
Wed, 8 Jun 2011 07:09:16 +0000 (17:09 +1000)
committerNeilBrown <neilb@suse.de>
Wed, 8 Jun 2011 07:09:16 +0000 (17:09 +1000)
When metadata is saved and there is no general migration in progress
/in container/ clear migration record in container.

Signed-off-by: Adam Kwolek <adam.kwolek@intel.com>
Signed-off-by: Krzysztof Wojcik <krzysztof.wojcik@intel.com>
Signed-off-by: NeilBrown <neilb@suse.de>
super-intel.c

index 4b30024441da1f8c18e2dd085c3e0c553886b7da..69cab38c8f47f24ae2640aef2809428bda7b4609 100644 (file)
@@ -4248,6 +4248,8 @@ static int write_super_imsm_spares(struct intel_super *super, int doclose)
        return 0;
 }
 
+static int is_gen_migration(struct imsm_dev *dev);
+
 static int write_super_imsm(struct supertype *st, int doclose)
 {
        struct intel_super *super = st->sb;
@@ -4259,6 +4261,7 @@ static int write_super_imsm(struct supertype *st, int doclose)
        int i;
        __u32 mpb_size = sizeof(struct imsm_super) - sizeof(struct imsm_disk);
        int num_disks = 0;
+       int clear_migration_record = 1;
 
        /* 'generation' is incremented everytime the metadata is written */
        generation = __le32_to_cpu(mpb->generation_num);
@@ -4293,6 +4296,8 @@ static int write_super_imsm(struct supertype *st, int doclose)
                        imsm_copy_dev(dev, dev2);
                        mpb_size += sizeof_imsm_dev(dev, 0);
                }
+               if (is_gen_migration(dev2))
+                       clear_migration_record = 0;
        }
        mpb_size += __le32_to_cpu(mpb->bbm_log_size);
        mpb->mpb_size = __cpu_to_le32(mpb_size);
@@ -4301,6 +4306,9 @@ static int write_super_imsm(struct supertype *st, int doclose)
        sum = __gen_imsm_checksum(mpb);
        mpb->check_sum = __cpu_to_le32(sum);
 
+       if (clear_migration_record)
+               memset(super->migr_rec_buf, 0, 512);
+
        /* write the mpb for disks that compose raid devices */
        for (d = super->disks; d ; d = d->next) {
                if (d->index < 0)
@@ -4308,6 +4316,14 @@ static int write_super_imsm(struct supertype *st, int doclose)
                if (store_imsm_mpb(d->fd, mpb))
                        fprintf(stderr, "%s: failed for device %d:%d %s\n",
                                __func__, d->major, d->minor, strerror(errno));
+               if (clear_migration_record) {
+                       unsigned long long dsize;
+
+                       get_dev_size(d->fd, NULL, &dsize);
+                       if (lseek64(d->fd, dsize - 512, SEEK_SET) >= 0) {
+                               write(d->fd, super->migr_rec_buf, 512);
+                       }
+               }
                if (doclose) {
                        close(d->fd);
                        d->fd = -1;