Changeset 12cbf25e in mainline


Ignore:
Timestamp:
2024-08-31T13:09:16Z (9 months ago)
Author:
Miroslav Cimerman <mc@…>
Children:
a8b2d9e7
Parents:
da5c257
Message:

hr: disk size checking

Location:
uspace/srv/bd/hr
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/bd/hr/raid1.c

    rda5c257 r12cbf25e  
    3434 */
    3535
    36 #include <async.h>
    3736#include <bd_srv.h>
    3837#include <block.h>
     
    146145        hr_volume_t *vol = bd->srvs->sarg;
    147146
    148         return block_get_bsize(vol->devs[0], rsize);
     147        *rsize = vol->bsize;
     148        return EOK;
    149149}
    150150
     
    153153        hr_volume_t *vol = bd->srvs->sarg;
    154154
    155         return block_get_nblocks(vol->devs[0], rnb);
     155        *rnb = vol->nblocks;
     156        return EOK;
    156157}
    157158
     
    160161        assert(new_volume->level == hr_l_1);
    161162
    162         errno_t rc;
     163        if (new_volume->dev_no < 2) {
     164                log_msg(LOG_DEFAULT, LVL_ERROR,
     165                    "RAID 1 array needs at least 2 devices");
     166                return EINVAL;
     167        }
     168
     169        errno_t rc;
     170        size_t i, bsize, last_bsize;
     171        uint64_t nblocks, last_nblocks;
     172        uint64_t total_blocks = 0;
    163173
    164174        rc = hr_init_devs(new_volume);
     
    166176                return rc;
    167177
     178        for (i = 0; i < new_volume->dev_no; i++) {
     179                rc = block_get_nblocks(new_volume->devs[i], &nblocks);
     180                if (rc != EOK)
     181                        goto error;
     182                if (i != 0 && nblocks != last_nblocks) {
     183                        log_msg(LOG_DEFAULT, LVL_ERROR,
     184                            "number of blocks differs");
     185                        rc = EINVAL;
     186                        goto error;
     187                }
     188                total_blocks += nblocks;
     189                last_nblocks = nblocks;
     190        }
     191
     192        for (i = 0; i < new_volume->dev_no; i++) {
     193                rc = block_get_bsize(new_volume->devs[i], &bsize);
     194                if (rc != EOK)
     195                        goto error;
     196                if (i != 0 && bsize != last_bsize) {
     197                        log_msg(LOG_DEFAULT, LVL_ERROR, "block sizes differ");
     198                        rc = EINVAL;
     199                        goto error;
     200                }
     201                last_bsize = bsize;
     202        }
     203
    168204        bd_srvs_init(&new_volume->hr_bds);
    169205        new_volume->hr_bds.ops = &hr_raid1_bd_ops;
    170206        new_volume->hr_bds.sarg = new_volume;
     207        new_volume->nblocks = total_blocks / new_volume->dev_no;
     208        new_volume->bsize = bsize;
    171209
    172210        rc = hr_register_volume(new_volume);
    173         if (rc != EOK) {
    174                 hr_fini_devs(new_volume);
    175                 return rc;
    176         }
    177 
    178         return EOK;
     211        if (rc != EOK)
     212                goto error;
     213
     214        return EOK;
     215error:
     216        hr_fini_devs(new_volume);
     217        return rc;
    179218}
    180219
  • uspace/srv/bd/hr/var.h

    rda5c257 r12cbf25e  
    5555        char *devname;
    5656        service_id_t *devs;
     57        uint64_t nblocks;
     58        size_t bsize;
    5759        service_id_t svc_id;
    5860        size_t dev_no;
Note: See TracChangeset for help on using the changeset viewer.