All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Pali Rohár" <pali@kernel.org>
To: Steve French <smfrench@gmail.com>
Cc: Steve French <sfrench@samba.org>,
	Paulo Alcantara <pc@manguebit.com>,
	Namjae Jeon <linkinjeon@kernel.org>,
	linux-cifs@vger.kernel.org
Subject: Re: SMB2 DELETE vs UNLINK
Date: Mon, 7 Oct 2024 20:48:53 +0200	[thread overview]
Message-ID: <20241007184853.cocdfouji4bngcry@pali> (raw)
In-Reply-To: <CAH2r5muZcbhy-MbhsLXgvoBCv3kZo_XhgtNPOkMyjEvLFDWbCg@mail.gmail.com>

On Sunday 06 October 2024 23:18:28 Steve French wrote:
> On Sun, Oct 6, 2024 at 5:31 AM Pali Rohár <pali@kernel.org> wrote:
> >
> > Hello,
> >
> > Windows NT systems and SMB2 protocol support only DELETE operation which
> > unlinks file from the directory after the last client/process closes the
> > opened handle.
> >
> > So when file is opened by more client/processes and somebody wants to
> > unlink that file, it stay in the directory until the last client/process
> > stop using it.
> >
> > This DELETE operation can be issued either by CLOSE request on handle
> > opened by DELETE_ON_CLOSE flag, or by SET_INFO request with class 13
> > (FileDispositionInformation) and with set DeletePending flag.
> >
> >
> > But starting with Windows 10, version 1709, there is support also for
> > UNLINK operation, via class 64 (FileDispositionInformationEx) [1] where
> > is FILE_DISPOSITION_POSIX_SEMANTICS flag [2] which does UNLINK after
> > CLOSE and let file content usable for all other processes. Internally
> > Windows NT kernel moves this file on NTFS from its directory into some
> > hidden are. Which is de-facto same as what is POSIX unlink. There is
> > also class 65 (FileRenameInformationEx) which is allows to issue POSIX
> > rename (unlink the target if it exists).
> >
> > What do you think about using & implementing this functionality for the
> > Linux unlink operation? As the class numbers are already reserved and
> > documented, I think that it could make sense to use them also over SMB
> > on POSIX systems.
> >
> >
> > Also there is another flag FILE_DISPOSITION_IGNORE_READONLY_ATTRIBUTE
> > which can be useful for unlink. It allows to unlink also file which has
> > read-only attribute set. So no need to do that racy (unset-readonly,
> > set-delete-pending, set-read-only) compound on files with more file
> > hardlinks.
> 
> This is a really good point - but what about mkdir (where we have a
> current bug relating to rmdir of a file after "chmod 0444 dir"

I'm not sure what is doing "chmod 0444 dir". It is setting SMB/NT
read-only attribute?

If yes then FILE_DISPOSITION_IGNORE_READONLY_ATTRIBUTE sounds like can
be something useful.


But anyway, I think that such bug could be fixed by sending SMB2
compound of following SMB2 commands:
* CREATE with DELETE desired access without DELETE_ON_CLOSE
* SET_INFO with clearing READ_ONLY attribute
* SET_INFO with setting DELETE_PENDING
* SET_INFO with setting READ_ONLY attribute
* CLOSE

CREATE with DELETE_ON_CLOSE fails on object with READ_ONLY attr, so
CREATE(open) has to be called without it. First SET_INFO will try to
remove the protection, to allow second SET_INFO to set DELETE_PENDING
flag. In case setting of it will fail, the third SET_INFO will restore
the protection.

Has SMB2 something like transaction support? NT kernel and its NTFS
subsystem provides transaction FS operations for applications. And I
think that Cygwin is using those FS transactions for race-free
implementation of removing file with read-only attribute.

  reply	other threads:[~2024-10-07 18:48 UTC|newest]

Thread overview: 23+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-10-06 10:31 SMB2 DELETE vs UNLINK Pali Rohár
2024-10-07  4:18 ` Steve French
2024-10-07 18:48   ` Pali Rohár [this message]
2024-10-08  0:07     ` Steve French
2024-10-08  9:40 ` Ralph Boehme
2024-10-08 18:18   ` Pali Rohár
2024-10-08 20:16     ` Ralph Boehme
2024-10-09  5:03     ` Steve French
2024-10-14  9:49       ` Pali Rohár
2024-12-27 15:58         ` Pali Rohár
2024-12-27 16:30           ` Tom Talpey
2024-12-25 14:47 ` Pali Rohár
2024-12-27 16:21   ` Tom Talpey
2024-12-27 16:32     ` Pali Rohár
2024-12-27 16:43       ` Tom Talpey
2024-12-27 18:51         ` Pali Rohár
2025-04-08 22:43           ` Pali Rohár
2025-04-09  6:50             ` Fwd: " Ralph Boehme
2025-04-09 15:57               ` [EXTERNAL] Fwd: SMB2 DELETE vs UNLINK - TrackingID#2504090040009564 Michael Bowen
2025-04-10  5:57                 ` Tom Talpey
2025-04-10 11:07                 ` Obaid Farooqi
2025-05-06 19:00                   ` Obaid Farooqi
2025-08-31 12:55                     ` Pali Rohár

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=20241007184853.cocdfouji4bngcry@pali \
    --to=pali@kernel.org \
    --cc=linkinjeon@kernel.org \
    --cc=linux-cifs@vger.kernel.org \
    --cc=pc@manguebit.com \
    --cc=sfrench@samba.org \
    --cc=smfrench@gmail.com \
    /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.