* unlink(nonexistent): EROFS or ENOENT? @ 2011-05-29 16:08 Michael Tokarev 2011-05-29 16:14 ` Michael Tokarev 2011-06-06 3:39 ` Ted Ts'o 0 siblings, 2 replies; 7+ messages in thread From: Michael Tokarev @ 2011-05-29 16:08 UTC (permalink / raw) To: Linux-kernel, linux-fsdevel Hello. Just noticed that at least on ext4, unlinking a non-existing file from a read-only filesystem results in EROFS instead of ENOENT. I'd expect it return ENOENT - it is more logical, at least in my opinion. For one, (readonly) NFS mount returns ENOENT in this case. Thanks! /mjt ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: unlink(nonexistent): EROFS or ENOENT? 2011-05-29 16:08 unlink(nonexistent): EROFS or ENOENT? Michael Tokarev @ 2011-05-29 16:14 ` Michael Tokarev 2011-06-06 3:39 ` Ted Ts'o 1 sibling, 0 replies; 7+ messages in thread From: Michael Tokarev @ 2011-05-29 16:14 UTC (permalink / raw) To: Linux-kernel, linux-fsdevel 29.05.2011 20:08, Michael Tokarev пишет: > Hello. > > Just noticed that at least on ext4, unlinking a > non-existing file from a read-only filesystem > results in EROFS instead of ENOENT. I'd expect > it return ENOENT - it is more logical, at least > in my opinion. http://pubs.opengroup.org/onlinepubs/009695399/functions/unlink.html this case is quite clear: [EROFS] The directory entry to be unlinked is part of a read-only file system Ie, the entry is a _part_ of a file system, so it should be _existing_ entry to start with. > For one, (readonly) NFS mount returns ENOENT in > this case. > > Thanks! /mjt ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: unlink(nonexistent): EROFS or ENOENT? 2011-05-29 16:08 unlink(nonexistent): EROFS or ENOENT? Michael Tokarev 2011-05-29 16:14 ` Michael Tokarev @ 2011-06-06 3:39 ` Ted Ts'o 2011-06-06 17:13 ` Michael Tokarev 1 sibling, 1 reply; 7+ messages in thread From: Ted Ts'o @ 2011-06-06 3:39 UTC (permalink / raw) To: Michael Tokarev; +Cc: Linux-kernel, linux-fsdevel On Sun, May 29, 2011 at 08:08:55PM +0400, Michael Tokarev wrote: > Hello. > > Just noticed that at least on ext4, unlinking a > non-existing file from a read-only filesystem > results in EROFS instead of ENOENT. I'd expect > it return ENOENT - it is more logical, at least > in my opinion. > > For one, (readonly) NFS mount returns ENOENT in > this case. Um, it doesn't for me. Testing on v3.0-rc1: # ls /test/foo; rm /test/foo ls: cannot access /test/foo: No such file or directory rm: cannot remove `/test/foo': No such file or directory # ls /test/null; rm /test/null /test/null rm: cannot remove `/test/null': Read-only file system # grep test /proc/mounts /dev/vdb /test ext4 ro,relatime,user_xattr,barrier=1,data=ordered 0 0 - Ted ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: unlink(nonexistent): EROFS or ENOENT? 2011-06-06 3:39 ` Ted Ts'o @ 2011-06-06 17:13 ` Michael Tokarev 2011-06-06 17:18 ` Michael Tokarev 2011-06-06 19:55 ` Ted Ts'o 0 siblings, 2 replies; 7+ messages in thread From: Michael Tokarev @ 2011-06-06 17:13 UTC (permalink / raw) To: Ted Ts'o, Linux-kernel, linux-fsdevel Thank you for the answer. I thought noone will reply... ;) 06.06.2011 07:39, Ted Ts'o wrote: > On Sun, May 29, 2011 at 08:08:55PM +0400, Michael Tokarev wrote: >> Hello. >> >> Just noticed that at least on ext4, unlinking a >> non-existing file from a read-only filesystem >> results in EROFS instead of ENOENT. I'd expect >> it return ENOENT - it is more logical, at least >> in my opinion. >> >> For one, (readonly) NFS mount returns ENOENT in >> this case. > > Um, it doesn't for me. Testing on v3.0-rc1: > > # ls /test/foo; rm /test/foo > ls: cannot access /test/foo: No such file or directory > rm: cannot remove `/test/foo': No such file or directory This is a hack in coreutils rm to work around this kernel change. The comment at http://git.savannah.gnu.org/cgit/coreutils.git/tree/src/remove.c#n450 says: /* The unlinkat from kernels like linux-2.6.32 reports EROFS even for nonexistent files. When the file is indeed missing, map that to ENOENT, so that rm -f ignores it, as required. Even without -f, this is useful because it makes rm print the more precise diagnostic. */ so that rm(1) calls stat(2) to see if the file actually exist if unlinkat() returned EROFS, and turns this errno into ENOENT. That is, rm(1) output is not a good indicator. Use strace rm -f /test/foo 2>&1 | grep unlink to see the actual errno reported by the kernel. Here's the POSIX description of unlink (and unlinkat) again: http://pubs.opengroup.org/onlinepubs/009695399/functions/unlink.html Thanks! /mjt ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: unlink(nonexistent): EROFS or ENOENT? 2011-06-06 17:13 ` Michael Tokarev @ 2011-06-06 17:18 ` Michael Tokarev 2011-06-06 19:55 ` Ted Ts'o 1 sibling, 0 replies; 7+ messages in thread From: Michael Tokarev @ 2011-06-06 17:18 UTC (permalink / raw) To: Ted Ts'o, Linux-kernel, linux-fsdevel 06.06.2011 21:13, Michael Tokarev wrote: > Thank you for the answer. I thought noone will reply... ;) > > 06.06.2011 07:39, Ted Ts'o wrote: >> On Sun, May 29, 2011 at 08:08:55PM +0400, Michael Tokarev wrote: >>> Hello. >>> >>> Just noticed that at least on ext4, unlinking a >>> non-existing file from a read-only filesystem >>> results in EROFS instead of ENOENT. I'd expect >>> it return ENOENT - it is more logical, at least >>> in my opinion. >>> >>> For one, (readonly) NFS mount returns ENOENT in >>> this case. >> >> Um, it doesn't for me. Testing on v3.0-rc1: >> >> # ls /test/foo; rm /test/foo >> ls: cannot access /test/foo: No such file or directory >> rm: cannot remove `/test/foo': No such file or directory > > This is a hack in coreutils rm to work around this > kernel change. The comment at > http://git.savannah.gnu.org/cgit/coreutils.git/tree/src/remove.c#n450 > says: > > /* The unlinkat from kernels like linux-2.6.32 reports EROFS even for > nonexistent files. When the file is indeed missing, map that to ENOENT, > so that rm -f ignores it, as required. Even without -f, this is useful > because it makes rm print the more precise diagnostic. */ > > so that rm(1) calls stat(2) to see if the file actually > exist if unlinkat() returned EROFS, and turns this errno > into ENOENT. And another followup to this, -- the original case when I actually noticed the problem. A readonly-mounted root filesystem with /etc in git (the repository is in /var, symlinked from /etc/.git). I deleted a few files from /etc (when it was readwrite), and noticed that I forgot to commit the change. So I used `git rm oldfiles' and voila, git, for the first time, refused to commit stuff for me in this configuration, -- before, I was always able to _commit_ the changes even if the working tree is read-only. It works for everything but not for unlinks. > That is, rm(1) output is not a good indicator. Use > > strace rm -f /test/foo 2>&1 | grep unlink > > to see the actual errno reported by the kernel. > > Here's the POSIX description of unlink (and unlinkat) again: > http://pubs.opengroup.org/onlinepubs/009695399/functions/unlink.html > > Thanks! > > /mjt > -- > To unsubscribe from this list: send the line "unsubscribe linux-kernel" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > Please read the FAQ at http://www.tux.org/lkml/ ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: unlink(nonexistent): EROFS or ENOENT? 2011-06-06 17:13 ` Michael Tokarev 2011-06-06 17:18 ` Michael Tokarev @ 2011-06-06 19:55 ` Ted Ts'o 2011-06-06 20:37 ` [PATCH] vfs: make unlink() return ENOENT in preference to EROFS Theodore Ts'o 1 sibling, 1 reply; 7+ messages in thread From: Ted Ts'o @ 2011-06-06 19:55 UTC (permalink / raw) To: Michael Tokarev; +Cc: Linux-kernel, linux-fsdevel On Mon, Jun 06, 2011 at 09:13:23PM +0400, Michael Tokarev wrote: > Thank you for the answer. I thought noone will reply... ;) > > >> Just noticed that at least on ext4, unlinking a > >> non-existing file from a read-only filesystem > >> results in EROFS instead of ENOENT. I'd expect > >> it return ENOENT - it is more logical, at least > >> in my opinion. > /* The unlinkat from kernels like linux-2.6.32 reports EROFS even for > nonexistent files. When the file is indeed missing, map that to ENOENT, > so that rm -f ignores it, as required. Even without -f, this is useful > because it makes rm print the more precise diagnostic. */ OK, I see what's going on. This check is in the VFS layer, so it affects all filesystems; it's not an ext4-specific thing. Patch coming shortly. - Ted ^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH] vfs: make unlink() return ENOENT in preference to EROFS 2011-06-06 19:55 ` Ted Ts'o @ 2011-06-06 20:37 ` Theodore Ts'o 0 siblings, 0 replies; 7+ messages in thread From: Theodore Ts'o @ 2011-06-06 20:37 UTC (permalink / raw) To: linux-fsdevel, linux-kernel, viro; +Cc: Theodore Ts'o If user space attempts to unlink a non-existent file, and the file system is mounted read-only, return ENOENT instead of EROFS. Either error code is arguably valid/correct, but ENOENT is a more specific error message. Reported-by: Michael Tokarev <mjt@tls.msk.ru> Signed-off-by: "Theodore Ts'o" <tytso@mit.edu> --- fs/namei.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/fs/namei.c b/fs/namei.c index 1ab641f..a9edbe0 100644 --- a/fs/namei.c +++ b/fs/namei.c @@ -2708,9 +2708,9 @@ static long do_unlinkat(int dfd, const char __user *pathname) error = PTR_ERR(dentry); if (!IS_ERR(dentry)) { /* Why not before? Because we want correct error value */ - if (nd.last.name[nd.last.len]) - goto slashes; inode = dentry->d_inode; + if (nd.last.name[nd.last.len] || !inode) + goto slashes; if (inode) ihold(inode); error = mnt_want_write(nd.path.mnt); -- 1.7.4.1.22.gec8e1.dirty ^ permalink raw reply related [flat|nested] 7+ messages in thread
end of thread, other threads:[~2011-06-06 20:37 UTC | newest] Thread overview: 7+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2011-05-29 16:08 unlink(nonexistent): EROFS or ENOENT? Michael Tokarev 2011-05-29 16:14 ` Michael Tokarev 2011-06-06 3:39 ` Ted Ts'o 2011-06-06 17:13 ` Michael Tokarev 2011-06-06 17:18 ` Michael Tokarev 2011-06-06 19:55 ` Ted Ts'o 2011-06-06 20:37 ` [PATCH] vfs: make unlink() return ENOENT in preference to EROFS Theodore Ts'o
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).