• Miklos Szeredi's avatar
    vfs: add RENAME_NOREPLACE flag · 0a7c3937
    Miklos Szeredi authored
    If this flag is specified and the target of the rename exists then the
    rename syscall fails with EEXIST.
    The VFS does the existence checking, so it is trivial to enable for most
    local filesystems.  This patch only enables it in ext4.
    For network filesystems the VFS check is not enough as there may be a race
    between a remote create and the rename, so these filesystems need to handle
    this flag in their ->rename() implementations to ensure atomicity.
    Andy writes about why this is useful:
    "The trivial answer: to eliminate the race condition from 'mv -i'.
    Another answer: there's a common pattern to atomically create a file
    with contents: open a temporary file, write to it, optionally fsync
    it, close it, then link(2) it to the final name, then unlink the
    temporary file.
    The reason to use link(2) is because it won't silently clobber the destination.
    This is annoying:
     - It requires an extra system call that shouldn't be necessary.
     - It doesn't work on (IMO sensible) filesystems that don't support
    hard links (e.g. vfat).
     - It's not atomic -- there's an intermediate state where both files exist.
     - It's ugly.
    The new rename flag will make this totally sensible.
    To be fair, on new enough kernels, you can also use O_TMPFILE and
    linkat to achieve the same thing even more cleanly."
    Suggested-by: Andy Lutomirski <luto@amacapital.net> 
    Signed-off-by: default avatarMiklos Szeredi <mszeredi@suse.cz>
    Reviewed-by: default avatarJ. Bruce Fields <bfields@redhat.com>