Fork us on GitHub Follow us on Facebook Follow us on Twitter

Changeset 0a201454 in mainline


Ignore:
Timestamp:
2019-10-07T11:21:27Z (13 months ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
master
Children:
3106054
Parents:
5667dca
git-author:
Jiri Svoboda <jiri@…> (2019-10-06 11:19:48)
git-committer:
Jiri Svoboda <jiri@…> (2019-10-07 11:21:27)
Message:

Volsrv should not use zero as a valid reference count

Volume server allows the reference count for a valid volume with
persistent configuration to be zero, but refcnt did not expect that
and increasing refcount up from zero tripped assertion in the same_twice
test. The solution is to add one extra reference to persistent volumes
and have zero reference count always mean the volume can be freed.

File:
1 edited

Legend:

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

    r5667dca r0a201454  
    367367        if (refcount_down(&volume->refcnt)) {
    368368                /* No more references. Check if volume is persistent. */
    369                 if (!vol_volume_is_persist(volume)) {
    370                         list_remove(&volume->lvolumes);
    371                         vol_volume_delete(volume);
    372                 }
     369                list_remove(&volume->lvolumes);
     370                vol_volume_delete(volume);
    373371        }
    374372}
     
    399397                /* Volume is now persistent */
    400398                if (volume->nvolume == NULL) {
     399                        /* Prevent volume from being freed */
     400                        refcount_up(&volume->refcnt);
     401
    401402                        /* Create volume node */
    402403                        rc = sif_trans_begin(volume->volumes->repo, &trans);
     
    426427                        volume->nvolume = nvolume;
    427428                } else {
     429                        /* Allow volume to be freed */
     430                        vol_volume_del_ref(volume);
     431
    428432                        /* Update volume node */
    429433                        rc = sif_trans_begin(volume->volumes->repo, &trans);
Note: See TracChangeset for help on using the changeset viewer.