On 27/10/14 17:34, Flavio Stanchina wrote: > On 27/10/2014 17:12, > Antonio Galea <antonio.galea@xxxxxxxxx> wrote: >> Il fatto che tu abbia trovato problemi solo su mv e non su cp è un >> puro caso. Su Linux mv è implementata come una copy(src,dest) seguita >> da rm(src). Questo è il mv di coreutils per Debian Wheezy (il >> pacchetto upstream è quello di GNU e viene usato praticamente >> ovunque): >> >> http://sources.debian.net/src/coreutils/8.13-3.5/src/mv.c/#L161 >> > > O hai bevuto tu, o ha bevuto (tanto) chi ha architettato una cosa del > genere! :D > > Sullo stesso filesystem, lo spostamento avviene sicuramente con rename() > che tra l'altro è atomica. Ci sono milioni di applicazioni che dipendono > da questo per fare varie cose in modo efficiente e sicuro. Immagina > quali sarebbero le prestazioni spostando un file sostanzioso con copia + > cancellazione, specie su un disco tradizionale con la testina che > saltella di qua e di là per spostare byte. E poi, per fare un'operazione > del genere avresti bisogno di spazio libero per due copie del file. > > Guarda questa riga: > > bool ok = copy (source, dest, false, x, ©_into_self, > &rename_succeeded); > > Vedi quel flag 'rename_succeeded'? Non sono andato a cercare i sorgenti > della funzione copy() perché non è nel file che hai linkato (e non è una > funzione di sistema, mentre rename() sì), ma sono assolutamente sicuro > che provi a fare rename(source, dest) e solo se quest'ultima fallisce > con l'errore EXDEV si mette a fare una copia byte per byte. Ero perplesso anche io, e sono andato a controllare :) La definizione di copy() sta qui: http://sources.debian.net/src/coreutils/8.13-3.5/src/copy.c/ e funziona come previsto. Ciao, Daniele -- Per iscriversi (o disiscriversi), basta spedire un messaggio con OGGETTO "subscribe" (o "unsubscribe") a mailto:linuxtrent-request@xxxxxxxxxxxxx