PERFORCE change 101288 for review
John Baldwin
jhb at FreeBSD.org
Tue Jul 11 20:12:09 UTC 2006
http://perforce.freebsd.org/chv.cgi?CH=101288
Change 101288 by jhb at jhb_mutex on 2006/07/11 20:12:08
Make ibcs2 consumers of VOP_READDIR() and friends MPSAFE.
Affected files ...
.. //depot/projects/smpng/sys/i386/ibcs2/ibcs2_misc.c#28 edit
.. //depot/projects/smpng/sys/i386/ibcs2/syscalls.master#15 edit
.. //depot/projects/smpng/sys/notes#77 edit
Differences ...
==== //depot/projects/smpng/sys/i386/ibcs2/ibcs2_misc.c#28 (text+ko) ====
@@ -329,7 +329,7 @@
struct iovec aiov;
struct ibcs2_dirent idb;
off_t off; /* true file offset */
- int buflen, error, eofflag;
+ int buflen, error, eofflag, vfslocked;
u_long *cookies = NULL, *cookiep;
int ncookies;
#define BSD_DIRENT(cp) ((struct dirent *)(cp))
@@ -342,7 +342,9 @@
return (EBADF);
}
vp = fp->f_vnode;
+ vfslocked = VFS_LOCK_GIANT(vp->v_mount);
if (vp->v_type != VDIR) { /* XXX vnode readdir op should do this */
+ VFS_UNLOCK_GIANT(vfslocked);
fdrop(fp, td);
return (EINVAL);
}
@@ -459,6 +461,7 @@
td->td_retval[0] = uap->nbytes - resid;
out:
VOP_UNLOCK(vp, 0, td);
+ VFS_UNLOCK_GIANT(vfslocked);
fdrop(fp, td);
if (cookies)
free(cookies, M_TEMP);
@@ -484,7 +487,7 @@
char name[14];
} idb;
off_t off; /* true file offset */
- int buflen, error, eofflag, size;
+ int buflen, error, eofflag, size, vfslocked;
u_long *cookies = NULL, *cookiep;
int ncookies;
@@ -499,7 +502,9 @@
return (EBADF);
}
vp = fp->f_vnode;
+ vfslocked = VFS_LOCK_GIANT(vp->v_mount);
if (vp->v_type != VDIR) {
+ VFS_UNLOCK_GIANT(vfslocked);
fdrop(fp, td);
return read(td, (struct read_args *)uap);
}
@@ -622,6 +627,7 @@
td->td_retval[0] = uap->nbytes - resid;
out:
VOP_UNLOCK(vp, 0, td);
+ VFS_UNLOCK_GIANT(vfslocked);
fdrop(fp, td);
if (cookies)
free(cookies, M_TEMP);
==== //depot/projects/smpng/sys/i386/ibcs2/syscalls.master#15 (text+ko) ====
@@ -39,7 +39,7 @@
1 AUE_EXIT MNOPROTO { void sys_exit(int rval); } exit \
sys_exit_args void
2 AUE_FORK MNOPROTO { int fork(void); }
-3 AUE_NULL STD { int ibcs2_read(int fd, char *buf, \
+3 AUE_NULL MSTD { int ibcs2_read(int fd, char *buf, \
u_int nbytes); }
4 AUE_NULL MNOPROTO { int write(int fd, char *buf, \
u_int nbytes); }
@@ -146,7 +146,7 @@
78 AUE_NULL UNIMPL rfs_rfsys
79 AUE_RMDIR MSTD { int ibcs2_rmdir(char *path); }
80 AUE_MKDIR MSTD { int ibcs2_mkdir(char *path, int mode); }
-81 AUE_GETDIRENTRIES STD { int ibcs2_getdents(int fd, char *buf, \
+81 AUE_GETDIRENTRIES MSTD { int ibcs2_getdents(int fd, char *buf, \
int nbytes); }
82 AUE_NULL UNIMPL nosys
83 AUE_NULL UNIMPL nosys
==== //depot/projects/smpng/sys/notes#77 (text+ko) ====
@@ -93,11 +93,11 @@
- linux
- linux_uselib()
- ibcs2
- - ibcs2_read()
+ + ibcs2_read()
- ibcs2_mount()
- ibcs2_umount()
- ibcs2_ioctl()
- - ibcs2_getdents()
+ + ibcs2_getdents()
- ibcs2_sigprocmask()
- don't mess with td_retval in any kern_foo() functions
More information about the p4-projects
mailing list