ovl: fix WARN_ON nlink drop to zero
authorMiklos Szeredi <mszeredi@redhat.com>
Fri, 27 Mar 2020 15:51:02 +0000 (16:51 +0100)
committerMiklos Szeredi <mszeredi@redhat.com>
Fri, 27 Mar 2020 15:51:02 +0000 (16:51 +0100)
commit83552eacdfc06378b0993a3705833c1fd0aead4b
tree214cff1823d473697c1c56d7224987ab45295fd4
parenta5a84682ecb67e74d1f265d1634c146c990e0e4f
ovl: fix WARN_ON nlink drop to zero

Changes to underlying layers should not cause WARN_ON(), but this repro
does:

 mkdir w l u mnt
 sudo mount -t overlay -o workdir=w,lowerdir=l,upperdir=u overlay mnt
 touch mnt/h
 ln u/h u/k
 rm -rf mnt/k
 rm -rf mnt/h
 dmesg

 ------------[ cut here ]------------
 WARNING: CPU: 1 PID: 116244 at fs/inode.c:302 drop_nlink+0x28/0x40

After upper hardlinks were added while overlay is mounted, unlinking all
overlay hardlinks drops overlay nlink to zero before all upper inodes
are unlinked.

After unlink/rename prevent i_nlink from going to zero if there are still
hashed aliases (i.e. cached hard links to the victim) remaining.

Reported-by: Phasip <phasip@gmail.com>
Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
fs/overlayfs/dir.c