The main problem is that $actions accepts the whole anchor tag for the link and get_delete_post_link function outputs just the url.
So if You are just looking to replace the label “Trash” then you can use the post_row_actions filter hook with a simple function
Something like this
add_filter( 'post_row_actions','my_action_row', 10, 2 );
function my_action_row( $actions, $post ){
if ($post->post_type =="visitor"){
//remove what you don't need
unset( $actions['inline hide-if-no-js'] );
unset( $actions['trash'] );
unset( $actions['view'] );
//check capabilites
$post_type_object = get_post_type_object( $post->post_type );
if ( !$post_type_object ) return;
if ( !current_user_can( $post_type_object->cap->delete_post, $post->ID ) ) return;
//the get the meta and check
$state = get_post_meta( $post->ID, 'v_state', true );
if ($state == 'in'){
$actions['trash'] = "<a class="submitdelete" title="" . esc_attr(__("Delete this item permanently')) . "' href="https://wordpress.stackexchange.com/questions/8481/" . get_delete_post_link($post->ID,"', true) . "'>" . __('Logout') . "</a>";
}else{
$actions['trash'] = "<a class="submitdelete" title="" . esc_attr(__("Delete this item permanently')) . "' href="https://wordpress.stackexchange.com/questions/8481/" . get_delete_post_link($post->ID,"', true) . "'>" . __('Login') . "</a>";
}
}
return $actions;
}
This will generate a logout if the meta is “IN” and login if other wise but both links will delete the post. and i would add a check to see if the post is already in the trash.
But its a start and i hope it helps.