Applied, thanks!
Milos Nikic, le dim. 27 sept. 2026 15:02:59 -0700, a ecrit:
> In all the places libdiskfs interacts with the journal it does, more or
> less, the same thing at the end of the function.
> Extract that logic into a function and call it from those places so we don't
> have to repeat almost identical code many times across RPC handlers.
> ---
> libdiskfs/dir-link.c | 5 +----
> libdiskfs/dir-lookup.c | 5 +----
> libdiskfs/dir-mkdir.c | 5 +----
> libdiskfs/dir-mkfile.c | 5 +----
> libdiskfs/dir-rename.c | 5 +----
> libdiskfs/dir-renamed.c | 5 +----
> libdiskfs/dir-rmdir.c | 5 +----
> libdiskfs/dir-unlink.c | 5 +----
> libdiskfs/file-set-trans.c | 5 +----
> libdiskfs/io-prenotify.c | 5 +----
> libdiskfs/io-sigio.c | 2 +-
> libdiskfs/io-write.c | 5 +----
> libdiskfs/priv.h | 25 +++++++++++++++++++++----
> 13 files changed, 33 insertions(+), 49 deletions(-)
>
> diff --git a/libdiskfs/dir-link.c b/libdiskfs/dir-link.c
> index 608ff2183..7892d49e9 100644
> --- a/libdiskfs/dir-link.c
> +++ b/libdiskfs/dir-link.c
> @@ -147,9 +147,6 @@ diskfs_S_dir_link (struct protid *dircred,
> /* MiG won't do this for us, which it ought to. */
> mach_port_deallocate (mach_task_self (), filecred->pi.port_right);
>
> - if (!err && (diskfs_synchronous || diskfs_journal_needs_sync (txn)))
> - diskfs_journal_commit_transaction (txn);
> - else
> - diskfs_journal_stop_transaction (txn);
> + diskfs_journal_end_transaction (txn, !err, diskfs_synchronous);
> return err;
> }
> diff --git a/libdiskfs/dir-lookup.c b/libdiskfs/dir-lookup.c
> index 77cdbe08c..875036670 100644
> --- a/libdiskfs/dir-lookup.c
> +++ b/libdiskfs/dir-lookup.c
> @@ -573,10 +573,7 @@ diskfs_S_dir_lookup (struct protid *dircred,
> ports_port_deref (newpi);
> if (newpo)
> diskfs_release_peropen (newpo);
> - if (newnode && !err && (diskfs_synchronous || diskfs_journal_needs_sync
> (txn)))
> - diskfs_journal_commit_transaction (txn);
> - else
> - diskfs_journal_stop_transaction (txn);
> + diskfs_journal_end_transaction (txn, newnode && !err, diskfs_synchronous);
>
> free (relpath);
>
> diff --git a/libdiskfs/dir-mkdir.c b/libdiskfs/dir-mkdir.c
> index 3adaa404e..55295c6be 100644
> --- a/libdiskfs/dir-mkdir.c
> +++ b/libdiskfs/dir-mkdir.c
> @@ -69,9 +69,6 @@ diskfs_S_dir_mkdir (struct protid *dircred,
>
> pthread_mutex_unlock (&dnp->lock);
>
> - if (!error && (diskfs_synchronous || diskfs_journal_needs_sync (txn)))
> - diskfs_journal_commit_transaction (txn);
> - else
> - diskfs_journal_stop_transaction (txn);
> + diskfs_journal_end_transaction (txn, !error, diskfs_synchronous);
> return error;
> }
> diff --git a/libdiskfs/dir-mkfile.c b/libdiskfs/dir-mkfile.c
> index 7cffc25cd..ace1320d5 100644
> --- a/libdiskfs/dir-mkfile.c
> +++ b/libdiskfs/dir-mkfile.c
> @@ -92,9 +92,6 @@ diskfs_S_dir_mkfile (struct protid *cred,
> if (np)
> diskfs_nput (np);
>
> - if (!err && (diskfs_synchronous || diskfs_journal_needs_sync (txn)))
> - diskfs_journal_commit_transaction (txn);
> - else
> - diskfs_journal_stop_transaction (txn);
> + diskfs_journal_end_transaction (txn, !err, diskfs_synchronous);
> return err;
> }
> diff --git a/libdiskfs/dir-rename.c b/libdiskfs/dir-rename.c
> index 6328351ad..63aff41f1 100644
> --- a/libdiskfs/dir-rename.c
> +++ b/libdiskfs/dir-rename.c
> @@ -257,10 +257,7 @@ diskfs_S_dir_rename (struct protid *fromcred,
> pthread_mutex_unlock (&fdp->lock);
>
> out:
> - if (! err && (diskfs_synchronous || diskfs_journal_needs_sync (txn)))
> - diskfs_journal_commit_transaction (txn);
> - else
> - diskfs_journal_stop_transaction (txn);
> + diskfs_journal_end_transaction (txn, !err, diskfs_synchronous);
> if (!err)
> mach_port_deallocate (mach_task_self (), tocred->pi.port_right);
> return err;
> diff --git a/libdiskfs/dir-renamed.c b/libdiskfs/dir-renamed.c
> index 67174874d..ed468b539 100644
> --- a/libdiskfs/dir-renamed.c
> +++ b/libdiskfs/dir-renamed.c
> @@ -281,9 +281,6 @@ diskfs_rename_dir (struct node *fdp, struct node *fnp,
> const char *fromname,
> diskfs_drop_dirstat (tdp, ds);
>
> /* FINALIZE TRANSACTION */
> - if (! err && (diskfs_synchronous || diskfs_journal_needs_sync (txn)))
> - diskfs_journal_commit_transaction (txn);
> - else
> - diskfs_journal_stop_transaction (txn);
> + diskfs_journal_end_transaction (txn, !err, diskfs_synchronous);
> return err;
> }
> diff --git a/libdiskfs/dir-rmdir.c b/libdiskfs/dir-rmdir.c
> index 82c20a7ea..0a0f4224c 100644
> --- a/libdiskfs/dir-rmdir.c
> +++ b/libdiskfs/dir-rmdir.c
> @@ -41,10 +41,7 @@ diskfs_S_dir_rmdir (struct protid *dircred,
> if (ds)
> diskfs_drop_dirstat (dnp, ds);
> pthread_mutex_unlock (&dnp->lock);
> - if (!error && (diskfs_synchronous || diskfs_journal_needs_sync (txn)))
> - diskfs_journal_commit_transaction (txn);
> - else
> - diskfs_journal_stop_transaction (txn);
> + diskfs_journal_end_transaction (txn, !error, diskfs_synchronous);
>
> return error;
> }
> diff --git a/libdiskfs/dir-unlink.c b/libdiskfs/dir-unlink.c
> index 85df1c977..eaf62f9b8 100644
> --- a/libdiskfs/dir-unlink.c
> +++ b/libdiskfs/dir-unlink.c
> @@ -100,10 +100,7 @@ diskfs_S_dir_unlink (struct protid *dircred,
> mach_port_deallocate (mach_task_self (), control);
> }
>
> - if (diskfs_synchronous || diskfs_journal_needs_sync (txn))
> - diskfs_journal_commit_transaction (txn);
> - else
> - diskfs_journal_stop_transaction (txn);
> + diskfs_journal_end_transaction (txn, 1, diskfs_synchronous);
>
> return err;
> }
> diff --git a/libdiskfs/file-set-trans.c b/libdiskfs/file-set-trans.c
> index c35a79591..3aa732866 100644
> --- a/libdiskfs/file-set-trans.c
> +++ b/libdiskfs/file-set-trans.c
> @@ -245,10 +245,7 @@ diskfs_S_file_set_translator (struct protid *cred,
> else
> ret_val = err;
> out:
> - if (! err && (diskfs_synchronous || diskfs_journal_needs_sync (txn)))
> - diskfs_journal_commit_transaction(txn);
> - else
> - diskfs_journal_stop_transaction (txn);
> + diskfs_journal_end_transaction (txn, !err, diskfs_synchronous);
>
> return ret_val;
> }
> diff --git a/libdiskfs/io-prenotify.c b/libdiskfs/io-prenotify.c
> index c6ff00dd5..b80556d9b 100644
> --- a/libdiskfs/io-prenotify.c
> +++ b/libdiskfs/io-prenotify.c
> @@ -74,9 +74,6 @@ diskfs_S_io_prenotify (struct protid *cred,
> diskfs_notice_filechange (np, FILE_CHANGED_EXTEND, 0, end);
> out:
> pthread_mutex_unlock (&np->lock);
> - if (!err && (diskfs_synchronous || diskfs_journal_needs_sync (txn)))
> - diskfs_journal_commit_transaction (txn);
> - else
> - diskfs_journal_stop_transaction (txn);
> + diskfs_journal_end_transaction (txn, !err, diskfs_synchronous);
> return err;
> }
> diff --git a/libdiskfs/io-sigio.c b/libdiskfs/io-sigio.c
> index 0fc226dc1..42a726e46 100644
> --- a/libdiskfs/io-sigio.c
> +++ b/libdiskfs/io-sigio.c
> @@ -39,6 +39,6 @@ diskfs_S_io_sigio (struct protid *cred)
> diskfs_file_update (cred->po->np, 1);
>
> pthread_mutex_unlock (&cred->po->np->lock);
> - diskfs_journal_commit_transaction (txn);
> + diskfs_journal_end_transaction (txn, 1, 1);
> return 0;
> }
> diff --git a/libdiskfs/io-write.c b/libdiskfs/io-write.c
> index 73207f4e3..c07b8c790 100644
> --- a/libdiskfs/io-write.c
> +++ b/libdiskfs/io-write.c
> @@ -96,9 +96,6 @@ diskfs_S_io_write (struct protid *cred,
> diskfs_notice_filechange (np, FILE_CHANGED_WRITE, off, off + nwritten);
> out:
> pthread_mutex_unlock (&np->lock);
> - if (!err && (should_sync || diskfs_journal_needs_sync (txn)))
> - diskfs_journal_commit_transaction (txn);
> - else
> - diskfs_journal_stop_transaction (txn);
> + diskfs_journal_end_transaction (txn, !err, should_sync);
> return err;
> }
> diff --git a/libdiskfs/priv.h b/libdiskfs/priv.h
> index dc3d418fe..071f707ed 100644
> --- a/libdiskfs/priv.h
> +++ b/libdiskfs/priv.h
> @@ -120,6 +120,26 @@ extern pthread_spinlock_t _diskfs_control_lock;
> extern fshelp_fetch_root_callback1_t _diskfs_translator_callback1;
> extern fshelp_fetch_root_callback2_t _diskfs_translator_callback2;
>
> +/* Consume TXN.
> + Wait for the commit when COMMIT_OK is true and either SYNC is true or a
> + participant called diskfs_journal_set_sync. Otherwise stop without
> waiting.
> +
> + COMMIT_OK is false when this RPC failed and must not wait. Paths that
> + return before the operation has done its work, and diskfs_drop_node, call
> + diskfs_journal_stop_transaction directly so they cannot commit. */
> +static inline void
> +diskfs_journal_end_transaction (diskfs_transaction_t *txn,
> + int commit_ok, int sync)
> +{
> + if (!txn)
> + return;
> +
> + if (commit_ok && (sync || diskfs_journal_needs_sync (txn)))
> + diskfs_journal_commit_transaction (txn);
> + else
> + diskfs_journal_stop_transaction (txn);
> +}
> +
> /* This macro locks the node associated with PROTID, and then
> evaluates the expression OPERATION; then it syncs the inode
> (without waiting) and unlocks everything, and then returns
> @@ -143,10 +163,7 @@ extern fshelp_fetch_root_callback2_t
> _diskfs_translator_callback2;
> (OPERATION);
> \
> diskfs_node_update (np, diskfs_synchronous);
> \
> pthread_mutex_unlock (&np->lock); \
> - if (diskfs_synchronous || diskfs_journal_needs_sync (txn)) \
> - diskfs_journal_commit_transaction (txn); \
> - else
> \
> - diskfs_journal_stop_transaction (txn); \
> + diskfs_journal_end_transaction (txn, 1, diskfs_synchronous);
> \
> return err;
> \
> })
>
> --
> 2.55.0
>
--
Samuel
> Allez, soyez sympa ... traduisez-lui "linux"
Linux, c'est comme le miel : c'est vachement bon mais ça attire les
mouches. En plus, ça colle aux doigts et on a du mal à s'en défaire.
-+- TP in: Guide du linuxien pervers - "Barrez vous les mouches !"