+static void
+allow_dump_dle(
+ disk_t *diskp,
+ taper_t *taper,
+ char dumptype,
+ disklist_t *rq,
+ const time_t now,
+ int dumper_to_holding,
+ int *cur_idle,
+ disk_t **delayed_diskp,
+ disk_t **diskp_accept,
+ assignedhd_t ***holdp_accept,
+ off_t extra_tapes_size)
+{
+ assignedhd_t **holdp=NULL;
+
+ if (diskp->host->start_t > now) {
+ *cur_idle = max(*cur_idle, IDLE_START_WAIT);
+ if (*delayed_diskp == NULL || sleep_time > diskp->host->start_t) {
+ *delayed_diskp = diskp;
+ sleep_time = diskp->host->start_t;
+ }
+ } else if(diskp->start_t > now) {
+ *cur_idle = max(*cur_idle, IDLE_START_WAIT);
+ if (*delayed_diskp == NULL || sleep_time > diskp->start_t) {
+ *delayed_diskp = diskp;
+ sleep_time = diskp->start_t;
+ }
+ } else if (diskp->host->netif->curusage > 0 &&
+ sched(diskp)->est_kps > free_kps(diskp->host->netif)) {
+ *cur_idle = max(*cur_idle, IDLE_NO_BANDWIDTH);
+ } else if (!taper && sched(diskp)->no_space) {
+ *cur_idle = max(*cur_idle, IDLE_NO_DISKSPACE);
+ } else if (!taper && diskp->to_holdingdisk == HOLD_NEVER) {
+ *cur_idle = max(*cur_idle, IDLE_NO_HOLD);
+ } else if (extra_tapes_size && sched(diskp)->est_size > extra_tapes_size) {
+ *cur_idle = max(*cur_idle, IDLE_NO_DISKSPACE);
+ /* no tape space */
+ } else if (!taper && (holdp =
+ find_diskspace(sched(diskp)->est_size, cur_idle, NULL)) == NULL) {
+ *cur_idle = max(*cur_idle, IDLE_NO_DISKSPACE);
+ if (empty(tapeq) && dumper_to_holding == 0 && rq != &directq && no_taper_flushing()) {
+ remove_disk(rq, diskp);
+ if (diskp->to_holdingdisk != HOLD_REQUIRED) {
+ enqueue_disk(&directq, diskp);
+ diskp->to_holdingdisk = HOLD_NEVER;
+ }
+ if (empty(*rq) && active_dumper() == 0) { force_flush = 1;}
+ }
+ } else if (client_constrained(diskp)) {
+ free_assignedhd(holdp);
+ *cur_idle = max(*cur_idle, IDLE_CLIENT_CONSTRAINED);
+ } else {
+
+ /* disk fits, dump it */
+ int accept = !*diskp_accept;
+ if(!accept) {
+ switch(dumptype) {
+ case 's': accept = (sched(diskp)->est_size < sched(*diskp_accept)->est_size);
+ break;
+ case 'S': accept = (sched(diskp)->est_size > sched(*diskp_accept)->est_size);
+ break;
+ case 't': accept = (sched(diskp)->est_time < sched(*diskp_accept)->est_time);
+ break;
+ case 'T': accept = (sched(diskp)->est_time > sched(*diskp_accept)->est_time);
+ break;
+ case 'b': accept = (sched(diskp)->est_kps < sched(*diskp_accept)->est_kps);
+ break;
+ case 'B': accept = (sched(diskp)->est_kps > sched(*diskp_accept)->est_kps);
+ break;
+ default: log_add(L_WARNING, _("Unknown dumporder character \'%c\', using 's'.\n"),
+ dumptype);
+ accept = (sched(diskp)->est_size < sched(*diskp_accept)->est_size);
+ break;
+ }
+ }
+ if(accept) {
+ if( !*diskp_accept || !degraded_mode || diskp->priority >= (*diskp_accept)->priority) {
+ if(*holdp_accept) free_assignedhd(*holdp_accept);
+ *diskp_accept = diskp;
+ *holdp_accept = holdp;
+ }
+ else {
+ free_assignedhd(holdp);
+ }
+ }
+ else {
+ free_assignedhd(holdp);
+ }
+ }
+}
+