Changeset 9c2c7d2 in mainline for uspace/srv/volsrv/part.c


Ignore:
Timestamp:
2017-07-06T15:52:15Z (8 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
5cd1eb9a
Parents:
d858a660
Message:

Fdisk should be able to set volume label for newly created partitions.

File:
1 edited

Legend:

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

    rd858a660 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                 part->label = str_dup(info.label);
    189                 if (part->label == NULL)
    190                         goto error;
    191         } else {
    192                 log_msg(LOG_DEFAULT, LVL_NOTE, "Partition does not contain "
    193                     "a recognized file system.");
    194 
    195                 rc = volsrv_part_is_empty(sid, &empty);
    196                 if (rc != EOK) {
    197                         log_msg(LOG_DEFAULT, LVL_ERROR, "Failed determining if "
    198                             "partition is empty.");
    199                         goto error;
    200                 }
    201 
    202                 part->pcnt = empty ? vpc_empty : vpc_unknown;
    203                 part->label = str_dup("");
    204                 if (part->label == NULL)
    205                         goto error;
    206         }
     230        rc = vol_part_probe(part);
     231        if (rc != EOK)
     232                goto error;
    207233
    208234        list_append(&part->lparts, &vol_parts);
     
    311337}
    312338
    313 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)
    314341{
    315342        int rc;
     
    317344        log_msg(LOG_DEFAULT, LVL_DEBUG, "vol_part_mkfs_part()");
    318345
    319         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);
    320349        if (rc != EOK) {
    321350                log_msg(LOG_DEFAULT, LVL_DEBUG, "vol_part_mkfs_part() - failed %d",
    322351                    rc);
     352                fibril_mutex_unlock(&vol_parts_lock);
    323353                return rc;
    324354        }
    325355
    326         part->pcnt = vpc_fs;
    327         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);
    328368        return EOK;
    329369}
Note: See TracChangeset for help on using the changeset viewer.