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