From mboxrd@z Thu Jan  1 00:00:00 1970
Return-Path: <pbs-devel-bounces@lists.proxmox.com>
Received: from firstgate.proxmox.com (firstgate.proxmox.com [IPv6:2a01:7e0:0:424::9])
	by lore.proxmox.com (Postfix) with ESMTPS id 2B2571FF2CF
	for <inbox@lore.proxmox.com>; Thu, 11 Jul 2024 19:11:12 +0200 (CEST)
Received: from firstgate.proxmox.com (localhost [127.0.0.1])
	by firstgate.proxmox.com (Proxmox) with ESMTP id 9C74D37A2D;
	Thu, 11 Jul 2024 19:11:35 +0200 (CEST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=gmail.com; s=20230601; t=1720717855; x=1721322655; darn=lists.proxmox.com;
 h=to:subject:message-id:date:from:in-reply-to:references:mime-version
 :from:to:cc:subject:date:message-id:reply-to;
 bh=BJXEFhQ2l9gP0DnIKN6qtIiSl2wOBXV71tv6kFZkcVg=;
 b=FLB0u+3D7bRKJyWEqRXgnVRjuLx1tHrI+J75hO/f0VWNL6cOP5iIrJ0RCZ/uWL8UHq
 alFD6Pm7LWOf9GF+cRV1ASlFZk1a3dX4CI/p9JB2kx4v0NL+2V7TRM+An0+YtYx8nNVu
 cZ48LP287oho2xudOXFSUP0hsFDeqn2no5I7PF7rQiulvSJbNoMWqTXpIrifnMs2KQqS
 KwsSzCOdgrKrVCP4sHVvB9WInfspuMMaBjWjFo1afnWPvymti02KL6X/SVbtNdwkg1v4
 jDb4SMBIPpEjiUuBc+mNDQGnLFjwqv/Z3UyLwvTUV722ByY3lH5O4dEmFsh43p6SDmLn
 EGkg==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20230601; t=1720717855; x=1721322655;
 h=to:subject:message-id:date:from:in-reply-to:references:mime-version
 :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to;
 bh=BJXEFhQ2l9gP0DnIKN6qtIiSl2wOBXV71tv6kFZkcVg=;
 b=Iq5aeHMo/jxT1RTZ7Y9ifRvOnWkNfZHvciiWeQ9LJ6+FScT6X9cjedGtv7XVZNYIiY
 opCsV8L8QqSajc+f59oNHwNCVtM8y9L3kGMvPIGgD+sr0OtT44+3cb992576FcoDNKJm
 ofBPceplIHWYDY1kqHd/Y703ibg09wHC+hmfmImZtqafTaJgMX7wVBA0rBV1T9iklb3I
 c8iS6JDpM6m5MCuHhhNCEdaI34tdqNK3p66+sye5VAmR4wuSY/pRFheWqvs3LQIDWvMK
 yBWgHwao7lhWQZpC68/jUdhU+fnmNG5AV0yl7R47ONIoGiz5EqkYJzb2b+QIPT4Zi/cC
 /ASQ==
X-Gm-Message-State: AOJu0YwFAUzFMrMUz3M/brUfPVb7REAi9ipXHPdYKGzhlN68SC9cSrx7
 k7vEMbXD3gLeYR8KdAR+i+Vx1jC0EatGiF+6DBHT0SaHMMjELKuHeMkIA09SxnRY2/AZvS4YEwC
 Ka1lfJXVYeuzE/2jcys5g9eJmk3VDoA78NGPKng==
X-Google-Smtp-Source: AGHT+IFXQCCU+B56f1rUQcYtY+J8qtiJrbRnf6Q6tPJaVb2LzKNb/uwcenr/u7A3rtqw9P+SBKzs4Y9lSN0H/HdxBNY=
X-Received: by 2002:a17:90a:c386:b0:2c9:7aea:2188 with SMTP id
 98e67ed59e1d1-2ca35be79a2mr7264819a91.2.1720717854806; Thu, 11 Jul 2024
 10:10:54 -0700 (PDT)
MIME-Version: 1.0
References: <20240711170723.1115046-1-c.heiss@proxmox.com>
In-Reply-To: <20240711170723.1115046-1-c.heiss@proxmox.com>
From: Turkijan <turkijan083@gmail.com>
Date: Thu, 11 Jul 2024 13:11:12 -0400
Message-ID: <CAFtnzVeytCY22pYY96eXio54JvhdfUpZ8UQw7MH2YAVAcwTgdQ@mail.gmail.com>
To: Proxmox Backup Server development discussion <pbs-devel@lists.proxmox.com>
X-SPAM-LEVEL: Spam detection results:  0
 AWL 0.147 Adjusted score from AWL reputation of From: address
 BAYES_00                 -1.9 Bayes spam probability is 0 to 1%
 DKIM_SIGNED               0.1 Message has a DKIM or DK signature,
 not necessarily valid
 DKIM_VALID -0.1 Message has at least one valid DKIM or DK signature
 DKIM_VALID_AU -0.1 Message has a valid DKIM or DK signature from author's
 domain
 DKIM_VALID_EF -0.1 Message has a valid DKIM or DK signature from envelope-from
 domain DMARC_PASS               -0.1 DMARC pass policy
 FREEMAIL_ENVFROM_END_DIGIT 0.25 Envelope-from freemail username ends in digit
 FREEMAIL_FROM 0.001 Sender email is commonly abused enduser mail provider
 GB_FREEMAIL_NUM             1 Freemail spammy address
 HTML_MESSAGE            0.001 HTML included in message
 POISEN_SPAM_PILL_4        0.1 random spam to be learned in bayes
 RCVD_IN_DNSWL_NONE     -0.0001 Sender listed at https://www.dnswl.org/,
 no trust
 SPF_HELO_NONE           0.001 SPF: HELO does not publish an SPF Record
 SPF_PASS               -0.001 SPF: sender matches SPF record
Subject: Re: [pbs-devel] [PATCH proxmox] sys: file: use renameat2() from
 `nix` crate
X-BeenThere: pbs-devel@lists.proxmox.com
X-Mailman-Version: 2.1.29
Precedence: list
List-Id: Proxmox Backup Server development discussion
 <pbs-devel.lists.proxmox.com>
List-Unsubscribe: <https://lists.proxmox.com/cgi-bin/mailman/options/pbs-devel>, 
 <mailto:pbs-devel-request@lists.proxmox.com?subject=unsubscribe>
List-Archive: <http://lists.proxmox.com/pipermail/pbs-devel/>
List-Post: <mailto:pbs-devel@lists.proxmox.com>
List-Help: <mailto:pbs-devel-request@lists.proxmox.com?subject=help>
List-Subscribe: <https://lists.proxmox.com/cgi-bin/mailman/listinfo/pbs-devel>, 
 <mailto:pbs-devel-request@lists.proxmox.com?subject=subscribe>
Reply-To: Proxmox Backup Server development discussion
 <pbs-devel@lists.proxmox.com>
Content-Type: multipart/mixed; boundary="===============0501817387647147305=="
Errors-To: pbs-devel-bounces@lists.proxmox.com
Sender: "pbs-devel" <pbs-devel-bounces@lists.proxmox.com>

--===============0501817387647147305==
Content-Type: multipart/alternative; boundary="0000000000007e9c55061cfbd84e"

--0000000000007e9c55061cfbd84e
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

Have you changed dev package?


On Thu, Jul 11, 2024 at 1:08=E2=80=AFPM Christoph Heiss <c.heiss@proxmox.co=
m> wrote:

> Saves us from converting the paths to raw C strings ourselves, thus
> simplifying it quite a bit.
>
> No functional changes.
>
> Signed-off-by: Christoph Heiss <c.heiss@proxmox.com>
> ---
>  proxmox-sys/src/fs/file.rs | 51 ++++++++++++++++----------------------
>  1 file changed, 22 insertions(+), 29 deletions(-)
>
> diff --git a/proxmox-sys/src/fs/file.rs b/proxmox-sys/src/fs/file.rs
> index ac513891..3b20c4ea 100644
> --- a/proxmox-sys/src/fs/file.rs
> +++ b/proxmox-sys/src/fs/file.rs
> @@ -10,7 +10,6 @@ use nix::errno::Errno;
>  use nix::fcntl::OFlag;
>  use nix::sys::stat;
>  use nix::unistd;
> -use nix::NixPath;
>  use serde_json::Value;
>
>  use proxmox_lang::try_block;
> @@ -266,30 +265,32 @@ pub fn atomic_open_or_create_file<P: AsRef<Path>>(
>
>      // rotate the file into place, but use `RENAME_NOREPLACE`, so in cas=
e
> 2 processes race against
>      // the initialization, the first one wins!
> -    let rename_result =3D temp_file_name.with_nix_path(|c_file_name| {
> -        path.with_nix_path(|new_path| unsafe {
> -            // This also works on file systems which don't support
> hardlinks (eg. vfat)
> -            match Errno::result(libc::renameat2(
> -                libc::AT_FDCWD,
> -                c_file_name.as_ptr(),
> -                libc::AT_FDCWD,
> -                new_path.as_ptr(),
> -                libc::RENAME_NOREPLACE,
> -            )) {
> -                Err(Errno::EINVAL) =3D> (), // dumb file system, try
> `link`+`unlink`
> -                other =3D> return other,
> -            };
> -            // but some file systems don't support `RENAME_NOREPLACE`
> +    let rename_result =3D match nix::fcntl::renameat2(
> +        None, // AT_FDCWD
> +        &temp_file_name,
> +        None, // AT_FDCWD
> +        path,
> +        nix::fcntl::RenameFlags::RENAME_NOREPLACE,
> +    ) {
> +        Err(Errno::EINVAL) =3D> {
> +            // some file systems don't support `RENAME_NOREPLACE`
>              // so we just use `link` + `unlink` instead
> -            let result =3D Errno::result(libc::link(c_file_name.as_ptr()=
,
> new_path.as_ptr()));
> -            let _ =3D libc::unlink(c_file_name.as_ptr());
> +            let result =3D nix::unistd::linkat(
> +                None,
> +                &temp_file_name,
> +                None,
> +                &path.to_path_buf(),
> +                nix::unistd::LinkatFlags::NoSymlinkFollow,
> +            );
> +            let _ =3D nix::unistd::unlink(&temp_file_name);
>              result
> -        })
> -    });
> +        }
> +        other =3D> other,
> +    };
>
>      match rename_result {
> -        Ok(Ok(Ok(_))) =3D> Ok(file),
> -        Ok(Ok(Err(err))) =3D> {
> +        Ok(_) =3D> Ok(file),
> +        Err(err) =3D> {
>              // if another process has already raced ahead and created
>              // the file, let's just open theirs instead:
>              let _ =3D nix::unistd::unlink(&temp_file_name);
> @@ -308,14 +309,6 @@ pub fn atomic_open_or_create_file<P: AsRef<Path>>(
>                  );
>              }
>          }
> -        Ok(Err(err)) =3D> {
> -            let _ =3D nix::unistd::unlink(&temp_file_name);
> -            bail!("with_nix_path {:?} failed - {}", path, err);
> -        }
> -        Err(err) =3D> {
> -            let _ =3D nix::unistd::unlink(&temp_file_name);
> -            bail!("with_nix_path {:?} failed - {}", temp_file_name, err)=
;
> -        }
>      }
>  }
>
> --
> 2.45.1
>
>
>
> _______________________________________________
> pbs-devel mailing list
> pbs-devel@lists.proxmox.com
> https://lists.proxmox.com/cgi-bin/mailman/listinfo/pbs-devel
>
>

--0000000000007e9c55061cfbd84e
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr">Have you changed dev package?<div><br></div></div><br><div=
 class=3D"gmail_quote"><div dir=3D"ltr" class=3D"gmail_attr">On Thu, Jul 11=
, 2024 at 1:08=E2=80=AFPM Christoph Heiss &lt;<a href=3D"mailto:c.heiss@pro=
xmox.com">c.heiss@proxmox.com</a>&gt; wrote:<br></div><blockquote class=3D"=
gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(20=
4,204,204);padding-left:1ex">Saves us from converting the paths to raw C st=
rings ourselves, thus<br>
simplifying it quite a bit.<br>
<br>
No functional changes.<br>
<br>
Signed-off-by: Christoph Heiss &lt;<a href=3D"mailto:c.heiss@proxmox.com" t=
arget=3D"_blank">c.heiss@proxmox.com</a>&gt;<br>
---<br>
=C2=A0proxmox-sys/src/fs/<a href=3D"http://file.rs" rel=3D"noreferrer" targ=
et=3D"_blank">file.rs</a> | 51 ++++++++++++++++----------------------<br>
=C2=A01 file changed, 22 insertions(+), 29 deletions(-)<br>
<br>
diff --git a/proxmox-sys/src/fs/<a href=3D"http://file.rs" rel=3D"noreferre=
r" target=3D"_blank">file.rs</a> b/proxmox-sys/src/fs/<a href=3D"http://fil=
e.rs" rel=3D"noreferrer" target=3D"_blank">file.rs</a><br>
index ac513891..3b20c4ea 100644<br>
--- a/proxmox-sys/src/fs/<a href=3D"http://file.rs" rel=3D"noreferrer" targ=
et=3D"_blank">file.rs</a><br>
+++ b/proxmox-sys/src/fs/<a href=3D"http://file.rs" rel=3D"noreferrer" targ=
et=3D"_blank">file.rs</a><br>
@@ -10,7 +10,6 @@ use nix::errno::Errno;<br>
=C2=A0use nix::fcntl::OFlag;<br>
=C2=A0use nix::sys::stat;<br>
=C2=A0use nix::unistd;<br>
-use nix::NixPath;<br>
=C2=A0use serde_json::Value;<br>
<br>
=C2=A0use proxmox_lang::try_block;<br>
@@ -266,30 +265,32 @@ pub fn atomic_open_or_create_file&lt;P: AsRef&lt;Path=
&gt;&gt;(<br>
<br>
=C2=A0 =C2=A0 =C2=A0// rotate the file into place, but use `RENAME_NOREPLAC=
E`, so in case 2 processes race against<br>
=C2=A0 =C2=A0 =C2=A0// the initialization, the first one wins!<br>
-=C2=A0 =C2=A0 let rename_result =3D temp_file_name.with_nix_path(|c_file_n=
ame| {<br>
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 path.with_nix_path(|new_path| unsafe {<br>
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 // This also works on file syste=
ms which don&#39;t support hardlinks (eg. vfat)<br>
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 match Errno::result(libc::rename=
at2(<br>
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 libc::AT_FDCWD,<br=
>
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 c_file_name.as_ptr=
(),<br>
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 libc::AT_FDCWD,<br=
>
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 new_path.as_ptr(),=
<br>
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 libc::RENAME_NOREP=
LACE,<br>
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 )) {<br>
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 Err(Errno::EINVAL)=
 =3D&gt; (), // dumb file system, try `link`+`unlink`<br>
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 other =3D&gt; retu=
rn other,<br>
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 };<br>
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 // but some file systems don&#39=
;t support `RENAME_NOREPLACE`<br>
+=C2=A0 =C2=A0 let rename_result =3D match nix::fcntl::renameat2(<br>
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 None, // AT_FDCWD<br>
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 &amp;temp_file_name,<br>
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 None, // AT_FDCWD<br>
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 path,<br>
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 nix::fcntl::RenameFlags::RENAME_NOREPLACE,<br>
+=C2=A0 =C2=A0 ) {<br>
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 Err(Errno::EINVAL) =3D&gt; {<br>
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 // some file systems don&#39;t s=
upport `RENAME_NOREPLACE`<br>
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0// so we just use `link` + =
`unlink` instead<br>
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 let result =3D Errno::result(lib=
c::link(c_file_name.as_ptr(), new_path.as_ptr()));<br>
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 let _ =3D libc::unlink(c_file_na=
me.as_ptr());<br>
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 let result =3D nix::unistd::link=
at(<br>
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 None,<br>
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 &amp;temp_file_nam=
e,<br>
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 None,<br>
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 &amp;path.to_path_=
buf(),<br>
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 nix::unistd::Linka=
tFlags::NoSymlinkFollow,<br>
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 );<br>
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 let _ =3D nix::unistd::unlink(&a=
mp;temp_file_name);<br>
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0result<br>
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 })<br>
-=C2=A0 =C2=A0 });<br>
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 }<br>
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 other =3D&gt; other,<br>
+=C2=A0 =C2=A0 };<br>
<br>
=C2=A0 =C2=A0 =C2=A0match rename_result {<br>
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 Ok(Ok(Ok(_))) =3D&gt; Ok(file),<br>
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 Ok(Ok(Err(err))) =3D&gt; {<br>
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 Ok(_) =3D&gt; Ok(file),<br>
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 Err(err) =3D&gt; {<br>
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0// if another process has a=
lready raced ahead and created<br>
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0// the file, let&#39;s just=
 open theirs instead:<br>
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0let _ =3D nix::unistd::unli=
nk(&amp;temp_file_name);<br>
@@ -308,14 +309,6 @@ pub fn atomic_open_or_create_file&lt;P: AsRef&lt;Path&=
gt;&gt;(<br>
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0);<br>
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0}<br>
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0}<br>
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 Ok(Err(err)) =3D&gt; {<br>
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 let _ =3D nix::unistd::unlink(&a=
mp;temp_file_name);<br>
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 bail!(&quot;with_nix_path {:?} f=
ailed - {}&quot;, path, err);<br>
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 }<br>
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 Err(err) =3D&gt; {<br>
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 let _ =3D nix::unistd::unlink(&a=
mp;temp_file_name);<br>
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 bail!(&quot;with_nix_path {:?} f=
ailed - {}&quot;, temp_file_name, err);<br>
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 }<br>
=C2=A0 =C2=A0 =C2=A0}<br>
=C2=A0}<br>
<br>
-- <br>
2.45.1<br>
<br>
<br>
<br>
_______________________________________________<br>
pbs-devel mailing list<br>
<a href=3D"mailto:pbs-devel@lists.proxmox.com" target=3D"_blank">pbs-devel@=
lists.proxmox.com</a><br>
<a href=3D"https://lists.proxmox.com/cgi-bin/mailman/listinfo/pbs-devel" re=
l=3D"noreferrer" target=3D"_blank">https://lists.proxmox.com/cgi-bin/mailma=
n/listinfo/pbs-devel</a><br>
<br>
</blockquote></div>

--0000000000007e9c55061cfbd84e--


--===============0501817387647147305==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
pbs-devel mailing list
pbs-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pbs-devel

--===============0501817387647147305==--