Fork us on GitHub Follow us on Facebook Follow us on Twitter

Changeset 3a9cf35 in mainline


Ignore:
Timestamp:
2016-01-16T19:11:12Z (4 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
master
Children:
8e670dd
Parents:
4f29118
Message:

VBD should take note of devices disappearing.

Location:
uspace/srv
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/bd/vbd/disk.c

    r4f29118 r3a9cf35  
    8989}
    9090
     91static vbds_disk_t *vbds_disk_first(void)
     92{
     93        link_t *link;
     94
     95        link = list_first(&vbds_disks);
     96        if (link == NULL)
     97                return NULL;
     98
     99        return list_get_instance(link, vbds_disk_t, ldisks);
     100}
     101
     102static vbds_disk_t *vbds_disk_next(vbds_disk_t *disk)
     103{
     104        link_t *link;
     105
     106        if (disk == NULL)
     107                return NULL;
     108
     109        link = list_next(&disk->ldisks, &vbds_disks);
     110        if (link == NULL)
     111                return NULL;
     112
     113        return list_get_instance(link, vbds_disk_t, ldisks);
     114}
     115
    91116int vbds_disks_init(void)
    92117{
     
    107132}
    108133
    109 /** Check for new disk devices */
     134/** Check for new/removed disk devices */
    110135static int vbds_disks_check_new(void)
    111136{
     
    114139        service_id_t *svcs;
    115140        size_t count, i;
    116         int rc;
     141        vbds_disk_t *cur, *next;
     142        int rc;
     143
     144        log_msg(LOG_DEFAULT, LVL_DEBUG, "vbds_disks_check_new()");
    117145
    118146        fibril_mutex_lock(&vbds_disks_lock);
     
    133161        }
    134162
     163        list_foreach(vbds_disks, ldisks, vbds_disk_t, disk)
     164                disk->present = false;
     165
    135166        for (i = 0; i < count; i++) {
    136167                already_known = false;
     
    139170                        if (disk->svc_id == svcs[i]) {
    140171                                already_known = true;
     172                                disk->present = true;
    141173                                break;
    142174                        }
     
    151183                                    "disk.");
    152184                        }
     185                } else {
     186                        log_msg(LOG_DEFAULT, LVL_DEBUG, "Disk %lu already known",
     187                            (unsigned long) svcs[i]);
    153188                }
     189        }
     190
     191        cur = vbds_disk_first();
     192        while (cur != NULL) {
     193                next = vbds_disk_next(cur);
     194                if (!cur->present) {
     195                        log_msg(LOG_DEFAULT, LVL_NOTE, "Disk '%lu' is gone",
     196                            (unsigned long) cur->svc_id);
     197                        rc = vbds_disk_remove(cur->svc_id);
     198                        if (rc != EOK) {
     199                                log_msg(LOG_DEFAULT, LVL_ERROR, "Could not "
     200                                    "remove disk.");
     201                        }
     202                }
     203
     204                cur = next;
    154205        }
    155206
     
    403454        disk->label = label;
    404455        disk->block_size = block_size;
     456        disk->present = true;
    405457
    406458        list_initialize(&disk->parts);
  • uspace/srv/bd/vbd/types/vbd.h

    r4f29118 r3a9cf35  
    4242#include <label.h>
    4343#include <loc.h>
     44#include <stdbool.h>
    4445#include <sys/types.h>
    4546#include <types/label.h>
     
    8788        /** Block size */
    8889        size_t block_size;
     90        /** Used to mark disks still present during re-discovery */
     91        bool present;
    8992} vbds_disk_t;
    9093
  • uspace/srv/locsrv/locsrv.c

    r4f29118 r3a9cf35  
    445445        free(server);
    446446       
     447        loc_category_change_event();
    447448        return EOK;
    448449}
     
    557558        fibril_mutex_unlock(&services_list_mutex);
    558559        async_answer_0(iid, EOK);
     560
     561        loc_category_change_event();
    559562}
    560563
Note: See TracChangeset for help on using the changeset viewer.