Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 104245
b: refs/heads/master
c: 0cd17fe
h: refs/heads/master
i:
  104243: c5164e5
v: v3
  • Loading branch information
Chris Webb authored and Neil Brown committed Jun 27, 2008
1 parent 1235c81 commit 634550f
Show file tree
Hide file tree
Showing 2 changed files with 88 additions and 14 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 526647320e696f434647f38421a6ecf65b859c43
refs/heads/master: 0cd17fec983b6bca505eecee1af33138687220b6
100 changes: 87 additions & 13 deletions trunk/drivers/md/md.c
Original file line number Diff line number Diff line change
Expand Up @@ -658,11 +658,14 @@ static unsigned int calc_sb_csum(mdp_super_t * sb)
*/

struct super_type {
char *name;
struct module *owner;
int (*load_super)(mdk_rdev_t *rdev, mdk_rdev_t *refdev, int minor_version);
int (*validate_super)(mddev_t *mddev, mdk_rdev_t *rdev);
void (*sync_super)(mddev_t *mddev, mdk_rdev_t *rdev);
char *name;
struct module *owner;
int (*load_super)(mdk_rdev_t *rdev, mdk_rdev_t *refdev,
int minor_version);
int (*validate_super)(mddev_t *mddev, mdk_rdev_t *rdev);
void (*sync_super)(mddev_t *mddev, mdk_rdev_t *rdev);
unsigned long long (*rdev_size_change)(mdk_rdev_t *rdev,
unsigned long long size);
};

/*
Expand Down Expand Up @@ -1003,6 +1006,27 @@ static void super_90_sync(mddev_t *mddev, mdk_rdev_t *rdev)
sb->sb_csum = calc_sb_csum(sb);
}

/*
* rdev_size_change for 0.90.0
*/
static unsigned long long
super_90_rdev_size_change(mdk_rdev_t *rdev, unsigned long long size)
{
if (size && size < rdev->mddev->size)
return 0; /* component must fit device */
size *= 2; /* convert to sectors */
if (rdev->mddev->bitmap_offset)
return 0; /* can't move bitmap */
rdev->sb_offset = calc_dev_sboffset(rdev->bdev);
if (!size || size > rdev->sb_offset*2)
size = rdev->sb_offset*2;
md_super_write(rdev->mddev, rdev, rdev->sb_offset << 1, rdev->sb_size,
rdev->sb_page);
md_super_wait(rdev->mddev);
return size/2; /* kB for sysfs */
}


/*
* version 1 superblock
*/
Expand Down Expand Up @@ -1328,21 +1352,59 @@ static void super_1_sync(mddev_t *mddev, mdk_rdev_t *rdev)
sb->sb_csum = calc_sb_1_csum(sb);
}

static unsigned long long
super_1_rdev_size_change(mdk_rdev_t *rdev, unsigned long long size)
{
struct mdp_superblock_1 *sb;
unsigned long long max_size;
if (size && size < rdev->mddev->size)
return 0; /* component must fit device */
size *= 2; /* convert to sectors */
if (rdev->sb_offset < rdev->data_offset/2) {
/* minor versions 1 and 2; superblock before data */
max_size = (rdev->bdev->bd_inode->i_size >> 9);
max_size -= rdev->data_offset;
if (!size || size > max_size)
size = max_size;
} else if (rdev->mddev->bitmap_offset) {
/* minor version 0 with bitmap we can't move */
return 0;
} else {
/* minor version 0; superblock after data */
sector_t sb_offset;
sb_offset = (rdev->bdev->bd_inode->i_size >> 9) - 8*2;
sb_offset &= ~(sector_t)(4*2 - 1);
max_size = rdev->size*2 + sb_offset - rdev->sb_offset*2;
if (!size || size > max_size)
size = max_size;
rdev->sb_offset = sb_offset/2;
}
sb = (struct mdp_superblock_1 *) page_address(rdev->sb_page);
sb->data_size = cpu_to_le64(size);
sb->super_offset = rdev->sb_offset*2;
sb->sb_csum = calc_sb_1_csum(sb);
md_super_write(rdev->mddev, rdev, rdev->sb_offset << 1, rdev->sb_size,
rdev->sb_page);
md_super_wait(rdev->mddev);
return size/2; /* kB for sysfs */
}

static struct super_type super_types[] = {
[0] = {
.name = "0.90.0",
.owner = THIS_MODULE,
.load_super = super_90_load,
.validate_super = super_90_validate,
.sync_super = super_90_sync,
.load_super = super_90_load,
.validate_super = super_90_validate,
.sync_super = super_90_sync,
.rdev_size_change = super_90_rdev_size_change,
},
[1] = {
.name = "md-1",
.owner = THIS_MODULE,
.load_super = super_1_load,
.validate_super = super_1_validate,
.sync_super = super_1_sync,
.load_super = super_1_load,
.validate_super = super_1_validate,
.sync_super = super_1_sync,
.rdev_size_change = super_1_rdev_size_change,
},
};

Expand Down Expand Up @@ -2060,8 +2122,20 @@ rdev_size_store(mdk_rdev_t *rdev, const char *buf, size_t len)

if (e==buf || (*e && *e != '\n'))
return -EINVAL;
if (my_mddev->pers && rdev->raid_disk >= 0)
return -EBUSY;
if (my_mddev->pers && rdev->raid_disk >= 0) {
if (rdev->mddev->persistent) {
size = super_types[rdev->mddev->major_version].
rdev_size_change(rdev, size);
if (!size)
return -EBUSY;
} else if (!size) {
size = (rdev->bdev->bd_inode->i_size >> 10);
size -= rdev->data_offset/2;
}
if (size < rdev->mddev->size)
return -EINVAL; /* component must fit device */
}

rdev->size = size;
if (size > oldsize && rdev->mddev->external) {
/* need to check that all other rdevs with the same ->bdev
Expand Down

0 comments on commit 634550f

Please sign in to comment.