Changeset dcdb990 in mainline


Ignore:
Timestamp:
2025-06-30T17:14:01Z (3 weeks ago)
Author:
Miroslav Cimerman <mc@…>
Children:
996d31ac
Parents:
d04a350
Message:

hr: metadata/md: have to take rebuild into account

Even if not allowing rebuild operation to happen,
we still must take rebuilt extents into account,
because writes below the resync_offset must be
done like in ONLINE state.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/bd/hr/metadata/foreign/md/hr_md.c

    rd04a350 rdcdb990  
    194194                return ENOMEM;
    195195
     196        bool rebuild_set = false;
    196197        size_t i = 0;
    197198        list_foreach(*list, link, struct dev_list_member, iter) {
     
    208209
    209210                bool invalidate = false;
     211                bool rebuild_this_ext = false;
    210212
    211213                if (iter_meta->events != max_events)
    212214                        invalidate = true;
    213215
    214                 if (iter_meta->feature_map & MD_DISK_SYNC)
    215                         invalidate = true;
    216 
    217                 if (!invalidate)
     216                if (iter_meta->feature_map & MD_DISK_SYNC && !invalidate) {
     217                        if (rebuild_set) {
     218                                HR_DEBUG("only 1 rebuilt extent allowed");
     219                                rc = EINVAL;
     220                                goto error;
     221                        }
     222                        rebuild_set = true;
     223                        rebuild_this_ext = true;
     224                        vol->rebuild_blk = iter_meta->resync_offset;
     225                }
     226
     227                if (!rebuild_this_ext && !invalidate)
    218228                        vol->extents[index].state = HR_EXT_ONLINE;
     229                else if (rebuild_this_ext && !invalidate)
     230                        vol->extents[index].state = HR_EXT_REBUILD;
    219231                else
    220232                        vol->extents[index].state = HR_EXT_INVALID;
     
    230242        }
    231243
     244error:
    232245        return rc;
    233246}
     
    506519
    507520        md->feature_map = uint32_t_le2host(md->feature_map);
    508         /* XXX: do not even support MD_DISK_SYNC here */
    509         if (md->feature_map != 0x0) {
     521        if (md->feature_map != 0x0 && md->feature_map != MD_DISK_SYNC) {
    510522                HR_DEBUG("unsupported feature map bits\n");
    511523                rc = EINVAL;
Note: See TracChangeset for help on using the changeset viewer.