37 long long int llabs(
long long int j);
75 track =
conf->cc_seek_track_to_track;
76 avg =
conf->cc_seek_avg;
78 nrcyl =
conf->cc_cylinders;
83 conf->cc_alpha = ( 4 *
full - 6 * avg + 2 * track) / nrcyl;
84 conf->cc_beta = (-3 *
full + 6 * avg - 3 * track) / sqrt(nrcyl);
102 conf->cc_zone = calloc(nrcyl,
sizeof conf->cc_zone[0]);
103 smax =
conf->cc_sectors_max;
104 smin =
conf->cc_sectors_min;
106 cyl_in_zone =
conf->cc_cyl_in_zone;
107 for (sectors_cum = 0,
i = 0;
i < nrcyl; ++
i) {
111 zone_start =
i / cyl_in_zone * cyl_in_zone;
113 sectors_track = smax - (smax - smin) * zone_start / (nrcyl - 1);
114 sectors_cyl = sectors_track *
conf->cc_heads;
115 conf->cc_zone[
i].track_sectors = sectors_track;
116 conf->cc_zone[
i].cyl_sectors = sectors_cyl;
117 conf->cc_zone[
i].cyl_first = sectors_cum;
118 sectors_cum += sectors_cyl;
120 printf(
"total of %llu sectors\n", sectors_cum);
162 return conf->cc_zone[cyl].track_sectors;
171 return conf->cc_zone[cyl].cyl_first;
183 M0_ASSERT(sector <= conf->cc_zone[
conf->cc_cylinders - 1].cyl_first +
184 conf->cc_zone[
conf->cc_cylinders - 1].cyl_sectors);
187 j =
conf->cc_cylinders;
190 if (
conf->cc_zone[h].cyl_first <= sector)
197 sector < conf->cc_zone[
i + 1].cyl_first);
205 unsigned *
head,
unsigned *cylinder,
209 unsigned track_sects;
212 M0_ASSERT(*cylinder < conf->cc_cylinders);
216 cyl_sects = track_sects *
conf->cc_heads;
217 M0_ASSERT(cyl_sects ==
conf->cc_zone[*cylinder].cyl_sectors);
220 *
head = sector / track_sects;
222 sector -= *
head * track_sects;
223 *sect_in_track = sector;
234 return sectors * 1000000000ULL / (track_sects *
conf->cc_rps);
278 sector_target0 = sector_target;
284 conf->cc_seek_track_to_track +
285 conf->cc_alpha * (armmove - 1) +
286 conf->cc_beta * sqrt(armmove - 1);
289 seek +=
conf->cc_write_settle;
295 seek +=
conf->cc_head_switch;
305 (track_sects *
conf->cc_rps *
309 sects_dist = sector_at - sector_target;
311 sects_dist += track_sects;
319 for (xfer = 0; cylinder <
conf->cc_cylinders; cylinder++) {
323 sects_dist = track_sects - sector_target;
324 if (sects_dist >
count)
330 xfer +=
conf->cc_head_switch;
335 xfer +=
conf->cc_seek_track_to_track;
337 xfer +=
conf->cc_write_settle;
346 SLL_TRACE,
"D%s: [%4u:%u:%4llu] -> [%4u:%u:%4llu] %10llu " 350 cylinder,
head, sector_target0, sector,
351 seek, rotation, xfer);
359 return conf->cc_command_latency + seek + rotation + xfer;
struct chs_conf * cd_conf
struct sim_callout cd_todo
static void chs_submit(struct storage_dev *dev, enum storage_req_type type, sector_t sector, unsigned long count)
M0_INTERNAL void chs_dev_fini(struct chs_dev *dev)
static unsigned chs_tracks(struct chs_conf *conf, unsigned cyl)
M0_INTERNAL void chs_conf_fini(struct chs_conf *conf)
M0_INTERNAL void sim_log(struct sim *s, enum sim_log_level level, const char *format,...)
#define container_of(ptr, type, member)
static unsigned chs_sector_cylinder(struct chs_conf *conf, sector_t sector)
static void chs_sector_to_chs(struct chs_conf *conf, sector_t sector, unsigned *head, unsigned *cylinder, sector_t *sect_in_track)
M0_INTERNAL void cnt_init(struct cnt *cnt, struct cnt *parent, const char *format,...)
static sector_t chs_cylinder_sectors(struct chs_conf *conf, unsigned cyl)
static int head(struct m0_sm *mach)
static sim_time_t chs_sect_time(struct chs_conf *conf, unsigned track_sects, unsigned sectors)
unsigned long long sector_t
M0_INTERNAL void cnt_mod(struct cnt *cnt, cnt_t val)
M0_INTERNAL void chs_conf_init(struct chs_conf *conf)
static sim_time_t chs_req(struct chs_dev *dev, enum storage_req_type type, sector_t sector, long count)
unsigned long long sim_time_t
storage_end_io_t sd_end_io
M0_INTERNAL void chs_dev_init(struct chs_dev *dev, struct sim *sim, struct chs_conf *conf)
static int chs_req_done(struct sim_callout *call)
M0_INTERNAL void sim_timer_rearm(struct sim_callout *call, sim_time_t delta, sim_call_t *cfunc, void *datum)
struct cnt cd_rotation_time
long long int llabs(long long int j)
struct storage_dev cd_storage
enum chs_dev_state cd_state
struct storage_conf * sd_conf
M0_INTERNAL void cnt_fini(struct cnt *cnt)
storage_submit_t sd_submit