delorie.com/archives/browse.cgi   search  
Mail Archives: cygwin/2023/09/08/16:31:58

X-Recipient: archive-cygwin AT delorie DOT com
DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 9C0F33858433
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cygwin.com;
s=default; t=1694205117;
bh=UNMuS0CNPWNpHVLggrvD+IEA6luSqOpDMattVIX1WZU=;
h=Date:To:Subject:References:In-Reply-To:List-Id:List-Unsubscribe:
List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc:
From;
b=fIikgVet2QWYZENb7Do/CNmdfwxCg9arHeciP/i+Q9TrcVVmqK97YSID0004MNzn1
IsyQzWPXictDl9efN2HBaUAvBGaOdxLZiiAmq8EP3ajeAiKNuYHxfUyddaLBEZvwqY
sRzpvJSP5RSMB9yb/bso28ySl/K6XZBJEdbw39eI=
X-Original-To: cygwin AT cygwin DOT com
Delivered-To: cygwin AT cygwin DOT com
DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 1C90B3858D38
Date: Fri, 8 Sep 2023 22:31:21 +0200
To: cygwin AT cygwin DOT com
Subject: Re: NFS mkfifo support in cygwin 3.5.0 Re: [ANNOUNCEMENT] cygwin
3.4.9-1
Message-ID: <ZPuEmZlxpI9twFNa@calimero.vinschen.de>
Mail-Followup-To: cygwin AT cygwin DOT com
References: <announce DOT 20230906172530 DOT 526501-1-corinna-cygwin AT cygwin DOT com>
<CANH4o6MSXBxMBsqgtWbNe9rPETNgY-D5QxJO9AsLwe+tm0WkDw AT mail DOT gmail DOT com>
<CALXu0UcRuepZC_jH1+rzqLxDuhCtC4h94wgfVxkBxH9fSDEH7A AT mail DOT gmail DOT com>
<ZPr+mFTvEfYfD+8T AT calimero DOT vinschen DOT de>
MIME-Version: 1.0
In-Reply-To: <ZPr+mFTvEfYfD+8T@calimero.vinschen.de>
X-BeenThere: cygwin AT cygwin DOT com
X-Mailman-Version: 2.1.30
List-Id: General Cygwin discussions and problem reports <cygwin.cygwin.com>
List-Unsubscribe: <https://cygwin.com/mailman/options/cygwin>,
<mailto:cygwin-request AT cygwin DOT com?subject=unsubscribe>
List-Archive: <https://cygwin.com/pipermail/cygwin/>
List-Post: <mailto:cygwin AT cygwin DOT com>
List-Help: <mailto:cygwin-request AT cygwin DOT com?subject=help>
List-Subscribe: <https://cygwin.com/mailman/listinfo/cygwin>,
<mailto:cygwin-request AT cygwin DOT com?subject=subscribe>
From: Corinna Vinschen via Cygwin <cygwin AT cygwin DOT com>
Reply-To: cygwin AT cygwin DOT com
Cc: Corinna Vinschen <corinna-cygwin AT cygwin DOT com>
Errors-To: cygwin-bounces+archive-cygwin=delorie DOT com AT cygwin DOT com
Sender: "Cygwin" <cygwin-bounces+archive-cygwin=delorie DOT com AT cygwin DOT com>

On Sep  8 12:59, Corinna Vinschen via Cygwin wrote:
> On Sep  8 06:48, Cedric Blancher via Cygwin wrote:
> > So chmod() for a FIFO inode on NFS fails. Tested with MSFT NFSv3 and
> > new builds of the NFSv4.1 ms-nfs41-client filesystems.
> 
> Did you actually test this with 3.4.8?  It never worked on NFS.
> 
> Just to be clear, the above creates a Cygwin FIFO.  The situation
> is different with native FIFOs, created on the host.  With those,
> chmod worked before because native FIFOs were handled like normal files,
> except in stat(2).  Now that they are handled as FIFOs, the mechanism
> to change the file mode doesn't work anymore, because it depends on
> FIFOs being WIndows shortcuts.
> 
> I will look into that at one point, but it's not a regression.

For the records:

Fixing this for native FIFOs is relatively easy. Fixing this for Cygwin
emulated FIFOs is rightout impossible ATM:

Cygwin FIFOs are symlinks with special content, basically containing
device major, device minor and mode bits.

Overwriting the mode via chmod(2) requires to change the symlink target,
an operation which isn't supported for real symlinks on NFS-mounted
filesystems.  Consequentially, the FILE_OVERWRITE_IF creation mode
doesn't work when trying to create a symlink.  It always fails with
STATUS_OBJECT_PATH_SYNTAX_BAD.

The next idea coming to mind is to unlink and recreate the symlink
(albeit not an atomic operation).  This works if you call, e. g.,
chmod(1).

Unfortunately this does *not* work if there's an open handle to the
file.  This occurs, for instance, in mkfifo(1) when using the -m option.
It calls mkfifo(3) with the correct mode bits, and then, if that worked,
and the -m option has been specified, it calls chmod(2) on the FIFO to
set the same mode again.  It does so while it opened the symlink with
the O_PATH flag.  I don't know why it does this, but albeit it looks
like double work, the operation itself is allowed and should work.

What happens in this case is this:

As soon as chmod(2) got called, the first NtCreateFile trying to create
the symlink fails with STATUS_OBJECT_NAME_COLLISION.  So just check for
this status code and then call unlink on the FIFO symlink.

Given the symlink is in use, the unlink operation renames the FIFO to
some temporary filename (that's builtin functionality of MSFT NFSv3).

Theoretically the original FIFO name is now free to be reused for the
FIFO symlink, but the next NtCreateFile call trying to create the symlink
still fails with STATUS_OBJECT_NAME_COLLISION.  Rinse and repeat.

So it's still a bad idea to use FIFOs on NFS.

I'll be offline for some time now for personal reasons, but if somebody
has an idea how to fix this *and* understands Cygwin's inner workings,
*and* can come up with a patch, feel free to send it to the
cygwin-patches mailing list.

Other than that, no idle musings, please.  It just distracts from
finding a working solution.


Corinna

-- 
Problem reports:      https://cygwin.com/problems.html
FAQ:                  https://cygwin.com/faq/
Documentation:        https://cygwin.com/docs.html
Unsubscribe info:     https://cygwin.com/ml/#unsubscribe-simple

- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019