vfs_mount.c (108524) | vfs_mount.c (109623) |
---|---|
1/* 2 * Copyright (c) 1989, 1993 3 * The Regents of the University of California. All rights reserved. 4 * (c) UNIX System Laboratories, Inc. 5 * All or some portions of this file are derived from material licensed 6 * to the University of California by American Telephone and Telegraph 7 * Co. or Unix System Laboratories, Inc. and are reproduced herein with 8 * the permission of UNIX System Laboratories, Inc. --- 47 unchanged lines hidden (view full) --- 56 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 57 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 58 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 59 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 60 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 61 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 62 * SUCH DAMAGE. 63 * | 1/* 2 * Copyright (c) 1989, 1993 3 * The Regents of the University of California. All rights reserved. 4 * (c) UNIX System Laboratories, Inc. 5 * All or some portions of this file are derived from material licensed 6 * to the University of California by American Telephone and Telegraph 7 * Co. or Unix System Laboratories, Inc. and are reproduced herein with 8 * the permission of UNIX System Laboratories, Inc. --- 47 unchanged lines hidden (view full) --- 56 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 57 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 58 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 59 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 60 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 61 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 62 * SUCH DAMAGE. 63 * |
64 * $FreeBSD: head/sys/kern/vfs_mount.c 108524 2003-01-01 01:56:19Z alfred $ | 64 * $FreeBSD: head/sys/kern/vfs_mount.c 109623 2003-01-21 08:56:16Z alfred $ |
65 */ 66 67#include <sys/param.h> 68#include <sys/conf.h> 69#include <sys/cons.h> 70#include <sys/kernel.h> 71#include <sys/linker.h> 72#include <sys/mac.h> --- 146 unchanged lines hidden (view full) --- 219vfs_buildopts(struct uio *auio, struct vfsoptlist **options) 220{ 221 struct vfsoptlist *opts; 222 struct vfsopt *opt; 223 unsigned int i, iovcnt; 224 int error, namelen, optlen; 225 226 iovcnt = auio->uio_iovcnt; | 65 */ 66 67#include <sys/param.h> 68#include <sys/conf.h> 69#include <sys/cons.h> 70#include <sys/kernel.h> 71#include <sys/linker.h> 72#include <sys/mac.h> --- 146 unchanged lines hidden (view full) --- 219vfs_buildopts(struct uio *auio, struct vfsoptlist **options) 220{ 221 struct vfsoptlist *opts; 222 struct vfsopt *opt; 223 unsigned int i, iovcnt; 224 int error, namelen, optlen; 225 226 iovcnt = auio->uio_iovcnt; |
227 opts = malloc(sizeof(struct vfsoptlist), M_MOUNT, M_WAITOK); | 227 opts = malloc(sizeof(struct vfsoptlist), M_MOUNT, 0); |
228 TAILQ_INIT(opts); 229 for (i = 0; i < iovcnt; i += 2) { | 228 TAILQ_INIT(opts); 229 for (i = 0; i < iovcnt; i += 2) { |
230 opt = malloc(sizeof(struct vfsopt), M_MOUNT, M_WAITOK); | 230 opt = malloc(sizeof(struct vfsopt), M_MOUNT, 0); |
231 namelen = auio->uio_iov[i].iov_len; 232 optlen = auio->uio_iov[i + 1].iov_len; | 231 namelen = auio->uio_iov[i].iov_len; 232 optlen = auio->uio_iov[i + 1].iov_len; |
233 opt->name = malloc(namelen, M_MOUNT, M_WAITOK); | 233 opt->name = malloc(namelen, M_MOUNT, 0); |
234 opt->value = NULL; 235 if (auio->uio_segflg == UIO_SYSSPACE) { 236 bcopy(auio->uio_iov[i].iov_base, opt->name, namelen); 237 } else { 238 error = copyin(auio->uio_iov[i].iov_base, opt->name, 239 namelen); 240 if (error) 241 goto bad; 242 } 243 opt->len = optlen; 244 if (optlen != 0) { | 234 opt->value = NULL; 235 if (auio->uio_segflg == UIO_SYSSPACE) { 236 bcopy(auio->uio_iov[i].iov_base, opt->name, namelen); 237 } else { 238 error = copyin(auio->uio_iov[i].iov_base, opt->name, 239 namelen); 240 if (error) 241 goto bad; 242 } 243 opt->len = optlen; 244 if (optlen != 0) { |
245 opt->value = malloc(optlen, M_MOUNT, M_WAITOK); | 245 opt->value = malloc(optlen, M_MOUNT, 0); |
246 if (auio->uio_segflg == UIO_SYSSPACE) { 247 bcopy(auio->uio_iov[i + 1].iov_base, opt->value, 248 optlen); 249 } else { 250 error = copyin(auio->uio_iov[i + 1].iov_base, 251 opt->value, optlen); 252 if (error) 253 goto bad; --- 30 unchanged lines hidden (view full) --- 284 if (strncmp(opt2->name, "no", 2) == 0 && 285 strcmp(opt2->name + 2, opt->name) == 0) { 286 vfs_freeopt(toopts, opt2); 287 goto next; 288 } 289 opt2 = TAILQ_NEXT(opt2, link); 290 } 291 /* We want this option, duplicate it. */ | 246 if (auio->uio_segflg == UIO_SYSSPACE) { 247 bcopy(auio->uio_iov[i + 1].iov_base, opt->value, 248 optlen); 249 } else { 250 error = copyin(auio->uio_iov[i + 1].iov_base, 251 opt->value, optlen); 252 if (error) 253 goto bad; --- 30 unchanged lines hidden (view full) --- 284 if (strncmp(opt2->name, "no", 2) == 0 && 285 strcmp(opt2->name + 2, opt->name) == 0) { 286 vfs_freeopt(toopts, opt2); 287 goto next; 288 } 289 opt2 = TAILQ_NEXT(opt2, link); 290 } 291 /* We want this option, duplicate it. */ |
292 new = malloc(sizeof(struct vfsopt), M_MOUNT, M_WAITOK); 293 new->name = malloc(strlen(opt->name) + 1, M_MOUNT, M_WAITOK); | 292 new = malloc(sizeof(struct vfsopt), M_MOUNT, 0); 293 new->name = malloc(strlen(opt->name) + 1, M_MOUNT, 0); |
294 strcpy(new->name, opt->name); 295 if (opt->len != 0) { | 294 strcpy(new->name, opt->name); 295 if (opt->len != 0) { |
296 new->value = malloc(opt->len, M_MOUNT, M_WAITOK); | 296 new->value = malloc(opt->len, M_MOUNT, 0); |
297 bcopy(opt->value, new->value, opt->len); 298 } else { 299 new->value = NULL; 300 } 301 new->len = opt->len; 302 TAILQ_INSERT_TAIL(toopts, new, link); 303next: 304 continue; --- 24 unchanged lines hidden (view full) --- 329 /* 330 * Check that we have an even number of iovec's 331 * and that we have at least two options. 332 */ 333 if ((iovcnt & 1) || (iovcnt < 4) || (iovcnt > UIO_MAXIOV)) 334 return (EINVAL); 335 336 if (iovcnt > UIO_SMALLIOV) { | 297 bcopy(opt->value, new->value, opt->len); 298 } else { 299 new->value = NULL; 300 } 301 new->len = opt->len; 302 TAILQ_INSERT_TAIL(toopts, new, link); 303next: 304 continue; --- 24 unchanged lines hidden (view full) --- 329 /* 330 * Check that we have an even number of iovec's 331 * and that we have at least two options. 332 */ 333 if ((iovcnt & 1) || (iovcnt < 4) || (iovcnt > UIO_MAXIOV)) 334 return (EINVAL); 335 336 if (iovcnt > UIO_SMALLIOV) { |
337 MALLOC(iov, struct iovec *, iovlen, M_IOV, M_WAITOK); | 337 MALLOC(iov, struct iovec *, iovlen, M_IOV, 0); |
338 needfree = iov; 339 } else { 340 iov = aiov; 341 needfree = NULL; 342 } 343 auio.uio_iov = iov; 344 auio.uio_iovcnt = iovcnt; 345 auio.uio_segflg = UIO_USERSPACE; --- 55 unchanged lines hidden (view full) --- 401 for (iovcnt = 0; (cp = va_arg(ap, const char *)) != NULL; iovcnt++) 402 len += strlen(cp) + 1; 403 va_end(ap); 404 405 if (iovcnt < 4 || iovcnt & 1) 406 return (EINVAL); 407 408 iovlen = iovcnt * sizeof (struct iovec); | 338 needfree = iov; 339 } else { 340 iov = aiov; 341 needfree = NULL; 342 } 343 auio.uio_iov = iov; 344 auio.uio_iovcnt = iovcnt; 345 auio.uio_segflg = UIO_USERSPACE; --- 55 unchanged lines hidden (view full) --- 401 for (iovcnt = 0; (cp = va_arg(ap, const char *)) != NULL; iovcnt++) 402 len += strlen(cp) + 1; 403 va_end(ap); 404 405 if (iovcnt < 4 || iovcnt & 1) 406 return (EINVAL); 407 408 iovlen = iovcnt * sizeof (struct iovec); |
409 MALLOC(iovp, struct iovec *, iovlen, M_MOUNT, M_WAITOK); 410 MALLOC(buf, char *, len, M_MOUNT, M_WAITOK); | 409 MALLOC(iovp, struct iovec *, iovlen, M_MOUNT, 0); 410 MALLOC(buf, char *, len, M_MOUNT, 0); |
411 pos = buf; 412 va_start(ap, flags); 413 for (i = 0; i < iovcnt; i++) { 414 cp = va_arg(ap, const char *); 415 copystr(cp, pos, len - (pos - buf), &n); 416 iovp[i].iov_base = pos; 417 iovp[i].iov_len = n; 418 pos += n; --- 210 unchanged lines hidden (view full) --- 629 goto bad; 630 } 631 vp->v_iflag |= VI_MOUNT; 632 VI_UNLOCK(vp); 633 634 /* 635 * Allocate and initialize the filesystem. 636 */ | 411 pos = buf; 412 va_start(ap, flags); 413 for (i = 0; i < iovcnt; i++) { 414 cp = va_arg(ap, const char *); 415 copystr(cp, pos, len - (pos - buf), &n); 416 iovp[i].iov_base = pos; 417 iovp[i].iov_len = n; 418 pos += n; --- 210 unchanged lines hidden (view full) --- 629 goto bad; 630 } 631 vp->v_iflag |= VI_MOUNT; 632 VI_UNLOCK(vp); 633 634 /* 635 * Allocate and initialize the filesystem. 636 */ |
637 mp = malloc(sizeof(struct mount), M_MOUNT, M_WAITOK | M_ZERO); | 637 mp = malloc(sizeof(struct mount), M_MOUNT, M_ZERO); |
638 TAILQ_INIT(&mp->mnt_nvnodelist); 639 TAILQ_INIT(&mp->mnt_reservedvnlist); 640 lockinit(&mp->mnt_lock, PVFS, "vfslock", 0, LK_NOPAUSE); 641 (void)vfs_busy(mp, LK_NOWAIT, 0, td); 642 mp->mnt_op = vfsp->vfc_vfsops; 643 mp->mnt_vfc = vfsp; 644 vfsp->vfc_refcount++; 645 mp->mnt_stat.f_type = vfsp->vfc_typenum; --- 154 unchanged lines hidden (view full) --- 800 int flags; 801 caddr_t data; 802 } */ *uap; 803{ 804 char *fstype; 805 char *fspath; 806 int error; 807 | 638 TAILQ_INIT(&mp->mnt_nvnodelist); 639 TAILQ_INIT(&mp->mnt_reservedvnlist); 640 lockinit(&mp->mnt_lock, PVFS, "vfslock", 0, LK_NOPAUSE); 641 (void)vfs_busy(mp, LK_NOWAIT, 0, td); 642 mp->mnt_op = vfsp->vfc_vfsops; 643 mp->mnt_vfc = vfsp; 644 vfsp->vfc_refcount++; 645 mp->mnt_stat.f_type = vfsp->vfc_typenum; --- 154 unchanged lines hidden (view full) --- 800 int flags; 801 caddr_t data; 802 } */ *uap; 803{ 804 char *fstype; 805 char *fspath; 806 int error; 807 |
808 fstype = malloc(MFSNAMELEN, M_TEMP, M_WAITOK); 809 fspath = malloc(MNAMELEN, M_TEMP, M_WAITOK); | 808 fstype = malloc(MFSNAMELEN, M_TEMP, 0); 809 fspath = malloc(MNAMELEN, M_TEMP, 0); |
810 811 /* 812 * vfs_mount() actually takes a kernel string for `type' and 813 * `path' now, so extract them. 814 */ 815 error = copyinstr(uap->type, fstype, MFSNAMELEN, NULL); 816 if (error == 0) 817 error = copyinstr(uap->path, fspath, MNAMELEN, NULL); --- 175 unchanged lines hidden (view full) --- 993 return (EBUSY); 994 } 995 vp->v_iflag |= VI_MOUNT; 996 VI_UNLOCK(vp); 997 998 /* 999 * Allocate and initialize the filesystem. 1000 */ | 810 811 /* 812 * vfs_mount() actually takes a kernel string for `type' and 813 * `path' now, so extract them. 814 */ 815 error = copyinstr(uap->type, fstype, MFSNAMELEN, NULL); 816 if (error == 0) 817 error = copyinstr(uap->path, fspath, MNAMELEN, NULL); --- 175 unchanged lines hidden (view full) --- 993 return (EBUSY); 994 } 995 vp->v_iflag |= VI_MOUNT; 996 VI_UNLOCK(vp); 997 998 /* 999 * Allocate and initialize the filesystem. 1000 */ |
1001 mp = malloc(sizeof(struct mount), M_MOUNT, M_WAITOK | M_ZERO); | 1001 mp = malloc(sizeof(struct mount), M_MOUNT, M_ZERO); |
1002 TAILQ_INIT(&mp->mnt_nvnodelist); 1003 TAILQ_INIT(&mp->mnt_reservedvnlist); 1004 lockinit(&mp->mnt_lock, PVFS, "vfslock", 0, LK_NOPAUSE); 1005 (void)vfs_busy(mp, LK_NOWAIT, 0, td); 1006 mp->mnt_op = vfsp->vfc_vfsops; 1007 mp->mnt_vfc = vfsp; 1008 vfsp->vfc_refcount++; 1009 mp->mnt_stat.f_type = vfsp->vfc_typenum; --- 346 unchanged lines hidden (view full) --- 1356 1357 if (fstypename == NULL) 1358 return (ENODEV); 1359 for (vfsp = vfsconf; vfsp; vfsp = vfsp->vfc_next) 1360 if (!strcmp(vfsp->vfc_name, fstypename)) 1361 break; 1362 if (vfsp == NULL) 1363 return (ENODEV); | 1002 TAILQ_INIT(&mp->mnt_nvnodelist); 1003 TAILQ_INIT(&mp->mnt_reservedvnlist); 1004 lockinit(&mp->mnt_lock, PVFS, "vfslock", 0, LK_NOPAUSE); 1005 (void)vfs_busy(mp, LK_NOWAIT, 0, td); 1006 mp->mnt_op = vfsp->vfc_vfsops; 1007 mp->mnt_vfc = vfsp; 1008 vfsp->vfc_refcount++; 1009 mp->mnt_stat.f_type = vfsp->vfc_typenum; --- 346 unchanged lines hidden (view full) --- 1356 1357 if (fstypename == NULL) 1358 return (ENODEV); 1359 for (vfsp = vfsconf; vfsp; vfsp = vfsp->vfc_next) 1360 if (!strcmp(vfsp->vfc_name, fstypename)) 1361 break; 1362 if (vfsp == NULL) 1363 return (ENODEV); |
1364 mp = malloc((u_long)sizeof(struct mount), M_MOUNT, M_WAITOK | M_ZERO); | 1364 mp = malloc((u_long)sizeof(struct mount), M_MOUNT, M_ZERO); |
1365 lockinit(&mp->mnt_lock, PVFS, "vfslock", 0, LK_NOPAUSE); 1366 (void)vfs_busy(mp, LK_NOWAIT, 0, td); 1367 TAILQ_INIT(&mp->mnt_nvnodelist); 1368 TAILQ_INIT(&mp->mnt_reservedvnlist); 1369 mp->mnt_vfc = vfsp; 1370 mp->mnt_op = vfsp->vfc_vfsops; 1371 mp->mnt_flag = MNT_RDONLY; 1372 mp->mnt_vnodecovered = NULLVP; --- 116 unchanged lines hidden (view full) --- 1489 if (mountfrom == NULL) 1490 return(error); /* don't complain */ 1491 1492 s = splcam(); /* Overkill, but annoying without it */ 1493 printf("Mounting root from %s\n", mountfrom); 1494 splx(s); 1495 1496 /* parse vfs name and path */ | 1365 lockinit(&mp->mnt_lock, PVFS, "vfslock", 0, LK_NOPAUSE); 1366 (void)vfs_busy(mp, LK_NOWAIT, 0, td); 1367 TAILQ_INIT(&mp->mnt_nvnodelist); 1368 TAILQ_INIT(&mp->mnt_reservedvnlist); 1369 mp->mnt_vfc = vfsp; 1370 mp->mnt_op = vfsp->vfc_vfsops; 1371 mp->mnt_flag = MNT_RDONLY; 1372 mp->mnt_vnodecovered = NULLVP; --- 116 unchanged lines hidden (view full) --- 1489 if (mountfrom == NULL) 1490 return(error); /* don't complain */ 1491 1492 s = splcam(); /* Overkill, but annoying without it */ 1493 printf("Mounting root from %s\n", mountfrom); 1494 splx(s); 1495 1496 /* parse vfs name and path */ |
1497 vfsname = malloc(MFSNAMELEN, M_MOUNT, M_WAITOK); 1498 path = malloc(MNAMELEN, M_MOUNT, M_WAITOK); | 1497 vfsname = malloc(MFSNAMELEN, M_MOUNT, 0); 1498 path = malloc(MNAMELEN, M_MOUNT, 0); |
1499 vfsname[0] = path[0] = 0; 1500 sprintf(patt, "%%%d[a-z0-9]:%%%zds", MFSNAMELEN, MNAMELEN); 1501 if (sscanf(mountfrom, patt, vfsname, path) < 1) 1502 goto done; 1503 1504 /* allocate a root mount */ 1505 error = vfs_rootmountalloc(vfsname, path[0] != 0 ? path : ROOTNAME, 1506 &mp); --- 249 unchanged lines hidden --- | 1499 vfsname[0] = path[0] = 0; 1500 sprintf(patt, "%%%d[a-z0-9]:%%%zds", MFSNAMELEN, MNAMELEN); 1501 if (sscanf(mountfrom, patt, vfsname, path) < 1) 1502 goto done; 1503 1504 /* allocate a root mount */ 1505 error = vfs_rootmountalloc(vfsname, path[0] != 0 ? path : ROOTNAME, 1506 &mp); --- 249 unchanged lines hidden --- |