El size te dice hasta dónde hay datos que "tienen sentido", independiente que puedan estar en uso o no (para eso está el atributo used).
Suponete que cada bloque tiene 512B, cada dir_entry ocupa 64B y tenés:
• size: 1088 (o sea, 1088/64 = 17 dir_entries válidos — no necesariamente con used = true)
• tope: 3 (tenés dos bloques "llenos" de dir_entries, y un bloque más donde solo un dir_entry es válido)
Vos sabés (porque lo dijeron los profesores varias veces) que en las evaluaciones podés asumir que cada bloque que se va a usar para dir_entries ya se inicializa con todos los dir_entries que quepan, y todos con used = false (sin esa hipótesis, sería inválido usar tope para iterar un bloque "a medio llenar"). Según size iterás hasta el dir_entry 17 y terminaste, pero si iterás usando tope vas a iterar 24 veces, 7 de ellas al santo cuete porque más allá del size sabés que no puede haber dir_entries usados.
Saludos