All of lore.kernel.org
 help / color / mirror / Atom feed
From: David Sterba <dsterba@suse.cz>
To: Omar Sandoval <osandov@osandov.com>
Cc: linux-btrfs@vger.kernel.org, kernel-team@fb.com,
	Neal Gompa <neal@gompa.dev>, Sam James <sam@gentoo.org>
Subject: Re: [PATCH] libbtrfsutil: python: fix build on Python 3.13
Date: Tue, 30 Jul 2024 00:12:52 +0200	[thread overview]
Message-ID: <20240729221252.GV17473@twin.jikos.cz> (raw)
In-Reply-To: <fbbb792fa299bfdfa818f6e0790fa545297dc1cf.1721949827.git.osandov@fb.com>

On Thu, Jul 25, 2024 at 04:28:35PM -0700, Omar Sandoval wrote:
> From: Omar Sandoval <osandov@fb.com>
> 
> Python 3.13, currently in beta, removed the internal
> _PyObject_LookupSpecial function. The libbtrfsutil Python bindings use
> it in the path_converter() function because it was based on internal
> path_converter() function in CPython [1]. This is causing build failures
> on Fedora Rawhide [2] and Gentoo [3]. Replace path_converter() with a
> version that only uses public functions based on the one in drgn [4].
> 
> 1: https://github.com/python/cpython/blob/d9efa45d7457b0dfea467bb1c2d22c69056ffc73/Modules/posixmodule.c#L1253
> 2: https://bugzilla.redhat.com/show_bug.cgi?id=2245650
> 3: https://github.com/kdave/btrfs-progs/issues/838
> 4: https://github.com/osandov/drgn/blob/9ad29fd86499eb32847473e928b6540872d3d59a/libdrgn/python/util.c#L81
> 
> Reported-by: Neal Gompa <neal@gompa.dev>
> Reported-by: Sam James <sam@gentoo.org>
> Signed-off-by: Omar Sandoval <osandov@fb.com>
> ---
>  libbtrfsutil/python/btrfsutilpy.h |  7 +--
>  libbtrfsutil/python/module.c      | 98 ++++++++++---------------------
>  2 files changed, 33 insertions(+), 72 deletions(-)
> 
> diff --git a/libbtrfsutil/python/btrfsutilpy.h b/libbtrfsutil/python/btrfsutilpy.h
> index ee70c23a..49702dcc 100644
> --- a/libbtrfsutil/python/btrfsutilpy.h
> +++ b/libbtrfsutil/python/btrfsutilpy.h
> @@ -40,16 +40,13 @@ extern PyTypeObject SubvolumeInfo_type;
>  extern PyTypeObject SubvolumeIterator_type;
>  extern PyTypeObject QgroupInherit_type;
>  
> -/*
> - * Helpers for path arguments based on posixmodule.c in CPython.
> - */
>  struct path_arg {
>  	bool allow_fd;
> -	char *path;
>  	int fd;
> +	char *path;
>  	Py_ssize_t length;
>  	PyObject *object;
> -	PyObject *cleanup;
> +	PyObject *bytes;
>  };
>  int path_converter(PyObject *o, void *p);
>  void path_cleanup(struct path_arg *path);
> diff --git a/libbtrfsutil/python/module.c b/libbtrfsutil/python/module.c
> index 2657ee28..9b0b86b5 100644
> --- a/libbtrfsutil/python/module.c
> +++ b/libbtrfsutil/python/module.c
> @@ -44,85 +44,49 @@ static int fd_converter(PyObject *o, void *p)
>  int path_converter(PyObject *o, void *p)
>  {
>  	struct path_arg *path = p;
> -	int is_index, is_bytes, is_unicode;
> -	PyObject *bytes = NULL;
> -	Py_ssize_t length = 0;
> -	char *tmp;
>  
>  	if (o == NULL) {
>  		path_cleanup(p);
>  		return 1;
>  	}
>  
> -	path->object = path->cleanup = NULL;
> -	Py_INCREF(o);
> -
>  	path->fd = -1;
> +	path->path = NULL;
> +	path->length = 0;
> +	path->bytes = NULL;
> +	if (path->allow_fd && PyIndex_Check(o)) {
> +		PyObject *fd_obj;
> +		int overflow;
> +		long fd;
>  
> -	is_index = path->allow_fd && PyIndex_Check(o);
> -	is_bytes = PyBytes_Check(o);
> -	is_unicode = PyUnicode_Check(o);
> -
> -	if (!is_index && !is_bytes && !is_unicode) {
> -		_Py_IDENTIFIER(__fspath__);
> -		PyObject *func;
> -
> -		func = _PyObject_LookupSpecial(o, &PyId___fspath__);
> -		if (func == NULL)
> -			goto err_format;
> -		Py_DECREF(o);
> -		o = PyObject_CallFunctionObjArgs(func, NULL);
> -		Py_DECREF(func);
> -		if (o == NULL)
> +		fd_obj = PyNumber_Index(o);
> +		if (!fd_obj)
>  			return 0;
> -		is_bytes = PyBytes_Check(o);
> -		is_unicode = PyUnicode_Check(o);
> -	}
> -
> -	if (is_unicode) {
> -		if (!PyUnicode_FSConverter(o, &bytes))
> -			goto err;
> -	} else if (is_bytes) {
> -		bytes = o;
> -		Py_INCREF(bytes);
> -	} else if (is_index) {
> -		if (!fd_converter(o, &path->fd))

This removes the last use of fd_converter

module.c:22:12: warning: ‘fd_converter’ defined but not used [-Wunused-function]
   22 | static int fd_converter(PyObject *o, void *p)

I'll ifdef it out as it will be probably needed in the future.

      parent reply	other threads:[~2024-07-29 22:12 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-07-25 23:28 [PATCH] libbtrfsutil: python: fix build on Python 3.13 Omar Sandoval
2024-07-26  0:10 ` Neal Gompa
2024-07-26  1:12 ` David Sterba
2024-07-26  1:29   ` Neal Gompa
2024-07-26  1:37     ` Omar Sandoval
2024-07-26 15:02       ` David Sterba
2024-07-26 15:05 ` David Sterba
2024-07-29 22:12 ` David Sterba [this message]

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=20240729221252.GV17473@twin.jikos.cz \
    --to=dsterba@suse.cz \
    --cc=kernel-team@fb.com \
    --cc=linux-btrfs@vger.kernel.org \
    --cc=neal@gompa.dev \
    --cc=osandov@osandov.com \
    --cc=sam@gentoo.org \
    /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.