Page MenuHomeFreeBSD

D25616.diff
No OneTemporary

D25616.diff

Index: head/sys/kern/kern_descrip.c
===================================================================
--- head/sys/kern/kern_descrip.c
+++ head/sys/kern/kern_descrip.c
@@ -3347,13 +3347,17 @@
fdp = td->td_proc->p_fd;
smr_enter(pwd_smr);
- for (;;) {
- pwd = smr_entered_load(&fdp->fd_pwd, pwd_smr);
- MPASS(pwd != NULL);
- if (refcount_acquire_if_not_zero(&pwd->pwd_refcount))
- break;
+ pwd = smr_entered_load(&fdp->fd_pwd, pwd_smr);
+ MPASS(pwd != NULL);
+ if (__predict_true(refcount_acquire_if_not_zero(&pwd->pwd_refcount))) {
+ smr_exit(pwd_smr);
+ return (pwd);
}
smr_exit(pwd_smr);
+ FILEDESC_SLOCK(fdp);
+ pwd = pwd_hold_filedesc(fdp);
+ MPASS(pwd != NULL);
+ FILEDESC_SUNLOCK(fdp);
return (pwd);
}

File Metadata

Mime Type
text/plain
Expires
Sat, Aug 22, 3:47 PM (6 h, 25 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
37094859
Default Alt Text
D25616.diff (731 B)

Event Timeline