Applied, thanks! Mikhail Karpov, le dim. 04 oct. 2026 13:40:53 +0700, a ecrit: > Hello, > > The comment for the netfs_S_dir_mkfile function which calls > netfs_attempt_mkfile implies that after the call, the dir mutex should be > unlocked and the np mutex locked; however, this expectation is not reflected > in the comment explaining netfs_attempt_mkfile itself. Examining the code > of netfs translators that implement this function (such as console-client) > reveals that they do indeed call pthread_mutex_lock (&(*np)->lock). > I believe we should document this in the comment. Additionally, > netfs_S_dir_mkfile shows that the np variable is not accessed in the event > of an error, so setting it to NULL in that case serves no purpose; I think > we should remove the NULL assignment to avoid confusion. > > Furthermore, in some netfs translators, the mutexes in netfs_attempt_mkfile > and netfs_attempt_create_file were not being unlocked. This can cause > issues when attempting to create a file within such a translator (for > instance, when trying to create a file in the /proc directory). These > problems can be easily avoided by unlocking the dir mutex before exiting > these functions. > > Thanks, > > -- > Mikhail Karpov
> From 32edd69e556e7d3025b3cbf31a8b95b0dc83c2f0 Mon Sep 17 00:00:00 2001 > From: Mikhail Karpov <[email protected]> > Date: Sun, 4 Oct 2026 11:32:50 +0700 > Subject: [PATCH 2/3] Updated the comment for netfs_attempt_mkfile > > --- > acpi/netfs_impl.c | 3 ++- > console-client/trans.c | 4 ++-- > eth-multiplexer/netfs_impl.c | 3 ++- > ftpfs/netfs.c | 3 ++- > hostmux/stubs.c | 3 ++- > libnetfs/netfs.h | 3 ++- > pci-arbiter/netfs_impl.c | 3 ++- > procfs/netfs.c | 3 ++- > usermux/stubs.c | 3 ++- > 9 files changed, 18 insertions(+), 10 deletions(-) > > diff --git a/acpi/netfs_impl.c b/acpi/netfs_impl.c > index e37c7f6..248824b 100644 > --- a/acpi/netfs_impl.c > +++ b/acpi/netfs_impl.c > @@ -468,7 +468,8 @@ netfs_attempt_link (struct iouser * user, struct node * > dir, > } > > /* Attempt to create an anonymous file related to DIR for USER with MODE. > - Set *NODE to the returned file upon success. No matter what, unlock DIR. > */ > + Set *NODE to the returned file upon success. *NP should be locked on > + success; no matter what, unlock DIR before returning. */ > error_t > netfs_attempt_mkfile (struct iouser * user, struct node * dir, > mode_t mode, struct node ** node) > diff --git a/console-client/trans.c b/console-client/trans.c > index 24e22e6..599aab2 100644 > --- a/console-client/trans.c > +++ b/console-client/trans.c > @@ -481,8 +481,8 @@ netfs_attempt_link (struct iouser *user, struct node *dir, > > > /* Attempt to create an anonymous file related to DIR (which is > - locked) for USER with MODE. Set *NP to the returned file upon > - success. No matter what, unlock DIR. */ > + locked) for USER with MODE. *NP should be locked on success; > + no matter what, unlock DIR before returning. */ > error_t > netfs_attempt_mkfile (struct iouser *user, struct node *dir, > mode_t mode, struct node **np) > diff --git a/eth-multiplexer/netfs_impl.c b/eth-multiplexer/netfs_impl.c > index 2c8b18b..c3bd81e 100644 > --- a/eth-multiplexer/netfs_impl.c > +++ b/eth-multiplexer/netfs_impl.c > @@ -479,7 +479,8 @@ error_t netfs_attempt_link (struct iouser *user, struct > node *dir, > } > > /* Attempt to create an anonymous file related to DIR for USER with MODE. > - Set *NODE to the returned file upon success. No matter what, unlock DIR. > */ > + Set *NODE to the returned file upon success. *NP should be locked on > + success; no matter what, unlock DIR before returning. */ > error_t netfs_attempt_mkfile (struct iouser *user, struct node *dir, > mode_t mode, struct node **node) > { > diff --git a/ftpfs/netfs.c b/ftpfs/netfs.c > index a6481c1..0d06fd0 100644 > --- a/ftpfs/netfs.c > +++ b/ftpfs/netfs.c > @@ -404,7 +404,8 @@ error_t netfs_attempt_link (struct iouser *user, struct > node *dir, > } > > /* Attempt to create an anonymous file related to DIR for USER with MODE. > - Set *NODE to the returned file upon success. No matter what, unlock DIR. > */ > + Set *NODE to the returned file upon success. *NP should be locked on > + success; no matter what, unlock DIR before returning. */ > error_t netfs_attempt_mkfile (struct iouser *user, struct node *dir, > mode_t mode, struct node **node) > { > diff --git a/hostmux/stubs.c b/hostmux/stubs.c > index ae4daeb..37e1bc4 100644 > --- a/hostmux/stubs.c > +++ b/hostmux/stubs.c > @@ -114,7 +114,8 @@ netfs_attempt_link (struct iouser *user, struct node *dir, > } > > /* Attempt to create an anonymous file related to DIR for USER with MODE. > - Set *NODE to the returned file upon success. No matter what, unlock DIR. > */ > + Set *NODE to the returned file upon success. *NP should be locked on > + success; no matter what, unlock DIR before returning. */ > error_t > netfs_attempt_mkfile (struct iouser *user, struct node *dir, > mode_t mode, struct node **node) > diff --git a/libnetfs/netfs.h b/libnetfs/netfs.h > index 1f1d5c2..b493c09 100644 > --- a/libnetfs/netfs.h > +++ b/libnetfs/netfs.h > @@ -248,7 +248,8 @@ error_t netfs_attempt_link (struct iouser *user, struct > node *dir, > > /* The user must define this function. Attempt to create an anonymous > file related to DIR (which is locked) for USER with MODE. Set *NP > - to the returned file upon success. No matter what, unlock DIR. */ > + to the returned file upon success. *NP should be locked on success; > + no matter what, unlock DIR before returning. */ > error_t netfs_attempt_mkfile (struct iouser *user, struct node *dir, > mode_t mode, struct node **np); > > diff --git a/pci-arbiter/netfs_impl.c b/pci-arbiter/netfs_impl.c > index 82e618a..7a6f1aa 100644 > --- a/pci-arbiter/netfs_impl.c > +++ b/pci-arbiter/netfs_impl.c > @@ -474,7 +474,8 @@ netfs_attempt_link (struct iouser * user, struct node * > dir, > } > > /* Attempt to create an anonymous file related to DIR for USER with MODE. > - Set *NODE to the returned file upon success. No matter what, unlock DIR. > */ > + Set *NODE to the returned file upon success. *NP should be locked on > + success; no matter what, unlock DIR before returning. */ > error_t > netfs_attempt_mkfile (struct iouser * user, struct node * dir, > mode_t mode, struct node ** node) > diff --git a/procfs/netfs.c b/procfs/netfs.c > index 4ed5eab..a0f1b48 100644 > --- a/procfs/netfs.c > +++ b/procfs/netfs.c > @@ -434,7 +434,8 @@ error_t netfs_attempt_link (struct iouser *user, struct > node *dir, > > /* The user must define this function. Attempt to create an anonymous > file related to DIR (which is locked) for USER with MODE. Set *NP > - to the returned file upon success. No matter what, unlock DIR. */ > + to the returned file upon success. *NP should be locked on success; > + no matter what, unlock DIR before returning. */ > error_t netfs_attempt_mkfile (struct iouser *user, struct node *dir, > mode_t mode, struct node **np) > { > diff --git a/usermux/stubs.c b/usermux/stubs.c > index c3b9b96..b7166c2 100644 > --- a/usermux/stubs.c > +++ b/usermux/stubs.c > @@ -114,7 +114,8 @@ netfs_attempt_link (struct iouser *user, struct node *dir, > } > > /* Attempt to create an anonymous file related to DIR for USER with MODE. > - Set *NODE to the returned file upon success. No matter what, unlock DIR. > */ > + Set *NODE to the returned file upon success. *NP should be locked on > + success; no matter what, unlock DIR before returning. */ > error_t > netfs_attempt_mkfile (struct iouser *user, struct node *dir, > mode_t mode, struct node **node) > -- > 2.43.0 > > From 8b64d28f5eb4c8f7f56633ae4cc90b14b6fe72b8 Mon Sep 17 00:00:00 2001 > From: Mikhail Karpov <[email protected]> > Date: Sun, 4 Oct 2026 12:45:24 +0700 > Subject: [PATCH 3/3] Unlocking mutexes in libnetfs callbacks > > --- > acpi/netfs_impl.c | 1 + > console-client/trans.c | 8 ++------ > console/console.c | 1 + > eth-multiplexer/netfs_impl.c | 1 - > ftpfs/netfs.c | 1 - > hostmux/stubs.c | 1 - > nfs/ops.c | 6 ++++-- > pci-arbiter/netfs_impl.c | 1 + > procfs/netfs.c | 3 +++ > usermux/stubs.c | 1 + > 10 files changed, 13 insertions(+), 11 deletions(-) > > diff --git a/acpi/netfs_impl.c b/acpi/netfs_impl.c > index 248824b..4ea5c60 100644 > --- a/acpi/netfs_impl.c > +++ b/acpi/netfs_impl.c > @@ -474,6 +474,7 @@ error_t > netfs_attempt_mkfile (struct iouser * user, struct node * dir, > mode_t mode, struct node ** node) > { > + pthread_mutex_unlock (&dir->lock); > return EOPNOTSUPP; > } > > diff --git a/console-client/trans.c b/console-client/trans.c > index 599aab2..db41b11 100644 > --- a/console-client/trans.c > +++ b/console-client/trans.c > @@ -491,13 +491,9 @@ netfs_attempt_mkfile (struct iouser *user, struct node > *dir, > struct netnode *nn; > > err = fshelp_access (&dir->nn_stat, S_IWRITE, user); > - if (err) > - { > - *np = 0; > - return err; > - } > - > pthread_mutex_unlock (&dir->lock); > + if (err) > + return err; > > nn = calloc (1, sizeof (*nn)); > if (!nn) > diff --git a/console/console.c b/console/console.c > index e7d7ed5..efc83da 100644 > --- a/console/console.c > +++ b/console/console.c > @@ -1113,6 +1113,7 @@ error_t > netfs_attempt_mkfile (struct iouser *user, struct node *dir, > mode_t mode, struct node **np) > { > + pthread_mutex_unlock (&dir->lock); > return EOPNOTSUPP; > } > > diff --git a/eth-multiplexer/netfs_impl.c b/eth-multiplexer/netfs_impl.c > index c3bd81e..bf620da 100644 > --- a/eth-multiplexer/netfs_impl.c > +++ b/eth-multiplexer/netfs_impl.c > @@ -485,7 +485,6 @@ error_t netfs_attempt_mkfile (struct iouser *user, struct > node *dir, > mode_t mode, struct node **node) > { > debug(""); > - *node = 0; > pthread_mutex_unlock (&dir->lock); > return EOPNOTSUPP; > } > diff --git a/ftpfs/netfs.c b/ftpfs/netfs.c > index 0d06fd0..eb66534 100644 > --- a/ftpfs/netfs.c > +++ b/ftpfs/netfs.c > @@ -409,7 +409,6 @@ error_t netfs_attempt_link (struct iouser *user, struct > node *dir, > error_t netfs_attempt_mkfile (struct iouser *user, struct node *dir, > mode_t mode, struct node **node) > { > - *node = 0; > pthread_mutex_unlock (&dir->lock); > return EROFS; > } > diff --git a/hostmux/stubs.c b/hostmux/stubs.c > index 37e1bc4..f471fd2 100644 > --- a/hostmux/stubs.c > +++ b/hostmux/stubs.c > @@ -120,7 +120,6 @@ error_t > netfs_attempt_mkfile (struct iouser *user, struct node *dir, > mode_t mode, struct node **node) > { > - *node = 0; > pthread_mutex_unlock (&dir->lock); > return EOPNOTSUPP; > } > diff --git a/nfs/ops.c b/nfs/ops.c > index c87ec72..c95fb0d 100644 > --- a/nfs/ops.c > +++ b/nfs/ops.c > @@ -1255,8 +1255,9 @@ netfs_attempt_mkfile (struct iouser *cred, struct node > *dir, > name = malloc (50); > if (! name) > { > + err = errno; > pthread_mutex_unlock (&dir->lock); > - return ENOMEM; > + return err; > } > > do > @@ -1295,6 +1296,8 @@ netfs_attempt_create_file (struct iouser *cred, struct > node *np, > error_t err; > uid_t owner; > > + *newnp = 0; > + > if (cred->uids->num) > owner = cred->uids->ids[0]; > else > @@ -1342,7 +1345,6 @@ netfs_attempt_create_file (struct iouser *cred, struct > node *np, > p = xdr_encode_create_state (p, mode, owner); > > err = conduct_rpc (&rpcbuf, &p); > - *newnp = 0; > > pthread_mutex_unlock (&np->lock); > > diff --git a/pci-arbiter/netfs_impl.c b/pci-arbiter/netfs_impl.c > index 7a6f1aa..a5ab0af 100644 > --- a/pci-arbiter/netfs_impl.c > +++ b/pci-arbiter/netfs_impl.c > @@ -480,6 +480,7 @@ error_t > netfs_attempt_mkfile (struct iouser * user, struct node * dir, > mode_t mode, struct node ** node) > { > + pthread_mutex_unlock (&dir->lock); > return EOPNOTSUPP; > } > > diff --git a/procfs/netfs.c b/procfs/netfs.c > index a0f1b48..f9b4302 100644 > --- a/procfs/netfs.c > +++ b/procfs/netfs.c > @@ -439,6 +439,7 @@ error_t netfs_attempt_link (struct iouser *user, struct > node *dir, > error_t netfs_attempt_mkfile (struct iouser *user, struct node *dir, > mode_t mode, struct node **np) > { > + pthread_mutex_unlock (&dir->lock); > return EROFS; > } > > @@ -449,6 +450,8 @@ error_t netfs_attempt_mkfile (struct iouser *user, struct > node *dir, > error_t netfs_attempt_create_file (struct iouser *user, struct node *dir, > const char *name, mode_t mode, struct node > **np) > { > + *np = NULL; > + pthread_mutex_unlock (&dir->lock); > return EROFS; > } > > diff --git a/usermux/stubs.c b/usermux/stubs.c > index b7166c2..876347c 100644 > --- a/usermux/stubs.c > +++ b/usermux/stubs.c > @@ -120,6 +120,7 @@ error_t > netfs_attempt_mkfile (struct iouser *user, struct node *dir, > mode_t mode, struct node **node) > { > + pthread_mutex_unlock (&dir->lock); > return EOPNOTSUPP; > } > > -- > 2.43.0 > -- Samuel SL> Au fait elle est mieux ma signature maintenant ? Oui. T'enlève encore les conneries que t'as écrit dedans et c'est bon. -+- JB in <http://neuneu.mine.nu> : Le neueuttoyage par le vide -+-
