File system structure difference between cp and mv linux commands

Stephen Samuel samuel at bcgreen.com
Tue Jun 1 14:35:43 UTC 2010


Reading the man page for fsync:
 Calling  fsync()  does not necessarily ensure that the entry in the
directory containing the file has also reached disk.  For that an explicit
fsync() on a file descriptor for the directory is also needed.


The difference between cp and mv is that mv simply adds a directory entry
for the existing file in the destination directory.  If the destination is
on the same filesystem (mount point) then no file data is moved.  The source
directory entry is then deleted.

cp, on the other hand will create a new file, and copy the data into there.

So, with fsync on mv, there is no buffered data to be written.
With fsync on cp, there IS data to be written, and it looks like the
directory entry just happens to get flushed with the file data.

It looks like there MAY be a bit of a bug with fsync not recognizing
buffered data by a different name, but it should be written to recognize it
by inode&device numbers, not name.

On Tue, Jun 1, 2010 at 12:43 AM, Indira ramasamy <vel.indira at gmail.com>wrote:

> Hi,
>
>   I am facing one problem only with mv command not with cp command. I have
> a test program
>
> #include <stdio.h>
> #include <string.h>
> #include <sys/types.h>
> #include <sys/stat.h>
> #include <sys/mount.h>
> #include <fcntl.h>
> #include <errno.h>
>
> int sync_file(char *file)
> {
>     FILE *fp=NULL;
>     int fd;
>
>     printf("file is %s\n",file);
>     fp = fopen(file, "r");
>     if(!fp)
>         return -1;
>
>     fd = fileno(fp);
>     fflush(fp);
>     fsync(fd);
>     ioctl (fd, BLKFLSBUF, 0);
>     fclose(fp);
>     return 0;
>
> }
>
> int main()
> {
>     int len=0;
>     FILE *fp = NULL;
>     char buf[1024];
>     char *fname = "/etc/test.conf";
>     char fname_tmp[129] = "";
>
>
>     len = sprintf(buf, "%s\n", "Newly added Line is there");
>
>     snprintf(fname_tmp, 128, "%s.tmp", fname);
>
>     if( (fp = fopen(fname_tmp,"a")) == NULL )
>         printf(" ERROR: open(), error - %s\n",strerror(errno));
>
>     fprintf(fp,"%s",buf);
>     fflush(fp);
>
>     fsync(fileno(fp));
>     fclose(fp);
>     system("cp -f /etc/test.conf.tmp /etc/test.conf");
>    // system("mv -f /etc/test.conf.tmp /etc/test.conf");
>     sync_file(fname);
>     return 0;
> }
>
> Here i am opening a tmp file for writing. Then i am copying/moving for
> original file. Then i do a fflush, fsync(), ioctl() to the original file.
> Then i run this binary in linux machine(ext2 file system, 2.6.23.5 kernel)
> after that immediately  power off the machine. Then power on machine, the
> file is disappeared or written data lost or file gets corrupted if i move
> the tmp file to the original file. And there is a no problem if i copy the
> tmp file to original file. So i want to know the difference between the cp
> and mv command. Can you please give me suggestion on it?
>
> Thanks,
> Indira.
>
> _______________________________________________
> Ext3-users mailing list
> Ext3-users at redhat.com
> https://www.redhat.com/mailman/listinfo/ext3-users
>



-- 
Stephen Samuel http://www.bcgreen.com  Software, like love,
778-861-7641                              grows when you give it away
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://listman.redhat.com/archives/ext3-users/attachments/20100601/8750cdad/attachment.htm>


More information about the Ext3-users mailing list