Compute backup blocks in function.

number of backup blocks evaluation is put in to function for code reuse.

Signed-off-by: Adam Kwolek <adam.kwolek@intel.com>
Signed-off-by: NeilBrown <neilb@suse.de>
This commit is contained in:
Adam Kwolek 2010-11-30 13:30:22 +11:00 committed by NeilBrown
parent 130994cb83
commit 1c009fc218
2 changed files with 29 additions and 17 deletions

44
Grow.c
View File

@ -905,6 +905,31 @@ release:
return d;
}
unsigned long compute_backup_blocks(int nchunk, int ochunk,
unsigned int ndata, unsigned int odata)
{
unsigned long a, b, blocks;
/* So how much do we need to backup.
* We need an amount of data which is both a whole number of
* old stripes and a whole number of new stripes.
* So LCM for (chunksize*datadisks).
*/
a = (ochunk/512) * odata;
b = (nchunk/512) * ndata;
/* Find GCD */
while (a != b) {
if (a < b)
b -= a;
if (b < a)
a -= b;
}
/* LCM == product / GCD */
blocks = (ochunk/512) * (nchunk/512) * odata * ndata / a;
return blocks;
}
int Grow_reshape(char *devname, int fd, int quiet, char *backup_file,
long long size,
int level, char *layout_str, int chunksize, int raid_disks)
@ -944,7 +969,7 @@ int Grow_reshape(char *devname, int fd, int quiet, char *backup_file,
int nrdisks;
int err;
int frozen;
unsigned long a,b, blocks, stripes;
unsigned long blocks, stripes;
unsigned long cache;
unsigned long long array_size;
int changed = 0;
@ -1534,22 +1559,7 @@ int Grow_reshape(char *devname, int fd, int quiet, char *backup_file,
break;
}
/* So how much do we need to backup.
* We need an amount of data which is both a whole number of
* old stripes and a whole number of new stripes.
* So LCM for (chunksize*datadisks).
*/
a = (ochunk/512) * odata;
b = (nchunk/512) * ndata;
/* Find GCD */
while (a != b) {
if (a < b)
b -= a;
if (b < a)
a -= b;
}
/* LCM == product / GCD */
blocks = (ochunk/512) * (nchunk/512) * odata * ndata / a;
blocks = compute_backup_blocks(nchunk, ochunk, ndata, odata);
sysfs_free(sra);
sra = sysfs_read(fd, 0,

View File

@ -487,6 +487,8 @@ extern void reshape_free_fdlist(int *fdlist,
unsigned long long *offsets,
int size);
extern unsigned long compute_backup_blocks(int nchunk, int ochunk,
unsigned int ndata, unsigned int odata);
extern int save_stripes(int *source, unsigned long long *offsets,
int raid_disks, int chunk_size, int level, int layout,