henesyinit from p9fd787fda5 years agoHistory
195 lines · 2.6 KB · C
RawDownload
#include	"all.h" /* * multiple cat devices */voidmcatinit(Device *d){	Device *x, **list; 	d->cat.ndev = 0;	for(x=d->cat.first; x; x=x->link) {		devinit(x);		d->cat.ndev++;	} 	list = ialloc(d->cat.ndev*sizeof(Device*), 0);	d->private = list;	for(x=d->cat.first; x; x=x->link) {		*list++ = x;		x->size = devsize(x);	}} longmcatsize(Device *d){	Device *x;	long l, m; 	l = 0;	for(x=d->cat.first; x; x=x->link) {		m = x->size;		if(m == 0) {			m = devsize(x);			x->size = m;		}		l += m;	}	return l;} intmcatread(Device *d, long b, void *c){	Device *x;	long l, m; 	l = 0;	for(x=d->cat.first; x; x=x->link) {		m = x->size;		if(m == 0) {			m = devsize(x);			x->size = m;		}		if(b < l+m)			return devread(x, b-l, c);		l += m;	}	print("mcatread %ld %ld\n", b, l);	return 1;} intmcatwrite(Device *d, long b, void *c){	Device *x;	long l, m; 	l = 0;	for(x=d->cat.first; x; x=x->link) {		m = x->size;		if(m == 0) {			m = devsize(x);			x->size = m;		}		if(b < l+m)			return devwrite(x, b-l, c);		l += m;	}	print("mcatwrite %ld %ld\n", b, l);	return 1;} /* * multiple interleave devices */voidmlevinit(Device *d){	Device *x; 	mcatinit(d);	for(x=d->cat.first; x; x=x->link)		x->size = devsize(x);} longmlevsize(Device *d){	Device *x;	int n;	long m, min; 	min = 0;	n = 0;	for(x=d->cat.first; x; x=x->link) {		m = x->size;		if(m == 0) {			m = devsize(x);			x->size = m;		}		if(min == 0 || m < min)			min = m;		n++;	}	return n * min;} intmlevread(Device *d, long b, void *c){	int n;	Device **list; 	n = d->cat.ndev;	list = d->private;	return devread(list[b%n], b/n, c);} intmlevwrite(Device *d, long b, void *c){	int n;	Device **list; 	n = d->cat.ndev;	list = d->private;	return devwrite(list[b%n], b/n, c);} /* * partition device */voidpartinit(Device *d){ 	devinit(d->part.d);	d->part.d->size = devsize(d->part.d);} longpartsize(Device *d){	long size, l; 	l = d->part.d->size / 100;	size = d->part.size * l;	if(size == 0)		size = l*100;	return size;} intpartread(Device *d, long b, void *c){	long base, size, l; 	l = d->part.d->size / 100;	base = d->part.base * l;	size = d->part.size * l;	if(size == 0)		size = l*100;	if(b < size)		return devread(d->part.d, base+b, c);	print("partread %ld %ld\n", b, size);	return 1;} intpartwrite(Device *d, long b, void *c){	long base, size, l; 	l = d->part.d->size / 100;	base = d->part.base * l;	size = d->part.size * l;	if(size == 0)		size = l*100;	if(b < size)		return devwrite(d->part.d, base+b, c);	print("partwrite %ld %ld\n", b, size);	return 1;}