* 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 an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.