
Bcachefs è appena rientrato nei cicli di sviluppo del Kernel Linux dopo la sospensione imposta dal Code Of Conduct al suo sviluppatore Kern Overstreet, che è già tempo per una nuova e accesissima disputa su una questione apparentemente di poca rilevanza: i filesystem che non considerano differenze di case, ossia maiuscole e minuscole, nei nomi file e cartelle.
La discussione coinvolge il manutentore di Bcachefs, Overstreet, e niente meno che Linus Torvalds in persona, ed un utente di Slashdot ha pensato bene di riassumere il dialogo che è tristemente divertente da leggere e di cui riportiamo le fasi salienti:
Torvalds: I nomi di file case-insensitive sono un errore gravissimo, non avresti mai dovuto implementarli. Il problema non è stata la mancanza di test, ma l’introduzione degli stessi in primo luogo. E cercare poi di “farlo bene” ha solo peggiorato tutto, perché non esiste un “modo giusto” di farlo: tentare di sistemarlo finisce per attribuire significati magici a sequenze di byte casuali […] il filesystem, fatto coi piedi, finisce comunque per farlo corrispondere. Perché chi implementa la case insensitivity INVARIABILMENTE fa cavolate tipo ignorare i caratteri non stampabili, e così “case insensitive” diventa anche “insensibile ad altre cose […] Dannazione. La sensibilità al case è un BUG. Non riesco a capire come ci sia ancora gente che lavora sui filesystem e pensa che sia una feature. È come se venerassero ancora il vecchio filesystem FAT al punto da volerlo ricreare — ma male.
Qui c’è la prima provocazione di Torvalds, il quale nella sostanza spiega come molti utenti non si aspettano che document.txt
e Document.txt
siano due file diversi! E quindi dal punto di vista dell’esperienza utente, la sensibilità al case può sembrare un bug, perché porta a errori difficili da capire e risolvere. Ovviamente da qui la discussione si accende:
Overstreet: Esiste una “necessità riconosciuta” per avere directory case-insensitive. (Quindi non voglio sentire lamentele su quanto “fanno schifo”. Io voglio che funzionino, che il codice sia pulito, mantenibile e che non mi faccia sanguinare gli occhi ogni volta che devo fare debug.)
Torvalds: Il motivo per cui abbiamo separato quel codice è semplice: se un giorno chi lavora sui filesystem si illuminerà e implementerà una vera e ben progettata case insensitivity, allora potremmo ripensarci. Ma non ho mai visto nemmeno una vaga traccia di questo. Ho visto solo codice scadente che non capisce né come funziona UTF-8, né tantomeno come funziona Unicode (o meglio: come non funziona — gente che usa funzioni di confronto Unicode senza la minima idea delle implicazioni).
Overstreet: Visto che non spieghi come secondo te i filesystem sbagliano, quello che stai facendo è solo parlare a vanvera. Io non ho visto nulla di rotto nella gestione della case insensitivity. E onestamente non penso che i problemi di sicurezza siano più rilevanti, visto che ci stiamo progressivamente allontanando da directory condivise tra utenti diversi — tipo /tmp
— perché hanno già causato abbastanza guai da sole…
Torvalds: Il punto è che non puoi assolutamente rendere la ricerca case-insensitive il percorso veloce…
Overstreet: È esattamente quello che fa il codice della dcache, ed è proprio lì che stanno i problemi…
Il punto di Torvalds, è semplice: in un filesystem (e in particolare nel meccanismo della dcache di Linux, che serve a velocizzare l’accesso ai file), la ricerca dei file deve essere il più veloce possibile. La ricerca “normale”, cioè quella case-sensitive (dove file.txt
e File.txt
sono due file diversi), è semplice: basta confrontare le stringhe byte per byte senza fare trasformazioni o conversioni strane.
Per un filesystem case-insensitive (dove file.txt
e File.txt
sarebbero visti come lo stesso file), il confronto dei nomi diventa molto più complicato:
- Devi normalizzare i caratteri (gestire maiuscole/minuscole correttamente).
- Devi tener conto delle regole Unicode (che sono estremamente complesse).
- E, come se non bastasse, tutto questo costa tanti cicli CPU in più.
Da qui le cose, per così dire, “vanno a sud”:
Torvalds: Credo che tu sia confuso e non sappia di cosa stai parlando. Faresti meglio ad andare a studiare come funziona davvero la dcache.
Overstreet: No, quello che ho scritto descrive esattamente come funzionano le ricerche case-insensitive nella dcache. Vai a vedere.
Torvalds: Kent, guarda che io ho scritto la maggior parte di quel codice, e ora tu sostieni che la gestione case-insensitive sia stata pensata come percorso veloce…
Overstreet: Si sta parlando di ricerche case-insensitive, e giuro che mi mangerò una scarpa se sei stato tu a scriverlo… Stai facendo finta di non capire? Sto dicendo che la gestione case-insensitive è una combinazione di overengineering e cattiva progettazione. Non sto dicendo che sia più veloce delle ricerche case-sensitive, sarebbe una follia.
Torvalds: Prepara la scarpa. Quel codice schifoso con d_compare
e d_hash
risale ai tempi andati. A occhio direi al 1997, ed è stato integrato nella versione 2.1.50… Se ti ritrovi con alias nei dentry, probabilmente stai facendo qualcosa di sbagliato.
Overstreet: Sì, Al mi ha appena fatto notare generic_set_sb_d_ops()
… E tu non hai notato che le critiche che facevo alla dcache non avevano senso, perché in realtà il funzionamento che descrivevo era proprio quello reale? Ahah.
Torvalds: Questo è un modo molto buffo per dire: “Oh, Linus, avevi ragione fin dall’inizio quando hai smascherato le sciocchezze che stavo dicendo”…
E la questione, per così dire, finisce qui, anche se in realtà sta ancora proseguendo nel thread originale e chissà come andrà a finire per davvero.
La speranza di tutti è che non si finisca (ancora) a colpi di Code Of Conduct.
Da sempre appassionato del mondo open-source e di Linux nel 2009 ho fondato il portale Mia Mamma Usa Linux! per condividere articoli, notizie ed in generale tutto quello che riguarda il mondo del pinguino, con particolare attenzione alle tematiche di interoperabilità, HA e cloud.
E, sì, mia mamma usa Linux dal 2009.
Lascia un commento