Page MenuHomeFreeBSD

D40955.id124420.diff
No OneTemporary

D40955.id124420.diff

diff --git a/sys/kern/kern_descrip.c b/sys/kern/kern_descrip.c
--- a/sys/kern/kern_descrip.c
+++ b/sys/kern/kern_descrip.c
@@ -495,7 +495,7 @@
struct vnode *vp;
struct mount *mp;
struct kinfo_file *kif;
- int error, flg, kif_sz, seals, tmp;
+ int error, flg, kif_sz, seals, tmp, got_set, got_cleared;
uint64_t bsize;
off_t foffset;
@@ -573,12 +573,12 @@
tmp &= ~FCNTLFLAGS;
tmp |= FFLAGS(arg & ~O_ACCMODE) & FCNTLFLAGS;
} while (atomic_cmpset_int(&fp->f_flag, flg, tmp) == 0);
+ got_set = tmp & ~flg;
+ got_cleared = flg & ~tmp;
tmp = fp->f_flag & FNONBLOCK;
error = fo_ioctl(fp, FIONBIO, &tmp, td->td_ucred, td);
- if (error != 0) {
- fdrop(fp, td);
- break;
- }
+ if (error != 0)
+ goto revert_f_setfl;
tmp = fp->f_flag & FASYNC;
error = fo_ioctl(fp, FIOASYNC, &tmp, td->td_ucred, td);
if (error == 0) {
@@ -588,6 +588,13 @@
atomic_clear_int(&fp->f_flag, FNONBLOCK);
tmp = 0;
(void)fo_ioctl(fp, FIONBIO, &tmp, td->td_ucred, td);
+revert_f_setfl:
+ do {
+ tmp = flg = fp->f_flag;
+ tmp &= ~FCNTLFLAGS;
+ tmp |= got_cleared;
+ tmp &= ~got_set;
+ } while (atomic_cmpset_int(&fp->f_flag, flg, tmp) == 0);
fdrop(fp, td);
break;

File Metadata

Mime Type
text/plain
Expires
Mon, Feb 9, 12:37 PM (19 h, 24 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
28579918
Default Alt Text
D40955.id124420.diff (1 KB)

Event Timeline