All of lore.kernel.org
 help / color / mirror / Atom feed
From: Michael Tokarev <mjt@tls.msk.ru>
To: "Ted Ts'o" <tytso@mit.edu>,
	Linux-kernel <linux-kernel@vger.kernel.org>,
	linux-fsdevel <linux-fsdevel@vger.kernel.org>
Subject: Re: unlink(nonexistent): EROFS or ENOENT?
Date: Mon, 06 Jun 2011 21:18:45 +0400	[thread overview]
Message-ID: <4DED0BF5.1010206@msgid.tls.msk.ru> (raw)
In-Reply-To: <4DED0AB3.6060708@msgid.tls.msk.ru>

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/


  reply	other threads:[~2011-06-06 17:18 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
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 [this message]
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

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4DED0BF5.1010206@msgid.tls.msk.ru \
    --to=mjt@tls.msk.ru \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=tytso@mit.edu \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.