Deleted Added
full compact
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 ---