|
|
1.1 root 1: #include <stdio.h>
2: #include <stddef.h>
3: #include <string.h>
4: #include "scsi.h"
5: #include "juke.h"
6:
7: j_load(char *vol_id, char *buf, long tlimit)
8: {
9: Side side;
10: int n, sh, dr;
11: char disk_to_load[256];
12: struct Lunstatus *l;
13:
14: if(j_rdshelves(buf)) /* read in shelf names */
15: return(-1);
16: if(j_getstatus(buf)) /* get the jukebox status */
17: return(-1);
18: /* now check which side we want */
19: n = strlen(vol_id);
20: strcpy(disk_to_load, vol_id);
21: if(disk_to_load[n-1] == 'a')
22: side = SIDEA;
23: else if(disk_to_load[n-1] == 'b')
24: side = SIDEB;
25: else {
26: sprintf(buf, "vol_id '%s' must end in a or b", vol_id);
27: return(-1);
28: }
29: disk_to_load[n-1] = 0;
30: /* which shelf is that? */
31: sh = j_shelfof(disk_to_load);
32: if(sh < 0){
33: sprintf(buf, "can't find vol_id %s", disk_to_load);
34: return(-1);
35: }
36: while(tlimit >= 0){
37: for(n = 0; n < NLUN; n++){
38: l = &j_status.lun[n];
39: if(l->diskin && l->shelfvalid && (sh == (l->retshelf>>1))){
40: if(((l->retshelf&1) == side) && (n < nlun))
41: return(n);
42: if(l->ready)
43: goto await;
44: if(j_drive_to_shelf(n, -1, 0, buf))
45: return(-1);
46: if(j_getstatus(buf)) /* get the jukebox status */
47: return(-1);
48: break;
49: }
50: }
51: /* disk is available */
52: dr = j_empty_drive(tlimit, buf);
53: if(dr < 0){
54: sprintf(buf, "can't find a free drive");
55: return(-1);
56: }
57: if(j_shelf_to_drive(sh, side, dr, buf) < 0)
58: return(-1);
59: return(dr);
60: await:
61: sleep(10);
62: tlimit -= 10;
63: if(j_getstatus(buf)) /* get the jukebox status */
64: return(-1);
65: }
66: sprintf(buf, "disk '%s' busy", disk_to_load);
67: return(-1);
68: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.