Re: PROBLEM: mv command fails: "File exists" on cifs mount on kernel>=5.7.8

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Thanks for your report.

Since commit 9ffad9263b46 ("cifs: Fix the target file was deleted
when rename failed.") want to fix the problem when rename(file1, file2)
with file2 exist, the server return -EACESS, then cifs client will
delete the file2 and rename it again, but 2nd rename on server also
return -EACESS, then the file2 was deleted.

It can be reproduce by xfstests generic/035.
When 't_rename_overwrite file1 file2':
  open(file2)
  rename(file1, file2)
  fstat(file2).st_nlink should be 0.

The solution on commit 9ffad9263b46 ("cifs: Fix the target file was
deleted when rename failed.") was wrong. we should revert it.

The root cause of the file2 deleted maybe the file2 was opened
when rename(file1, file2), I will re-debug it.

在 2020/7/21 1:09, Patrick Fernie 写道:
# One line summary of the problem:

mv command fails: "File exists" on cifs mount on kernel>=5.7.8

# Full description of the problem/report:

Since v5.7.8 (v5.4.51 for -lts), there appears to be a regression with
cifs mounts; mv commands fail with a "File exists" when attempting to
overwrite a file. Similarly, rsync commands which create a temporary
file during transfer and then attempt to move it into place after
copying fail ("File Exists (17)"). I believe this is related to this
commit: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/fs/cifs/inode.c?id=9ffad9263b467efd8f8dc7ae1941a0a655a2bab2

The mount in question is from a Drobo FS NAS device, and is forced to
SMB1 (`vers=1.0` specified).

Running v5.7.7 or 5.4.50 does not exhibit this behavior, behavior was
confirmed on 5.7.8, 5.7.9, 5.4.51 and 5.4.52.

These users appear to be experiencing the same issue:
1) https://serverfault.com/questions/1025734/cifs-automounts-suddenly-stopped-working
2) https://unix.stackexchange.com/questions/599281/cifs-mount-is-returning-errors-when-operating-on-remote-files-file-exists-inte

# Most recent kernel version which did not have the bug:

5.7.7 / 5.4.50

# A small shell script or example program which triggers the problem
(if possible):

[vagrant@archlinux ~]$ uname -a
Linux archlinux 5.7.9-arch1-1 #1 SMP PREEMPT Thu, 16 Jul 2020 19:34:49
+0000 x86_64 GNU/Linux
# Same behavior seen on Linux archlinux 5.4.52-1-lts #1 SMP Thu, 16
Jul 2020 19:35:06 +0000 x86_64 GNU/Linux
[vagrant@archlinux ~]$ cd /mnt/drobo/Share/cifs-test/
[vagrant@archlinux cifs-test]$ touch a b
[vagrant@archlinux cifs-test]$ mv a b
mv: cannot move 'a' to 'b': File exists
[vagrant@archlinux cifs-test]$ mkdir -p /tmp/sync_dir
[vagrant@archlinux cifs-test]$ touch /tmp/sync_dir/foo
[vagrant@archlinux cifs-test]$ rsync -rap /tmp/sync_dir .
[vagrant@archlinux cifs-test]$ touch /tmp/sync_dir/foo
[vagrant@archlinux cifs-test]$ rsync -rap /tmp/sync_dir .
rsync: [receiver] rename
"/mnt/drobo/Share/cifs-test/sync_dir/.foo.FQiit5" -> "sync_dir/foo":
File exists (17)
rsync error: some files/attrs were not transferred (see previous
errors) (code 23) at main.c(1287) [sender=3.2.2]

## Behavior as expected on older kernel:

[vagrant@archlinux ~]$ uname -a
Linux archlinux 5.7.7-arch1-1 #1 SMP PREEMPT Wed, 01 Jul 2020 14:53:16
+0000 x86_64 GNU/Linux
# Same behavior seen on Linux archlinux 5.4.50-1-lts #1 SMP Wed, 01
Jul 2020 14:53:03 +0000 x86_64 GNU/Linux
[vagrant@archlinux ~]$ cd /mnt/drobo/Share/cifs-test/
[vagrant@archlinux cifs-test]$ touch a b
[vagrant@archlinux cifs-test]$ mv a b
[vagrant@archlinux cifs-test]$ mkdir -p /tmp/sync_dir
[vagrant@archlinux cifs-test]$ touch /tmp/sync_dir/foo
[vagrant@archlinux cifs-test]$ rsync -rap /tmp/sync_dir .
[vagrant@archlinux cifs-test]$ touch /tmp/sync_dir/foo
[vagrant@archlinux cifs-test]$ rsync -rap /tmp/sync_dir .
[vagrant@archlinux cifs-test]$

# Environment:

Arch Linux

CIFS mount (vers=1.0) from Drobo FS NAS device

CIFS share mount information:

systemd-1 on /mnt/drobo/Share type autofs
(rw,relatime,fd=44,pgrp=1,timeout=0,minproto=5,maxproto=5,direct,pipe_ino=12139)
//10.76.9.11/Share on /mnt/drobo/Share type cifs
(rw,relatime,vers=1.0,cache=strict,username=XXXXXXX,uid=0,noforceuid,gid=0,noforcegid,addr=10.76.9.11,file_mode=0775,dir_mode=0775,nocase,soft,nounix,serverino,mapposix,nobrl,noperm,rsize=61440,wsize=65536,bsize=1048576,echo_interval=60,actimeo=1,x-systemd.automount)

Regards,
Patrick Fernie

.





[Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux