Changes in uspace/srv/volsrv/part.c [1a9174e:5a6cc679] in mainline
- File:
-
- 1 edited
-
uspace/srv/volsrv/part.c (modified) (14 diffs)
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/volsrv/part.c
r1a9174e r5a6cc679 51 51 52 52 static 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 56 53 static LIST_INITIALIZE(vol_parts); /* of vol_part_t */ 57 54 static FIBRIL_MUTEX_INITIALIZE(vol_parts_lock); … … 71 68 }; 72 69 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 */ 89 71 static errno_t vol_part_check_new(void) 90 72 { 91 73 bool already_known; 92 bool still_exists;93 74 category_id_t part_cat; 94 75 service_id_t *svcs; 95 76 size_t count, i; 96 link_t *cur, *next;97 vol_part_t *part;98 77 errno_t rc; 99 78 … … 115 94 } 116 95 117 /* Check for new partitions */118 96 for (i = 0; i < count; i++) { 119 97 already_known = false; 120 98 121 // XXX Make this faster122 99 list_foreach(vol_parts, lparts, vol_part_t, part) { 123 100 if (part->svc_id == svcs[i]) { … … 138 115 } 139 116 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 faster148 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 166 117 fibril_mutex_unlock(&vol_parts_lock); 167 118 return EOK; … … 178 129 } 179 130 180 atomic_set(&part->refcnt, 1);181 131 link_initialize(&part->lparts); 182 132 part->pcnt = vpc_empty; … … 187 137 static void vol_part_delete(vol_part_t *part) 188 138 { 189 log_msg(LOG_DEFAULT, LVL_ERROR, "Freeing partition %p", part);190 139 if (part == NULL) 191 140 return; 192 141 193 free(part->cur_mp);194 142 free(part->svc_name); 195 143 free(part); … … 256 204 } 257 205 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 301 206 static errno_t vol_part_add_locked(service_id_t sid) 302 207 { … … 305 210 306 211 assert(fibril_mutex_is_locked(&vol_parts_lock)); 307 log_msg(LOG_DEFAULT, LVL_NOTE, "vol_part_add_locked(%zu)", sid);308 212 309 213 /* 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) 313 216 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()"); 318 219 part = vol_part_new(); 319 220 if (part == NULL) … … 332 233 goto error; 333 234 334 rc = vol_part_mount(part);335 if (rc != EOK)336 goto error;337 338 235 list_append(&part->lparts, &vol_parts); 339 236 … … 345 242 vol_part_delete(part); 346 243 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);358 244 } 359 245 … … 422 308 } 423 309 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 310 errno_t vol_part_find_by_id(service_id_t sid, vol_part_t **rpart) 311 { 429 312 list_foreach(vol_parts, lparts, vol_part_t, part) { 430 313 if (part->svc_id == sid) { 431 /* Add reference */432 atomic_inc(&part->refcnt);433 314 *rpart = part; 315 /* XXX Add reference */ 434 316 return EOK; 435 317 } … … 437 319 438 320 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;490 321 } 491 322 … … 535 366 } 536 367 537 rc = vol_part_mount(part);538 if (rc != EOK) {539 fibril_mutex_unlock(&vol_parts_lock);540 return rc;541 }542 543 368 fibril_mutex_unlock(&vol_parts_lock); 544 369 return EOK; … … 547 372 errno_t vol_part_get_info(vol_part_t *part, vol_part_info_t *pinfo) 548 373 { 549 memset(pinfo, 0, sizeof(*pinfo));550 551 374 pinfo->pcnt = part->pcnt; 552 375 pinfo->fstype = part->fstype; 553 376 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;557 377 return EOK; 558 378 }
Note:
See TracChangeset
for help on using the changeset viewer.
