Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 29 Jun 2007 20:52:06 -0400
From:      John Baldwin <jhb@freebsd.org>
To:        Roman Divacky <rdivacky@freebsd.org>
Cc:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   Re: PERFORCE change 122480 for review
Message-ID:  <200706292052.06861.jhb@freebsd.org>
In-Reply-To: <200706281214.l5SCEhFq046327@repoman.freebsd.org>
References:  <200706281214.l5SCEhFq046327@repoman.freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On Thursday 28 June 2007 08:14:43 am Roman Divacky wrote:
> http://perforce.freebsd.org/chv.cgi?CH=122480
> 
> Change 122480 by rdivacky@rdivacky_witten on 2007/06/28 12:14:14
> 
> 	vrele AFTER checking the vp for being on non-MPSAFE FS +  some indentation
> 	problems that caused bad scoping
> 	
> 	Noticed by: rwatson (again ;) )

Umm, no.  You need Giant for the vrele().  The proper fix is to use the 
VFS_*_GIANT() macros and use int variables to know if you need to unlock 
Giant or not.

> Affected files ...
> 
> .. //depot/projects/soc2007/rdivacky/linux_at/sys/kern/vfs_syscalls.c#41 
edit
> 
> Differences ...
> 
> ==== //depot/projects/soc2007/rdivacky/linux_at/sys/kern/vfs_syscalls.c#41 
(text+ko) ====
> 
> @@ -1164,9 +1164,9 @@
>  	fdclose(fdp, fp, indx, td);
>  	fdrop(fp, td);
>  	if (dvp) {
> -		vrele(dvp);
>  		if (VFS_NEEDSGIANT(dvp->v_mount))
>  			mtx_unlock(&Giant);
> +		vrele(dvp);
>  	}
>  	return (error);
>  }
> @@ -1272,9 +1272,9 @@
>  		return (error);
>  restart:
>  	if (dvp) {
> -		vrele(dvp);
>  		if (VFS_NEEDSGIANT(dvp->v_mount))
>  			mtx_unlock(&Giant);
> +		vrele(dvp);
>  	}
>  	error = kern_get_at(td, fd, &dvp);
>  	if (error && !kern_absolute_path(path, pathseg))
> @@ -1354,9 +1354,9 @@
>  		}
>  	}
>  	if (dvp) {
> -		vrele(dvp);
>  		if (VFS_NEEDSGIANT(dvp->v_mount))
>  			mtx_unlock(&Giant);
> +		vrele(dvp);
>  	}
>  	NDFREE(&nd, NDF_ONLY_PNBUF);
>  	vput(nd.ni_dvp);
> @@ -1419,9 +1419,9 @@
>  	AUDIT_ARG(mode, mode);
>  restart:
>  	if (dvp) {
> -		vrele(dvp);
>  		if (VFS_NEEDSGIANT(dvp->v_mount))
>  			mtx_unlock(&Giant);
> +		vrele(dvp);
>  	}
>  	error = kern_get_at(td, fd, &dvp);
>  	if (error && !kern_absolute_path(path, pathseg))
> @@ -1477,9 +1477,9 @@
>  out:
>  #endif
>  	if (dvp) {
> -		vrele(dvp);
>  		if (VFS_NEEDSGIANT(dvp->v_mount))
>  			mtx_unlock(&Giant);
> +		vrele(dvp);
>  	}
>  	vput(nd.ni_dvp);
>  	vn_finished_write(mp);
> @@ -1602,10 +1602,10 @@
>  	error = kern_get_at(td, fd2, &ldvp);
>  	if (error && !kern_absolute_path(path2, segflg)) {
>  		if (pdvp) {
> -			vrele(pdvp);
>  			if (VFS_NEEDSGIANT(pdvp->v_mount))
>  				mtx_unlock(&Giant);
> -			}
> +			vrele(pdvp);
> +		}
>  		return (error);
>  	}
>  
> @@ -1662,14 +1662,14 @@
>  
>  out:
>  	if (pdvp) {
> -		vrele(pdvp);
>  		if (VFS_NEEDSGIANT(pdvp->v_mount))
>  			mtx_unlock(&Giant);
> +		vrele(pdvp);
>  	}
>  	if (ldvp) {
> -		vrele(ldvp);
>  		if (VFS_NEEDSGIANT(ldvp->v_mount))
>  			mtx_unlock(&Giant);
> +		vrele(ldvp);
>  	}
>  	return (error);
>  }
> @@ -1737,9 +1737,9 @@
>  	AUDIT_ARG(text, syspath);
>  restart:
>  	if (dvp) {
> -		vrele(dvp);
>  		if (VFS_NEEDSGIANT(dvp->v_mount))
>  			mtx_unlock(&Giant);
> +		vrele(dvp);
>  	}
>  	error = kern_get_at(td, fd, &dvp);
>  	if (error && !kern_absolute_path(path2, segflg))
> @@ -1793,9 +1793,9 @@
>  	VFS_UNLOCK_GIANT(vfslocked);
>  out:
>  	if (dvp) {
> -		vrele(dvp);
>  		if (VFS_NEEDSGIANT(dvp->v_mount))
>  			mtx_unlock(&Giant);
> +		vrele(dvp);
>  	}
>  	if (segflg != UIO_SYSSPACE)
>  		uma_zfree(namei_zone, syspath);
> @@ -1911,9 +1911,9 @@
>  
>  restart:
>  	if (dvp) {
> -		vrele(dvp);
>  		if (VFS_NEEDSGIANT(dvp->v_mount))
>  			mtx_unlock(&Giant);
> +		vrele(dvp);
>  	}
>  	error = kern_get_at(td, fd, &dvp);
>  	if (error && !kern_absolute_path(path, pathseg))
> @@ -1972,9 +1972,9 @@
>  	NDFREE(&nd, NDF_ONLY_PNBUF);
>  	vput(nd.ni_dvp);
>  	if (dvp) {
> -		vrele(dvp);
>  		if (VFS_NEEDSGIANT(dvp->v_mount))
>  			mtx_unlock(&Giant);
> +		vrele(dvp);
>  	}
>  	if (vp == nd.ni_dvp)
>  		vrele(vp);
> @@ -2228,9 +2228,9 @@
>  	td->td_ucred = cred;
>  	crfree(tmpcred);
>  	if (dvp) {
> -		vrele(dvp);
>  		if (VFS_NEEDSGIANT(dvp->v_mount))
>  			mtx_unlock(&Giant);
> +		vrele(dvp);
>  	}
>  	return (error);
>  }
> @@ -2447,9 +2447,9 @@
>  		*sbp = sb;
>  out:	
>  	if (dvp) {
> -		vrele(dvp);
>  		if (VFS_NEEDSGIANT(dvp->v_mount))
>  			mtx_unlock(&Giant);
> +		vrele(dvp);
>  	}
>  	return (error);
>  }
> @@ -2514,9 +2514,9 @@
>  		*sbp = sb;
>  out:	
>  	if (dvp) {
> -		vrele(dvp);
>  		if (VFS_NEEDSGIANT(dvp->v_mount))
>  			mtx_unlock(&Giant);
> +		vrele(dvp);
>  	}
>  	return (error);
>  }
> @@ -2743,9 +2743,9 @@
>  	td->td_retval[0] = count - auio.uio_resid;
>  out:
>  	if (dvp) {
> -		vrele(dvp);
>  		if (VFS_NEEDSGIANT(dvp->v_mount))
>  			mtx_unlock(&Giant);
> +		vrele(dvp);
>  	}
>  	return (error);
>  }
> @@ -2993,9 +2993,9 @@
>  	VFS_UNLOCK_GIANT(vfslocked);
>  out:	
>  	if (dvp) {
> -		vrele(dvp);
>  		if (VFS_NEEDSGIANT(dvp->v_mount))
>  			mtx_unlock(&Giant);
> +		vrele(dvp);
>  	}
>  	return (error);
>  }
> @@ -3045,9 +3045,9 @@
>  	vrele(nd.ni_vp);
>  	VFS_UNLOCK_GIANT(vfslocked);
>  	if (dvp) {
> -		vrele(dvp);
>  		if (VFS_NEEDSGIANT(dvp->v_mount))
>  			mtx_unlock(&Giant);
> +		vrele(dvp);
>  	}
>  
>  	return (error);
> @@ -3192,9 +3192,9 @@
>  	VFS_UNLOCK_GIANT(vfslocked);
>  out:	
>  	if (dvp) {
> -		vrele(dvp);
>  		if (VFS_NEEDSGIANT(dvp->v_mount))
>  			mtx_unlock(&Giant);
> +		vrele(dvp);
>  	}
>  	return (error);
>  }
> @@ -3253,9 +3253,9 @@
>  	VFS_UNLOCK_GIANT(vfslocked);
>  out:	
>  	if (dvp) {
> -		vrele(dvp);
>  		if (VFS_NEEDSGIANT(dvp->v_mount))
>  			mtx_unlock(&Giant);
> +		vrele(dvp);
>  	}
>  	return (error);
>  }
> @@ -3443,9 +3443,9 @@
>  	VFS_UNLOCK_GIANT(vfslocked);
>  out:
>  	if (dvp) {
> -		vrele(dvp);
>  		if (VFS_NEEDSGIANT(dvp->v_mount))
>  			mtx_unlock(&Giant);
> +		vrele(dvp);
>  	}
>  	return (error);
>  }
> @@ -3835,10 +3835,10 @@
>  	error = kern_get_at(td, newfd, &todvp);
>  	if (error && !kern_absolute_path(new, pathseg)) {
>  		if (frdvp) {
> -			vrele(frdvp);
>  			if (VFS_NEEDSGIANT(frdvp->v_mount))
>  				mtx_unlock(&Giant);
> -			}
> +			vrele(frdvp);
> +		}
>  		return (error);
>  	}
>  
> @@ -3947,14 +3947,14 @@
>  		return (0);
>  out2:
>  	if (frdvp) {
> -		vrele(frdvp);
>  		if (VFS_NEEDSGIANT(frdvp->v_mount))
>  			mtx_unlock(&Giant);
> +		vrele(frdvp);
>  	}
>  	if (todvp) {
> -		vrele(todvp);
>  		if (VFS_NEEDSGIANT(todvp->v_mount))
>  			mtx_unlock(&Giant);
> +		vrele(todvp);
>  	}
>  	return (error);
>  }
> @@ -4013,9 +4013,9 @@
>  	AUDIT_ARG(mode, mode);
>  restart:
>  	if (dvp) {
> -		vrele(dvp);
>  		if (VFS_NEEDSGIANT(dvp->v_mount))
>  			mtx_unlock(&Giant);
> +		vrele(dvp);
>  	}
>  	error = kern_get_at(td, fd, &dvp);
>  	if (error && !kern_absolute_path(path, segflg))
> @@ -4076,9 +4076,9 @@
>  out:
>  #endif
>  	if (dvp) {
> -		vrele(dvp);
>  		if (VFS_NEEDSGIANT(dvp->v_mount))
>  			mtx_unlock(&Giant);
> +		vrele(dvp);
>  	}
>  	NDFREE(&nd, NDF_ONLY_PNBUF);
>  	vput(nd.ni_dvp);
> @@ -4125,9 +4125,9 @@
>  
>  restart:
>  	if (dvp) {
> -		vrele(dvp);
>  		if (VFS_NEEDSGIANT(dvp->v_mount))
>  			mtx_unlock(&Giant);
> +		vrele(dvp);
>  	}
>  	error = kern_get_at(td, fd, &dvp);
>  	if (error && !kern_absolute_path(path, pathseg))
> @@ -4183,9 +4183,9 @@
>  	NDFREE(&nd, NDF_ONLY_PNBUF);
>  	vput(vp);
>  	if (dvp) {
> -		vrele(dvp);
>  		if (VFS_NEEDSGIANT(dvp->v_mount))
>  			mtx_unlock(&Giant);
> +		vrele(dvp);
>  	}
>  	if (nd.ni_dvp == vp)
>  		vrele(nd.ni_dvp);
> 



-- 
John Baldwin



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200706292052.06861.jhb>