Barcelona strengthened their grip on top spot with a 2-1 victory over Villarreal, as Real Madrid were held to a 2-2 draw by Osasuna.