@ -307,34 +307,33 @@ static int z_erofs_attach_page(struct z_erofs_collector *clt,
return ret ? 0 : - EAGAIN ;
}
static enum z_erofs_collectmode
try_to_claim_pcluster ( struct z_erofs_pcluster * pcl ,
z_erofs_next_pcluster_t * owned_head )
static void z_erofs_try_to_claim_pcluster ( struct z_erofs_collector * clt )
{
/* let's claim these following types of pclusters */
retry :
if ( pcl - > next = = Z_EROFS_PCLUSTER_NIL ) {
/* type 1, nil pcluster */
if ( cmpxchg ( & pcl - > next , Z_EROFS_PCLUSTER_NIL ,
* owned_head ) ! = Z_EROFS_PCLUSTER_NIL )
goto retry ;
struct z_erofs_pcluster * pcl = clt - > pcl ;
z_erofs_next_pcluster_t * owned_head = & clt - > owned_head ;
/* type 1, nil pcluster (this pcluster doesn't belong to any chain.) */
if ( cmpxchg ( & pcl - > next , Z_EROFS_PCLUSTER_NIL ,
* owned_head ) = = Z_EROFS_PCLUSTER_NIL ) {
* owned_head = & pcl - > next ;
/* lucky, I am the followee :) */
return COLLECT_PRIMARY_FOLLOWED ;
} else if ( pcl - > next = = Z_EROFS_PCLUSTER_TAIL ) {
/*
* type 2 , link to the end of a existing open chain ,
* be careful that its submission itself is governed
* by the original owned chain .
*/
if ( cmpxchg ( & pcl - > next , Z_EROFS_PCLUSTER_TAIL ,
* owned_head ) ! = Z_EROFS_PCLUSTER_TAIL )
goto retry ;
/* so we can attach this pcluster to our submission chain. */
clt - > mode = COLLECT_PRIMARY_FOLLOWED ;
return ;
}
/*
* type 2 , link to the end of an existing open chain , be careful
* that its submission is controlled by the original attached chain .
*/
if ( cmpxchg ( & pcl - > next , Z_EROFS_PCLUSTER_TAIL ,
* owned_head ) = = Z_EROFS_PCLUSTER_TAIL ) {
* owned_head = Z_EROFS_PCLUSTER_TAIL ;
return COLLECT_PRIMARY_HOOKED ;
clt - > mode = COLLECT_PRIMARY_HOOKED ;
clt - > tailpcl = NULL ;
return ;
}
return COLLECT_PRIMARY ; /* :( better luck next time */
/* type 3, it belongs to a chain, but it isn't the end of the chain */
clt - > mode = COLLECT_PRIMARY ;
}
static int z_erofs_lookup_collection ( struct z_erofs_collector * clt ,
@ -387,10 +386,8 @@ static int z_erofs_lookup_collection(struct z_erofs_collector *clt,
/* used to check tail merging loop due to corrupted images */
if ( clt - > owned_head = = Z_EROFS_PCLUSTER_TAIL )
clt - > tailpcl = pcl ;
clt - > mode = try_to_claim_pcluster ( pcl , & clt - > owned_head ) ;
/* clean tailpcl if the current owned_head is Z_EROFS_PCLUSTER_TAIL */
if ( clt - > owned_head = = Z_EROFS_PCLUSTER_TAIL )
clt - > tailpcl = NULL ;
clt - > pcl = pcl ;
z_erofs_try_to_claim_pcluster ( clt ) ;
clt - > pcl = pcl ;
clt - > cl = cl ;
return 0 ;