diff options
Diffstat (limited to 'sys/kern/kern_descrip.c')
-rw-r--r-- | sys/kern/kern_descrip.c | 7 |
1 files changed, 3 insertions, 4 deletions
diff --git a/sys/kern/kern_descrip.c b/sys/kern/kern_descrip.c index 36a4a79..2935223 100644 --- a/sys/kern/kern_descrip.c +++ b/sys/kern/kern_descrip.c @@ -2359,6 +2359,7 @@ fget_unlocked(struct filedesc *fdp, int fd, cap_rights_t *needrightsp, } } #endif + retry: count = fp->f_count; if (count == 0) { fdt = fdp->fd_files; @@ -2368,10 +2369,8 @@ fget_unlocked(struct filedesc *fdp, int fd, cap_rights_t *needrightsp, * Use an acquire barrier to force re-reading of fdt so it is * refreshed for verification. */ - if (atomic_cmpset_acq_int(&fp->f_count, count, count + 1) == 0) { - fdt = fdp->fd_files; - continue; - } + if (atomic_cmpset_acq_int(&fp->f_count, count, count + 1) == 0) + goto retry; fdt = fdp->fd_files; #ifdef CAPABILITIES if (seq_consistent_nomb(fd_seq(fdt, fd), seq)) |