Changeset d082801 in mainline for uspace/srv/bd/hr/hr.c


Ignore:
Timestamp:
2025-03-29T14:04:37Z (4 months ago)
Author:
Miroslav Cimerman <mc@…>
Children:
746e636
Parents:
1a28518
Message:

hr: refactor manual assembly

File:
1 edited

Legend:

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

    r1a28518 rd082801  
    7979
    8080        if (size != sizeof(size_t)) {
     81                async_answer_0(&call, EINVAL);
    8182                async_answer_0(icall, EINVAL);
    8283                return;
    8384        }
    8485
    85         rc = hr_util_try_auto_assemble(&assembled_cnt);
    86         if (rc != EOK) {
    87                 async_answer_0(&call, rc);
    88                 async_answer_0(icall, rc);
    89                 return;
    90         }
     86        rc = hr_util_try_assemble(NULL, &assembled_cnt);
     87        if (rc != EOK)
     88                goto error;
    9189
    9290        rc = async_data_read_finalize(&call, &assembled_cnt, size);
    93         if (rc != EOK) {
    94                 async_answer_0(&call, rc);
    95                 async_answer_0(icall, rc);
    96                 return;
    97         }
     91        if (rc != EOK)
     92                goto error;
    9893
    9994        async_answer_0(icall, EOK);
    100 }
    101 
    102 static void hr_create_srv(ipc_call_t *icall, bool assemble)
     95        return;
     96error:
     97        async_answer_0(&call, rc);
     98        async_answer_0(icall, rc);
     99}
     100
     101static void hr_assemble_srv(ipc_call_t *icall)
     102{
     103        HR_DEBUG("%s()", __func__);
     104
     105        errno_t rc;
     106        size_t size, assembled_cnt;
     107        hr_config_t *cfg;
     108        ipc_call_t call;
     109
     110        if (!async_data_write_receive(&call, &size)) {
     111                async_answer_0(&call, EREFUSED);
     112                async_answer_0(icall, EREFUSED);
     113                return;
     114        }
     115
     116        if (size != sizeof(hr_config_t)) {
     117                async_answer_0(&call, EINVAL);
     118                async_answer_0(icall, EINVAL);
     119                return;
     120        }
     121
     122        cfg = calloc(1, sizeof(hr_config_t));
     123        if (cfg == NULL) {
     124                async_answer_0(&call, ENOMEM);
     125                async_answer_0(icall, ENOMEM);
     126                return;
     127        }
     128
     129        rc = async_data_write_finalize(&call, cfg, size);
     130        if (rc != EOK)
     131                goto error;
     132
     133        if (!async_data_read_receive(&call, &size)) {
     134                async_answer_0(icall, EREFUSED);
     135                return;
     136        }
     137
     138        if (size != sizeof(size_t)) {
     139                async_answer_0(icall, EINVAL);
     140                return;
     141        }
     142
     143        rc = hr_util_try_assemble(cfg, &assembled_cnt);
     144        if (rc != EOK)
     145                goto error;
     146
     147        rc = async_data_read_finalize(&call, &assembled_cnt, size);
     148        if (rc != EOK)
     149                goto error;
     150
     151        free(cfg);
     152        async_answer_0(icall, EOK);
     153        return;
     154error:
     155        free(cfg);
     156        async_answer_0(&call, rc);
     157        async_answer_0(icall, rc);
     158}
     159
     160static void hr_create_srv(ipc_call_t *icall)
    103161{
    104162        HR_DEBUG("%s()", __func__);
     
    141199         * for creation of a new array, abort
    142200         */
    143         if (!assemble) {
    144                 for (i = 0; i < cfg->dev_no; i++) {
    145                         if (cfg->devs[i] == 0) {
    146                                 /*
    147                                  * XXX: own error codes, no need to log this...
    148                                  * its user error not service error
    149                                  */
    150                                 HR_ERROR("missing device provided for array "
    151                                     "creation, aborting");
    152                                 free(cfg);
    153                                 async_answer_0(icall, EINVAL);
    154                                 return;
    155                         }
     201        for (i = 0; i < cfg->dev_no; i++) {
     202                if (cfg->devs[i] == 0) {
     203                        /*
     204                         * XXX: own error codes, no need to log this...
     205                         * its user error not service error
     206                         */
     207                        HR_ERROR("missing device provided for array "
     208                            "creation, aborting");
     209                        free(cfg);
     210                        async_answer_0(icall, EINVAL);
     211                        return;
    156212                }
    157213        }
     
    170226        new_volume->extent_no = cfg->dev_no;
    171227
     228        /* XXX: do proper initing ... */
    172229        rc = hr_init_devs(new_volume);
    173230        if (rc != EOK) {
     
    178235        }
    179236
    180         if (assemble) {
    181                 if (cfg->level != HR_LVL_UNKNOWN)
    182                         HR_DEBUG("level manually set when assembling, ingoring");
    183                 new_volume->level = HR_LVL_UNKNOWN;
    184         }
    185 
    186         if (assemble) {
    187                 /* just bsize needed for reading metadata later */
    188                 rc = hr_check_devs(new_volume, NULL, &new_volume->bsize);
    189                 if (rc != EOK)
    190                         goto error;
    191 
    192                 rc = hr_fill_vol_from_meta(new_volume);
    193                 if (rc != EOK)
    194                         goto error;
    195         }
    196 
    197         if (!assemble) {
    198                 new_volume->hr_ops.init(new_volume);
    199                 if (rc != EOK)
    200                         goto error;
    201 
    202                 rc = hr_write_meta_to_vol(new_volume);
    203                 if (rc != EOK)
    204                         goto error;
    205         }
     237        new_volume->hr_ops.init(new_volume);
     238        if (rc != EOK)
     239                goto error;
     240
     241        rc = hr_write_meta_to_vol(new_volume);
     242        if (rc != EOK)
     243                goto error;
    206244
    207245        rc = new_volume->hr_ops.create(new_volume);
     
    217255        fibril_rwlock_write_unlock(&hr_volumes_lock);
    218256
    219         if (assemble) {
    220                 HR_DEBUG("assembled volume \"%s\" (%" PRIun ")\n",
    221                     new_volume->devname, new_volume->svc_id);
    222         } else {
    223                 HR_DEBUG("created volume \"%s\" (%" PRIun ")\n",
    224                     new_volume->devname, new_volume->svc_id);
    225         }
     257        HR_DEBUG("created volume \"%s\" (%" PRIun ")\n", new_volume->devname,
     258            new_volume->svc_id);
    226259
    227260        free(cfg);
     
    390423                switch (method) {
    391424                case HR_CREATE:
    392                         hr_create_srv(&call, false);
     425                        hr_create_srv(&call);
    393426                        break;
    394427                case HR_ASSEMBLE:
    395                         hr_create_srv(&call, true);
     428                        hr_assemble_srv(&call);
    396429                        break;
    397430                case HR_AUTO_ASSEMBLE:
Note: See TracChangeset for help on using the changeset viewer.