Applied, thanks! Milos Nikic, le jeu. 12 févr. 2026 16:29:45 -0800, a ecrit: > Hey Samuel, > > Yeah we don't really need to do it, i was doing it for readability. > (in my mind these functions are getting too large and maybe it would be worth > splitting them into smaller functions...but that is a separate thing). > > But yeah assert works as well, and it has no impact on performance. > here is the updated patch, where assert_backtrace is used instead of an > explicit if statement. > Let me know. > > Thanks a lot, > Milos > > On Thu, Feb 12, 2026 at 3:39 PM Samuel Thibault <[1][email protected]> > wrote: > > Hello, > > Milos Nikic, le jeu. 12 févr. 2026 06:30:45 -0800, a ecrit: > > We don't always undo the link increases in error cases. > > Added logic the undo the changes to link count if an > > error occurred in those cases. > > --- > > libdiskfs/dir-rename.c | 12 ++++++++++-- > > libdiskfs/dir-renamed.c | 29 +++++++++++++++++++++++++++-- > > 2 files changed, 37 insertions(+), 4 deletions(-) > > > > diff --git a/libdiskfs/dir-rename.c b/libdiskfs/dir-rename.c > > index c8bb0dad..7953132b 100644 > > --- a/libdiskfs/dir-rename.c > > +++ b/libdiskfs/dir-rename.c > > @@ -188,12 +188,20 @@ diskfs_S_dir_rename (struct protid *fromcred, > > diskfs_node_update (tdp, 1); > > > > pthread_mutex_unlock (&tdp->lock); > > - pthread_mutex_unlock (&fnp->lock); > > if (err) > > { > > - diskfs_nrele (fnp); > > + if (fnp->dn_stat.st_nlink > 0) > > Do we really need to check these? We have increased it just above, and > haven't released the mutex. We're actually the owner of that reference, > it'd rather be an assert. > > > + { > > + fnp->dn_stat.st_nlink--; > > + fnp->dn_set_ctime = 1; > > + if (diskfs_synchronous) > > + diskfs_node_update (fnp, 1); > > + } > > + diskfs_drop_dirstat (tdp, ds); > > + diskfs_nput (fnp); > > return err; > > } > > + pthread_mutex_unlock (&fnp->lock); > > > > /* We now hold no locks */ > > > > diff --git a/libdiskfs/dir-renamed.c b/libdiskfs/dir-renamed.c > > index 1f3f3de4..532ff998 100644 > > --- a/libdiskfs/dir-renamed.c > > +++ b/libdiskfs/dir-renamed.c > > @@ -159,6 +159,13 @@ diskfs_rename_dir (struct node *fdp, struct node > *fnp, const char *fromname, > > assert_backtrace (err != ENOENT); > > if (err) > > { > > + if (tdp->dn_stat.st_nlink > 0) > > + { > > + tdp->dn_stat.st_nlink--; > > + tdp->dn_set_ctime = 1; > > + if (diskfs_synchronous) > > + diskfs_node_update (tdp, 1); > > + } > > diskfs_drop_dirstat (fnp, tmpds); > > goto out; > > } > > @@ -168,7 +175,16 @@ diskfs_rename_dir (struct node *fdp, struct node > *fnp, const char *fromname, > > if (diskfs_synchronous) > > diskfs_file_update (fnp, 1); > > if (err) > > - goto out; > > + { > > + if (tdp->dn_stat.st_nlink > 0) > > + { > > + tdp->dn_stat.st_nlink--; > > + tdp->dn_set_ctime = 1; > > + if (diskfs_synchronous) > > + diskfs_node_update (tdp, 1); > > + } > > + goto out; > > + } > > > > fdp->dn_stat.st_nlink--; > > fdp->dn_set_ctime = 1; > > @@ -213,7 +229,16 @@ diskfs_rename_dir (struct node *fdp, struct node > *fnp, const char *fromname, > > } > > > > if (err) > > - goto out; > > + { > > + if (fnp->dn_stat.st_nlink > 0) > > + { > > + fnp->dn_stat.st_nlink--; > > + fnp->dn_set_ctime = 1; > > + if (diskfs_synchronous) > > + diskfs_node_update (fnp, 1); > > + } > > + goto out; > > + } > > > > /* 4: Remove the entry in fdp. */ > > ds = buf; > > -- > > 2.52.0 > > > > -- > Samuel > "...Unix, MS-DOS, and Windows NT (also known as the Good, the Bad, and > the Ugly)." > (By Matt Welsh) > > > References: > > [1] mailto:[email protected]
> From 253032a144192aa34fb456c072c7e30ec96a9662 Mon Sep 17 00:00:00 2001 > From: Milos Nikic <[email protected]> > Date: Thu, 12 Feb 2026 06:06:16 -0800 > Subject: [PATCH] libdiskfs: fix cleanups in dir-rename and dir-renamed > > We don't always undo the link increases in error cases. > Added logic the undo the changes to link count if an > error occurred in those cases. > --- > libdiskfs/dir-rename.c | 10 ++++++++-- > libdiskfs/dir-renamed.c | 23 +++++++++++++++++++++-- > 2 files changed, 29 insertions(+), 4 deletions(-) > > diff --git a/libdiskfs/dir-rename.c b/libdiskfs/dir-rename.c > index c8bb0dad..6b4e9a7d 100644 > --- a/libdiskfs/dir-rename.c > +++ b/libdiskfs/dir-rename.c > @@ -188,12 +188,18 @@ diskfs_S_dir_rename (struct protid *fromcred, > diskfs_node_update (tdp, 1); > > pthread_mutex_unlock (&tdp->lock); > - pthread_mutex_unlock (&fnp->lock); > if (err) > { > - diskfs_nrele (fnp); > + assert_backtrace (fnp->dn_stat.st_nlink > 0); > + fnp->dn_stat.st_nlink--; > + fnp->dn_set_ctime = 1; > + if (diskfs_synchronous) > + diskfs_node_update (fnp, 1); > + diskfs_drop_dirstat (tdp, ds); > + diskfs_nput (fnp); > return err; > } > + pthread_mutex_unlock (&fnp->lock); > > /* We now hold no locks */ > > diff --git a/libdiskfs/dir-renamed.c b/libdiskfs/dir-renamed.c > index 1f3f3de4..a68dc07c 100644 > --- a/libdiskfs/dir-renamed.c > +++ b/libdiskfs/dir-renamed.c > @@ -159,6 +159,11 @@ diskfs_rename_dir (struct node *fdp, struct node *fnp, > const char *fromname, > assert_backtrace (err != ENOENT); > if (err) > { > + assert_backtrace (tdp->dn_stat.st_nlink > 0); > + tdp->dn_stat.st_nlink--; > + tdp->dn_set_ctime = 1; > + if (diskfs_synchronous) > + diskfs_node_update (tdp, 1); > diskfs_drop_dirstat (fnp, tmpds); > goto out; > } > @@ -168,7 +173,14 @@ diskfs_rename_dir (struct node *fdp, struct node *fnp, > const char *fromname, > if (diskfs_synchronous) > diskfs_file_update (fnp, 1); > if (err) > - goto out; > + { > + assert_backtrace (tdp->dn_stat.st_nlink > 0); > + tdp->dn_stat.st_nlink--; > + tdp->dn_set_ctime = 1; > + if (diskfs_synchronous) > + diskfs_node_update (tdp, 1); > + goto out; > + } > > fdp->dn_stat.st_nlink--; > fdp->dn_set_ctime = 1; > @@ -213,7 +225,14 @@ diskfs_rename_dir (struct node *fdp, struct node *fnp, > const char *fromname, > } > > if (err) > - goto out; > + { > + assert_backtrace (fnp->dn_stat.st_nlink > 0); > + fnp->dn_stat.st_nlink--; > + fnp->dn_set_ctime = 1; > + if (diskfs_synchronous) > + diskfs_node_update (fnp, 1); > + goto out; > + } > > /* 4: Remove the entry in fdp. */ > ds = buf; > -- > 2.52.0 > -- Samuel (03:13:14) <j> bon (03:13:19) <j> il est tard :p (03:13:25) <g> c'est l'heure de manger (03:13:38) <j> hm j'ai mangé à 1h moi, j'ai des horaires raisonnables
