aboutsummaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorJohn Baldwin <jhb@FreeBSD.org>2001-01-23 21:58:44 +0000
committerJohn Baldwin <jhb@FreeBSD.org>2001-01-23 21:58:44 +0000
commit14c3599a2df82f7f07aed85603749e9c8732add6 (patch)
tree2d66855cb3d06e52f47edfd32e15b2022710465f /sys
parentd1a147af8b0c49b5c762fc5481e71b71dd1bfcd8 (diff)
downloadsrc-14c3599a2df82f7f07aed85603749e9c8732add6.tar.gz
src-14c3599a2df82f7f07aed85603749e9c8732add6.zip
Proc locking in the form of using the proc lock to protect p_ucred while
we obtain another reference to it for vnode operations.
Notes
Notes: svn path=/head/; revision=71463
Diffstat (limited to 'sys')
-rw-r--r--sys/dev/ccd/ccd.c40
-rw-r--r--sys/geom/geom_ccd.c40
2 files changed, 68 insertions, 12 deletions
diff --git a/sys/dev/ccd/ccd.c b/sys/dev/ccd/ccd.c
index cdd07ceb8191..69098b91cd3d 100644
--- a/sys/dev/ccd/ccd.c
+++ b/sys/dev/ccd/ccd.c
@@ -380,6 +380,7 @@ ccdinit(ccd, cpaths, p)
size_t size;
int ix;
struct vnode *vp;
+ struct ucred *uc;
size_t minsize;
int maxsecsize;
struct partinfo dpart;
@@ -406,6 +407,10 @@ ccdinit(ccd, cpaths, p)
*/
maxsecsize = 0;
minsize = 0;
+ PROC_LOCK(p);
+ uc = p->p_ucred;
+ crhold(uc);
+ PROC_UNLOCK(p);
for (ix = 0; ix < cs->sc_nccdisks; ix++) {
vp = ccd->ccd_vpp[ix];
ci = &cs->sc_cinfo[ix];
@@ -433,7 +438,7 @@ ccdinit(ccd, cpaths, p)
* Get partition information for the component.
*/
if ((error = VOP_IOCTL(vp, DIOCGPART, (caddr_t)&dpart,
- FREAD, p->p_ucred, p)) != 0) {
+ FREAD, uc, p)) != 0) {
#ifdef DEBUG
if (ccddebug & (CCDB_FOLLOW|CCDB_INIT))
printf("ccd%d: %s: ioctl failed, error = %d\n",
@@ -479,6 +484,7 @@ ccdinit(ccd, cpaths, p)
ci->ci_size = size;
cs->sc_size += size;
}
+ crfree(uc);
/*
* Don't allow the interleave to be smaller than
@@ -566,6 +572,7 @@ ccdinit(ccd, cpaths, p)
cs->sc_unit = ccd->ccd_unit;
return (0);
fail:
+ crfree(uc);
while (ci > cs->sc_cinfo) {
ci--;
free(ci->ci_path, M_DEVBUF);
@@ -1265,6 +1272,7 @@ ccdioctl(dev, cmd, data, flag, p)
struct ccddevice ccd;
char **cpp;
struct vnode **vpp;
+ struct ucred *uc;
if (unit >= numccd)
return (ENXIO);
@@ -1336,12 +1344,17 @@ ccdioctl(dev, cmd, data, flag, p)
printf("ccdioctl: lookedup = %d\n", lookedup);
#endif
if ((error = ccdlookup(cpp[i], p, &vpp[i])) != 0) {
+ PROC_LOCK(p);
+ uc = p->p_ucred;
+ crhold(uc);
+ PROC_UNLOCK(p);
for (j = 0; j < lookedup; ++j)
(void)vn_close(vpp[j], FREAD|FWRITE,
- p->p_ucred, p);
+ uc, p);
free(vpp, M_DEVBUF);
free(cpp, M_DEVBUF);
ccdunlock(cs);
+ crfree(uc);
return (error);
}
++lookedup;
@@ -1354,13 +1367,17 @@ ccdioctl(dev, cmd, data, flag, p)
* Initialize the ccd. Fills in the softc for us.
*/
if ((error = ccdinit(&ccd, cpp, p)) != 0) {
+ PROC_LOCK(p);
+ uc = p->p_ucred;
+ crhold(uc);
+ PROC_UNLOCK(p);
for (j = 0; j < lookedup; ++j)
- (void)vn_close(vpp[j], FREAD|FWRITE,
- p->p_ucred, p);
+ (void)vn_close(vpp[j], FREAD|FWRITE, uc, p);
bzero(&ccd_softc[unit], sizeof(struct ccd_softc));
free(vpp, M_DEVBUF);
free(cpp, M_DEVBUF);
ccdunlock(cs);
+ crfree(uc);
return (error);
}
@@ -1400,6 +1417,10 @@ ccdioctl(dev, cmd, data, flag, p)
*/
/* Close the components and free their pathnames. */
+ PROC_LOCK(p);
+ uc = p->p_ucred;
+ crhold(uc);
+ PROC_UNLOCK(p);
for (i = 0; i < cs->sc_nccdisks; ++i) {
/*
* XXX: this close could potentially fail and
@@ -1412,9 +1433,10 @@ ccdioctl(dev, cmd, data, flag, p)
cs->sc_cinfo[i].ci_vp);
#endif
(void)vn_close(cs->sc_cinfo[i].ci_vp, FREAD|FWRITE,
- p->p_ucred, p);
+ uc, p);
free(cs->sc_cinfo[i].ci_path, M_DEVBUF);
}
+ crfree(uc);
/* Free interleave index. */
for (i = 0; cs->sc_itable[i].ii_ndisk; ++i)
@@ -1559,6 +1581,7 @@ ccdlookup(path, p, vpp)
{
struct nameidata nd;
struct vnode *vp;
+ struct ucred *uc;
int error, flags;
NDINIT(&nd, LOOKUP, FOLLOW, UIO_USERSPACE, path, p);
@@ -1593,7 +1616,12 @@ bad:
VOP_UNLOCK(vp, 0, p);
NDFREE(&nd, NDF_ONLY_PNBUF);
/* vn_close does vrele() for vp */
- (void)vn_close(vp, FREAD|FWRITE, p->p_ucred, p);
+ PROC_LOCK(p);
+ uc = p->p_ucred;
+ crhold(uc);
+ PROC_UNLOCK(p);
+ (void)vn_close(vp, FREAD|FWRITE, uc, p);
+ crfree(uc);
return (error);
}
diff --git a/sys/geom/geom_ccd.c b/sys/geom/geom_ccd.c
index cdd07ceb8191..69098b91cd3d 100644
--- a/sys/geom/geom_ccd.c
+++ b/sys/geom/geom_ccd.c
@@ -380,6 +380,7 @@ ccdinit(ccd, cpaths, p)
size_t size;
int ix;
struct vnode *vp;
+ struct ucred *uc;
size_t minsize;
int maxsecsize;
struct partinfo dpart;
@@ -406,6 +407,10 @@ ccdinit(ccd, cpaths, p)
*/
maxsecsize = 0;
minsize = 0;
+ PROC_LOCK(p);
+ uc = p->p_ucred;
+ crhold(uc);
+ PROC_UNLOCK(p);
for (ix = 0; ix < cs->sc_nccdisks; ix++) {
vp = ccd->ccd_vpp[ix];
ci = &cs->sc_cinfo[ix];
@@ -433,7 +438,7 @@ ccdinit(ccd, cpaths, p)
* Get partition information for the component.
*/
if ((error = VOP_IOCTL(vp, DIOCGPART, (caddr_t)&dpart,
- FREAD, p->p_ucred, p)) != 0) {
+ FREAD, uc, p)) != 0) {
#ifdef DEBUG
if (ccddebug & (CCDB_FOLLOW|CCDB_INIT))
printf("ccd%d: %s: ioctl failed, error = %d\n",
@@ -479,6 +484,7 @@ ccdinit(ccd, cpaths, p)
ci->ci_size = size;
cs->sc_size += size;
}
+ crfree(uc);
/*
* Don't allow the interleave to be smaller than
@@ -566,6 +572,7 @@ ccdinit(ccd, cpaths, p)
cs->sc_unit = ccd->ccd_unit;
return (0);
fail:
+ crfree(uc);
while (ci > cs->sc_cinfo) {
ci--;
free(ci->ci_path, M_DEVBUF);
@@ -1265,6 +1272,7 @@ ccdioctl(dev, cmd, data, flag, p)
struct ccddevice ccd;
char **cpp;
struct vnode **vpp;
+ struct ucred *uc;
if (unit >= numccd)
return (ENXIO);
@@ -1336,12 +1344,17 @@ ccdioctl(dev, cmd, data, flag, p)
printf("ccdioctl: lookedup = %d\n", lookedup);
#endif
if ((error = ccdlookup(cpp[i], p, &vpp[i])) != 0) {
+ PROC_LOCK(p);
+ uc = p->p_ucred;
+ crhold(uc);
+ PROC_UNLOCK(p);
for (j = 0; j < lookedup; ++j)
(void)vn_close(vpp[j], FREAD|FWRITE,
- p->p_ucred, p);
+ uc, p);
free(vpp, M_DEVBUF);
free(cpp, M_DEVBUF);
ccdunlock(cs);
+ crfree(uc);
return (error);
}
++lookedup;
@@ -1354,13 +1367,17 @@ ccdioctl(dev, cmd, data, flag, p)
* Initialize the ccd. Fills in the softc for us.
*/
if ((error = ccdinit(&ccd, cpp, p)) != 0) {
+ PROC_LOCK(p);
+ uc = p->p_ucred;
+ crhold(uc);
+ PROC_UNLOCK(p);
for (j = 0; j < lookedup; ++j)
- (void)vn_close(vpp[j], FREAD|FWRITE,
- p->p_ucred, p);
+ (void)vn_close(vpp[j], FREAD|FWRITE, uc, p);
bzero(&ccd_softc[unit], sizeof(struct ccd_softc));
free(vpp, M_DEVBUF);
free(cpp, M_DEVBUF);
ccdunlock(cs);
+ crfree(uc);
return (error);
}
@@ -1400,6 +1417,10 @@ ccdioctl(dev, cmd, data, flag, p)
*/
/* Close the components and free their pathnames. */
+ PROC_LOCK(p);
+ uc = p->p_ucred;
+ crhold(uc);
+ PROC_UNLOCK(p);
for (i = 0; i < cs->sc_nccdisks; ++i) {
/*
* XXX: this close could potentially fail and
@@ -1412,9 +1433,10 @@ ccdioctl(dev, cmd, data, flag, p)
cs->sc_cinfo[i].ci_vp);
#endif
(void)vn_close(cs->sc_cinfo[i].ci_vp, FREAD|FWRITE,
- p->p_ucred, p);
+ uc, p);
free(cs->sc_cinfo[i].ci_path, M_DEVBUF);
}
+ crfree(uc);
/* Free interleave index. */
for (i = 0; cs->sc_itable[i].ii_ndisk; ++i)
@@ -1559,6 +1581,7 @@ ccdlookup(path, p, vpp)
{
struct nameidata nd;
struct vnode *vp;
+ struct ucred *uc;
int error, flags;
NDINIT(&nd, LOOKUP, FOLLOW, UIO_USERSPACE, path, p);
@@ -1593,7 +1616,12 @@ bad:
VOP_UNLOCK(vp, 0, p);
NDFREE(&nd, NDF_ONLY_PNBUF);
/* vn_close does vrele() for vp */
- (void)vn_close(vp, FREAD|FWRITE, p->p_ucred, p);
+ PROC_LOCK(p);
+ uc = p->p_ucred;
+ crhold(uc);
+ PROC_UNLOCK(p);
+ (void)vn_close(vp, FREAD|FWRITE, uc, p);
+ crfree(uc);
return (error);
}