Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/volsrv/part.c

    r1a9174e r5a6cc679  
    5151
    5252static errno_t vol_part_add_locked(service_id_t);
    53 static void vol_part_remove_locked(vol_part_t *);
    54 static errno_t vol_part_find_by_id_ref_locked(service_id_t, vol_part_t **);
    55 
    5653static LIST_INITIALIZE(vol_parts); /* of vol_part_t */
    5754static FIBRIL_MUTEX_INITIALIZE(vol_parts_lock);
     
    7168};
    7269
    73 static const char *fstype_str(vol_fstype_t fstype)
    74 {
    75         struct fsname_type *fst;
    76 
    77         fst = &fstab[0];
    78         while (fst->name != NULL) {
    79                 if (fst->fstype == fstype)
    80                         return fst->name;
    81                 ++fst;
    82         }
    83 
    84         assert(false);
    85         return NULL;
    86 }
    87 
    88 /** Check for new and removed partitions */
     70/** Check for new partitions */
    8971static errno_t vol_part_check_new(void)
    9072{
    9173        bool already_known;
    92         bool still_exists;
    9374        category_id_t part_cat;
    9475        service_id_t *svcs;
    9576        size_t count, i;
    96         link_t *cur, *next;
    97         vol_part_t *part;
    9877        errno_t rc;
    9978
     
    11594        }
    11695
    117         /* Check for new partitions */
    11896        for (i = 0; i < count; i++) {
    11997                already_known = false;
    12098
    121                 // XXX Make this faster
    12299                list_foreach(vol_parts, lparts, vol_part_t, part) {
    123100                        if (part->svc_id == svcs[i]) {
     
    138115        }
    139116
    140         /* Check for removed partitions */
    141         cur = list_first(&vol_parts);
    142         while (cur != NULL) {
    143                 next = list_next(cur, &vol_parts);
    144                 part = list_get_instance(cur, vol_part_t, lparts);
    145 
    146                 still_exists = false;
    147                 // XXX Make this faster
    148                 for (i = 0; i < count; i++) {
    149                         if (part->svc_id == svcs[i]) {
    150                                 still_exists = true;
    151                                 break;
    152                         }
    153                 }
    154 
    155                 if (!still_exists) {
    156                         log_msg(LOG_DEFAULT, LVL_NOTE, "Partition '%zu' is gone",
    157                             part->svc_id);
    158                         vol_part_remove_locked(part);
    159                 }
    160 
    161                 cur = next;
    162         }
    163 
    164         free(svcs);
    165 
    166117        fibril_mutex_unlock(&vol_parts_lock);
    167118        return EOK;
     
    178129        }
    179130
    180         atomic_set(&part->refcnt, 1);
    181131        link_initialize(&part->lparts);
    182132        part->pcnt = vpc_empty;
     
    187137static void vol_part_delete(vol_part_t *part)
    188138{
    189         log_msg(LOG_DEFAULT, LVL_ERROR, "Freeing partition %p", part);
    190139        if (part == NULL)
    191140                return;
    192141
    193         free(part->cur_mp);
    194142        free(part->svc_name);
    195143        free(part);
     
    256204}
    257205
    258 static errno_t vol_part_mount(vol_part_t *part)
    259 {
    260         char *mp;
    261         int err;
    262         errno_t rc;
    263 
    264         if (str_size(part->label) < 1) {
    265                 /* Don't mount nameless volumes */
    266                 log_msg(LOG_DEFAULT, LVL_NOTE, "Not mounting nameless partition.");
    267                 return EOK;
    268         }
    269 
    270         log_msg(LOG_DEFAULT, LVL_NOTE, "Determine MP label='%s'", part->label);
    271         err = asprintf(&mp, "/vol/%s", part->label);
    272         if (err < 0) {
    273                 log_msg(LOG_DEFAULT, LVL_ERROR, "Out of memory");
    274                 return ENOMEM;
    275         }
    276 
    277         log_msg(LOG_DEFAULT, LVL_NOTE, "Create mount point '%s'", mp);
    278         rc = vfs_link_path(mp, KIND_DIRECTORY, NULL);
    279         if (rc != EOK) {
    280                 log_msg(LOG_DEFAULT, LVL_ERROR, "Error creating mount point '%s'",
    281                     mp);
    282                 free(mp);
    283                 return EIO;
    284         }
    285 
    286         log_msg(LOG_DEFAULT, LVL_NOTE, "Call vfs_mount_path mp='%s' fstype='%s' svc_name='%s'",
    287             mp, fstype_str(part->fstype), part->svc_name);
    288         rc = vfs_mount_path(mp, fstype_str(part->fstype),
    289             part->svc_name, "", 0, 0);
    290         if (rc != EOK) {
    291                 log_msg(LOG_DEFAULT, LVL_NOTE, "Failed mounting to %s", mp);
    292         }
    293         log_msg(LOG_DEFAULT, LVL_NOTE, "Mount to %s -> %d\n", mp, rc);
    294 
    295         part->cur_mp = mp;
    296         part->cur_mp_auto = true;
    297 
    298         return rc;
    299 }
    300 
    301206static errno_t vol_part_add_locked(service_id_t sid)
    302207{
     
    305210
    306211        assert(fibril_mutex_is_locked(&vol_parts_lock));
    307         log_msg(LOG_DEFAULT, LVL_NOTE, "vol_part_add_locked(%zu)", sid);
    308212
    309213        /* Check for duplicates */
    310         rc = vol_part_find_by_id_ref_locked(sid, &part);
    311         if (rc == EOK) {
    312                 vol_part_del_ref(part);
     214        rc = vol_part_find_by_id(sid, &part);
     215        if (rc == EOK)
    313216                return EEXIST;
    314         }
    315 
    316         log_msg(LOG_DEFAULT, LVL_NOTE, "partition %zu is new", sid);
    317 
     217
     218        log_msg(LOG_DEFAULT, LVL_DEBUG, "vol_part_add_locked()");
    318219        part = vol_part_new();
    319220        if (part == NULL)
     
    332233                goto error;
    333234
    334         rc = vol_part_mount(part);
    335         if (rc != EOK)
    336                 goto error;
    337 
    338235        list_append(&part->lparts, &vol_parts);
    339236
     
    345242        vol_part_delete(part);
    346243        return rc;
    347 }
    348 
    349 static void vol_part_remove_locked(vol_part_t *part)
    350 {
    351         assert(fibril_mutex_is_locked(&vol_parts_lock));
    352         log_msg(LOG_DEFAULT, LVL_NOTE, "vol_part_remove_locked(%zu)", part->svc_id);
    353 
    354         list_remove(&part->lparts);
    355 
    356         log_msg(LOG_DEFAULT, LVL_NOTE, "Removed partition.");
    357         vol_part_del_ref(part);
    358244}
    359245
     
    422308}
    423309
    424 static errno_t vol_part_find_by_id_ref_locked(service_id_t sid,
    425     vol_part_t **rpart)
    426 {
    427         assert(fibril_mutex_is_locked(&vol_parts_lock));
    428 
     310errno_t vol_part_find_by_id(service_id_t sid, vol_part_t **rpart)
     311{
    429312        list_foreach(vol_parts, lparts, vol_part_t, part) {
    430313                if (part->svc_id == sid) {
    431                         /* Add reference */
    432                         atomic_inc(&part->refcnt);
    433314                        *rpart = part;
     315                        /* XXX Add reference */
    434316                        return EOK;
    435317                }
     
    437319
    438320        return ENOENT;
    439 }
    440 
    441 errno_t vol_part_find_by_id_ref(service_id_t sid, vol_part_t **rpart)
    442 {
    443         errno_t rc;
    444 
    445         fibril_mutex_lock(&vol_parts_lock);
    446         rc = vol_part_find_by_id_ref_locked(sid, rpart);
    447         fibril_mutex_unlock(&vol_parts_lock);
    448 
    449         return rc;
    450 }
    451 
    452 void vol_part_del_ref(vol_part_t *part)
    453 {
    454         if (atomic_predec(&part->refcnt) == 0)
    455                 vol_part_delete(part);
    456 }
    457 
    458 errno_t vol_part_eject_part(vol_part_t *part)
    459 {
    460         int rc;
    461 
    462         log_msg(LOG_DEFAULT, LVL_DEBUG, "vol_part_eject_part()");
    463 
    464         if (part->cur_mp == NULL) {
    465                 log_msg(LOG_DEFAULT, LVL_DEBUG, "Attempt to mount unmounted "
    466                     "partition.");
    467                 return EINVAL;
    468         }
    469 
    470         rc = vfs_unmount_path(part->cur_mp);
    471         if (rc != EOK) {
    472                 log_msg(LOG_DEFAULT, LVL_ERROR, "Failed unmounting partition "
    473                     "from %s", part->cur_mp);
    474                 return rc;
    475         }
    476 
    477         if (part->cur_mp_auto) {
    478                 rc = vfs_unlink_path(part->cur_mp);
    479                 if (rc != EOK) {
    480                         log_msg(LOG_DEFAULT, LVL_ERROR, "Failed deleting "
    481                             "mount directory %s.", part->cur_mp);
    482                 }
    483         }
    484 
    485         free(part->cur_mp);
    486         part->cur_mp = NULL;
    487         part->cur_mp_auto = false;
    488 
    489         return EOK;
    490321}
    491322
     
    535366        }
    536367
    537         rc = vol_part_mount(part);
    538         if (rc != EOK) {
    539                 fibril_mutex_unlock(&vol_parts_lock);
    540                 return rc;
    541         }
    542 
    543368        fibril_mutex_unlock(&vol_parts_lock);
    544369        return EOK;
     
    547372errno_t vol_part_get_info(vol_part_t *part, vol_part_info_t *pinfo)
    548373{
    549         memset(pinfo, 0, sizeof(*pinfo));
    550 
    551374        pinfo->pcnt = part->pcnt;
    552375        pinfo->fstype = part->fstype;
    553376        str_cpy(pinfo->label, sizeof(pinfo->label), part->label);
    554         if (part->cur_mp != NULL)
    555                 str_cpy(pinfo->cur_mp, sizeof(pinfo->cur_mp), part->cur_mp);
    556         pinfo->cur_mp_auto = part->cur_mp_auto;
    557377        return EOK;
    558378}
Note: See TracChangeset for help on using the changeset viewer.