[Linuxtrent] Re: appello agli esperti perl

  • From: Flavio Stanchina <flavio@xxxxxxxxxxxxx>
  • To: linuxtrent@xxxxxxxxxxxxx
  • Date: Mon, 27 Oct 2014 17:34:02 +0100

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, &copy_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.

--
Ciao, Flavio
--
Per iscriversi  (o disiscriversi), basta spedire un  messaggio con OGGETTO
"subscribe" (o "unsubscribe") a mailto:linuxtrent-request@xxxxxxxxxxxxx


Other related posts: