Mikhail Karpov, le jeu. 03 sept. 2026 11:10:43 +0700, a ecrit:
> Also, here is a small change to netfs_attempt_lookup in storeio to avoid
> unnecessary lock and unlock calls.
> From c5bc6ac329c4dc5e63e4d4eb6e8854a4c97b7112 Mon Sep 17 00:00:00 2001
> From: Mikhail Karpov <[email protected]>
> Date: Thu, 3 Sep 2026 11:01:09 +0700
> Subject: [PATCH] Removing unnecessary thread_mutex_lock/unlock
> 
> ---
>  storeio/storeio.c | 6 +-----
>  1 file changed, 1 insertion(+), 5 deletions(-)
> 
> diff --git a/storeio/storeio.c b/storeio/storeio.c
> index b146742..3302c5c 100644
> --- a/storeio/storeio.c
> +++ b/storeio/storeio.c
> @@ -688,15 +688,11 @@ netfs_attempt_lookup (struct iouser *user, struct node 
> *dir,
>            return err;
>          }
>      }
> -  pthread_mutex_unlock (&dir->lock);
>  
>    if (*name == '\0' || strcmp (name, ".") == 0)
>      {
>        *np = dir;
> -      pthread_mutex_lock (&dir->lock);
>        netfs_nref (*np);
> -      pthread_mutex_unlock (&dir->lock);
> -      pthread_mutex_lock (&(*np)->lock);

These two are not the same lock, I have kept the two lines.

Samuel

>        return 0;
>      }
>  
> @@ -716,7 +712,6 @@ netfs_attempt_lookup (struct iouser *user, struct node 
> *dir,
>    if (current_node)
>      {
>        *np = current_node;
> -      pthread_mutex_lock (&dir->lock);
>        netfs_nref (*np);
>        pthread_mutex_unlock (&dir->lock);
>        pthread_mutex_lock (&(*np)->lock);
> @@ -724,6 +719,7 @@ netfs_attempt_lookup (struct iouser *user, struct node 
> *dir,
>      }
>  
>    *np = NULL;
> +  pthread_mutex_unlock (&dir->lock);
>    debug ("netfs_attempt_lookup (user: %p, dir: %p, name: %s):\n",
>            user, dir, name);
>    debug ("netfs_attempt_lookup return: ENOENT\n");
> -- 
> 2.43.0
> 

> From f9f844c98c0d6eea72905846d84989b11247b82f Mon Sep 17 00:00:00 2001
> From: Mikhail Karpov <[email protected]>
> Date: Wed, 26 Aug 2026 16:52:50 +0700
> Subject: [PATCH 2/3] Adding hooks for create and destroy peropen
> 
> ---
>  libnetfs/Makefile          |  2 +-
>  libnetfs/make-peropen.c    |  9 +++++++++
>  libnetfs/netfs.h           |  8 ++++++++
>  libnetfs/priv.c            | 26 ++++++++++++++++++++++++++
>  libnetfs/release-peropen.c |  8 ++++++++
>  5 files changed, 52 insertions(+), 1 deletion(-)
>  create mode 100644 libnetfs/priv.c
> 
> diff --git a/libnetfs/Makefile b/libnetfs/Makefile
> index 24606ff9..8f947a3c 100644
> --- a/libnetfs/Makefile
> +++ b/libnetfs/Makefile
> @@ -53,7 +53,7 @@ OTHERSRCS= drop-node.c init-init.c make-node.c 
> make-peropen.c make-protid.c   \
>       runtime-argp.c std-runtime-argp.c std-startup-argp.c                  \
>       append-std-options.c trans-callback.c set-get-trans.c                 \
>       nref.c nrele.c nput.c file-get-storage-info-default.c dead-name.c     \
> -     get-source.c
> +     get-source.c priv.c
>  
>  SRCS= $(OTHERSRCS) $(FSSRCS) $(IOSRCS) $(FSYSSRCS) $(IFSOCKSRCS)
>  
> diff --git a/libnetfs/make-peropen.c b/libnetfs/make-peropen.c
> index 3b127881..9bb48923 100644
> --- a/libnetfs/make-peropen.c
> +++ b/libnetfs/make-peropen.c
> @@ -43,6 +43,15 @@ netfs_make_peropen (struct node *np, int flags, struct 
> peropen *context)
>    po->np = np;
>    po->path = NULL;
>  
> +  if (netfs_peropen_create_hook)
> +    err = (*netfs_peropen_create_hook) (po);
> +  if (err)
> +    {
> +      fshelp_rlock_po_fini (&po->lock_status);
> +      free (po);
> +      return NULL;
> +    }
> +
>    if (context)
>      {
>        if (context->path)
> diff --git a/libnetfs/netfs.h b/libnetfs/netfs.h
> index 6fc53ce4..1f1d5c2c 100644
> --- a/libnetfs/netfs.h
> +++ b/libnetfs/netfs.h
> @@ -113,6 +113,14 @@ extern char *netfs_server_name;
>     version number.  */
>  extern char *netfs_server_version;
>  
> +/* If this variable is set, it is called internally every time a new peropen
> +   structure is created and initialized.  */
> +extern error_t (*netfs_peropen_create_hook) (struct peropen *po);
> +
> +/* If this variable is set, it is called internally every time a peropen
> +   structure is about to be destroyed.  */
> +extern void (*netfs_peropen_destroy_hook) (struct peropen *po);
> +
>  /* The user must define this function.  Make sure that NP->nn_stat is
>     filled with the most current information.  CRED identifies the user
>     responsible for the operation. NP is locked.  */
> diff --git a/libnetfs/priv.c b/libnetfs/priv.c
> new file mode 100644
> index 00000000..4a46606f
> --- /dev/null
> +++ b/libnetfs/priv.c
> @@ -0,0 +1,26 @@
> +/* Default values for weak variables
> +   Copyright (C) 2026 Free Software Foundation, Inc.
> +
> +   This file is part of the GNU Hurd.
> +
> +   The GNU Hurd is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU General Public License as
> +   published by the Free Software Foundation; either version 2, or (at
> +   your option) any later version.
> +
> +   The GNU Hurd is distributed in the hope that it will be useful, but
> +   WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   General Public License for more details.
> +
> +   You should have received a copy of the GNU General Public License
> +   along with this program; if not, write to the Free Software
> +   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA. */
> +
> +#include "netfs.h"
> +
> +error_t (*netfs_peropen_create_hook) (struct peropen *po)
> +  __attribute__ ((weak));
> +
> +void (*netfs_peropen_destroy_hook) (struct peropen *po)
> +  __attribute__ ((weak));
> diff --git a/libnetfs/release-peropen.c b/libnetfs/release-peropen.c
> index 43f4cba7..3dfca368 100644
> --- a/libnetfs/release-peropen.c
> +++ b/libnetfs/release-peropen.c
> @@ -26,6 +26,14 @@ netfs_release_peropen (struct peropen *po)
>    if (refcount_deref (&po->refcnt) > 0)
>      return;
>  
> +  if (netfs_peropen_destroy_hook)
> +    {
> +      refcount_unsafe_ref (&po->refcnt);
> +      (*netfs_peropen_destroy_hook) (po);
> +      if (refcount_deref (&po->refcnt) > 0)
> +        return;
> +    }
> +
>    pthread_mutex_lock (&po->np->lock);
>    if (po->root_parent)
>      mach_port_deallocate (mach_task_self (), po->root_parent);
> -- 
> 2.43.0
> 
> 


-- 
Samuel
«Tiens, quand j'aurai un peu de temps et une partition libre, je crois
 que je vais essayer de remplacer mes scripts de démarrage par des
 programmes Windows lancés via Wine et binfmt_misc :-)»
-+- AGV in Guide du linuxien pervers - "J'sais pas quoi faire... (air connu)"

Reply via email to