From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-qk0-f180.google.com ([209.85.220.180]:32785 "EHLO mail-qk0-f180.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755231AbcIMRsf (ORCPT ); Tue, 13 Sep 2016 13:48:35 -0400 Received: by mail-qk0-f180.google.com with SMTP id w204so183266347qka.0 for ; Tue, 13 Sep 2016 10:48:34 -0700 (PDT) From: Mikhail Afanasyev Subject: ovl: renames in overlayfs over tmpfs returns ESTALE in 4.4 To: Greg Kroah-Hartman , Miklos Szeredi Cc: Stefan Bader , stable@vger.kernel.org Message-ID: <6ac370bf-3537-0c3e-97d5-f67ece5c7bf2@tri.global> Date: Tue, 13 Sep 2016 13:48:31 -0400 MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit Sender: stable-owner@vger.kernel.org List-ID: Hello, I believe the 4.4.y kernel has broken overlayfs: removing the file which is present in lower layer, then renaming a file from upper layer to have the same name fails with ESTALE. This pattern is used quite often, for example by 'depmod' and 'apt-get update'. The bug only seems to happen when some of the underlying directories are on tmpfs. The test script (below) works fine on Ubuntu kernel 4.4.0-34-generic or earlier, and it fails in Ubuntu kernel 4.4.0-36-generic. This corresponds to Linux 4.4.16. The error is: mv: cannot move 'ovf/file.new' to 'ovf/file': Stale file handle While I have not performed the full bisect, there were only 3 patches touching 'fs/overlayfs' which went into the tree between the two revisions: https://git.launchpad.net/~ubuntu-kernel/ubuntu/+source/linux/+git/xenial/log/?id=b275624b3b4303d21eefd78c5b3bf04c34267e4e ovl: verify upper dentry before unlink and rename https://git.launchpad.net/~ubuntu-kernel/ubuntu/+source/linux/+git/xenial/commit/?id=a4452ab01db4780937d4e19861d3b841c373c3b5 ovl: verify upper dentry in ovl_remove_and_whiteout() https://git.launchpad.net/~ubuntu-kernel/ubuntu/+source/linux/+git/xenial/commit/?id=90089541cf2982cff69724c34f7ae9a088df9c2f ovl: Copy up underlying inode's ->i_mode to overlay inode https://git.launchpad.net/~ubuntu-kernel/ubuntu/+source/linux/+git/xenial/commit/?id=8326f3ef42b56d97d1060adff6d4ab35818e3b9a Of them, the first two add a return with ESTALE error and would be the prime suspects. I also understand that 4.4.16 is a somewhat old kernel, but I believe the bug may still be present in the latest linux-4.4.y -- there were no changes to the relevant file (fs/overlayfs/dir.c) since these patches. Mikhail Afanasyev ~~~~~~~~ TEST SCRIPT ~~~~~~ #!/bin/sh -ex mkdir -p /tmp/ovf-bug-demo cd /tmp/ovf-bug-demo umount ./tmpfs/ovf || true umount ./tmpfs || true mkdir -p tmpfs mount -t tmpfs none tmpfs cd tmpfs mkdir -p upper lower ovf work touch lower/file mount -t overlayfs none -o rw,noatime,lowerdir=$PWD/lower,upperdir=$PWD/upper,workdir=$PWD/work $PWD/ovf touch ovf/file.new rm ovf/file mv ovf/file.new ovf/file ~~~~~~~~~ END ~~~~~~~~~~~~