Ignore:
File:
1 edited

Legend:

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

    r9c96634 r9c2c7d2  
    143143}
    144144
    145 static int vol_part_add_locked(service_id_t sid)
    146 {
    147         vol_part_t *part;
     145static int vol_part_probe(vol_part_t *part)
     146{
    148147        bool empty;
    149148        vfs_fs_probe_info_t info;
    150149        struct fsname_type *fst;
     150        char *label;
     151        int rc;
     152
     153        log_msg(LOG_DEFAULT, LVL_NOTE, "Probe partition %s", part->svc_name);
     154
     155        assert(fibril_mutex_is_locked(&vol_parts_lock));
     156
     157        fst = &fstab[0];
     158        while (fst->name != NULL) {
     159                rc = vfs_fsprobe(fst->name, part->svc_id, &info);
     160                if (rc == EOK)
     161                        break;
     162                ++fst;
     163        }
     164
     165        if (fst->name != NULL) {
     166                log_msg(LOG_DEFAULT, LVL_NOTE, "Found %s, label '%s'",
     167                    fst->name, info.label);
     168                label = str_dup(info.label);
     169                if (label == NULL) {
     170                        rc = ENOMEM;
     171                        goto error;
     172                }
     173
     174                part->pcnt = vpc_fs;
     175                part->fstype = fst->fstype;
     176                part->label = label;
     177        } else {
     178                log_msg(LOG_DEFAULT, LVL_NOTE, "Partition does not contain "
     179                    "a recognized file system.");
     180
     181                rc = volsrv_part_is_empty(part->svc_id, &empty);
     182                if (rc != EOK) {
     183                        log_msg(LOG_DEFAULT, LVL_ERROR, "Failed determining if "
     184                            "partition is empty.");
     185                        rc = EIO;
     186                        goto error;
     187                }
     188
     189                label = str_dup("");
     190                if (label == NULL) {
     191                        rc = ENOMEM;
     192                        goto error;
     193                }
     194
     195                part->pcnt = empty ? vpc_empty : vpc_unknown;
     196                part->label = label;
     197        }
     198
     199        return EOK;
     200
     201error:
     202        return rc;
     203}
     204
     205static int vol_part_add_locked(service_id_t sid)
     206{
     207        vol_part_t *part;
    151208        int rc;
    152209
     
    171228        }
    172229
    173         log_msg(LOG_DEFAULT, LVL_NOTE, "Probe partition %s", part->svc_name);
    174 
    175         fst = &fstab[0];
    176         while (fst->name != NULL) {
    177                 rc = vfs_fsprobe(fst->name, sid, &info);
    178                 if (rc == EOK)
    179                         break;
    180                 ++fst;
    181         }
    182 
    183         if (fst->name != NULL) {
    184                 log_msg(LOG_DEFAULT, LVL_NOTE, "Found %s, label '%s'",
    185                     fst->name, info.label);
    186                 part->pcnt = vpc_fs;
    187                 part->fstype = fst->fstype;
    188         } else {
    189                 log_msg(LOG_DEFAULT, LVL_NOTE, "Partition does not contain "
    190                     "a recognized file system.");
    191 
    192                 rc = volsrv_part_is_empty(sid, &empty);
    193                 if (rc != EOK) {
    194                         log_msg(LOG_DEFAULT, LVL_ERROR, "Failed determining if "
    195                             "partition is empty.");
    196                         goto error;
    197                 }
    198 
    199                 part->pcnt = empty ? vpc_empty : vpc_unknown;
    200         }
     230        rc = vol_part_probe(part);
     231        if (rc != EOK)
     232                goto error;
    201233
    202234        list_append(&part->lparts, &vol_parts);
     
    305337}
    306338
    307 int vol_part_mkfs_part(vol_part_t *part, vol_fstype_t fstype)
     339int vol_part_mkfs_part(vol_part_t *part, vol_fstype_t fstype,
     340    const char *label)
    308341{
    309342        int rc;
     
    311344        log_msg(LOG_DEFAULT, LVL_DEBUG, "vol_part_mkfs_part()");
    312345
    313         rc = volsrv_part_mkfs(part->svc_id, fstype);
     346        fibril_mutex_lock(&vol_parts_lock);
     347
     348        rc = volsrv_part_mkfs(part->svc_id, fstype, label);
    314349        if (rc != EOK) {
    315350                log_msg(LOG_DEFAULT, LVL_DEBUG, "vol_part_mkfs_part() - failed %d",
    316351                    rc);
     352                fibril_mutex_unlock(&vol_parts_lock);
    317353                return rc;
    318354        }
    319355
    320         part->pcnt = vpc_fs;
    321         part->fstype = fstype;
     356        /*
     357         * Re-probe the partition to update information. This is needed since
     358         * the FS can make conversions of the volume label (e.g. make it
     359         * uppercase).
     360         */
     361        rc = vol_part_probe(part);
     362        if (rc != EOK) {
     363                fibril_mutex_unlock(&vol_parts_lock);
     364                return rc;
     365        }
     366
     367        fibril_mutex_unlock(&vol_parts_lock);
    322368        return EOK;
    323369}
     
    327373        pinfo->pcnt = part->pcnt;
    328374        pinfo->fstype = part->fstype;
     375        str_cpy(pinfo->label, sizeof(pinfo->label), part->label);
    329376        return EOK;
    330377}
Note: See TracChangeset for help on using the changeset viewer.