[Linuxtrent] Re: appello agli esperti perl

  • From: Daniele Nicolodi <daniele@xxxxxxxxxx>
  • To: linuxtrent@xxxxxxxxxxxxx
  • Date: Mon, 27 Oct 2014 17:40:37 +0100

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

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


Other related posts: