Deleted Added
full compact
ffs_vfsops.c (71073) ffs_vfsops.c (71576)
1/*
2 * Copyright (c) 1989, 1991, 1993, 1994
3 * The Regents of the University of California. All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 17 unchanged lines hidden (view full) ---

26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 * SUCH DAMAGE.
32 *
33 * @(#)ffs_vfsops.c 8.31 (Berkeley) 5/20/95
1/*
2 * Copyright (c) 1989, 1991, 1993, 1994
3 * The Regents of the University of California. All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 17 unchanged lines hidden (view full) ---

26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 * SUCH DAMAGE.
32 *
33 * @(#)ffs_vfsops.c 8.31 (Berkeley) 5/20/95
34 * $FreeBSD: head/sys/ufs/ffs/ffs_vfsops.c 71073 2001-01-15 18:30:40Z iedowse $
34 * $FreeBSD: head/sys/ufs/ffs/ffs_vfsops.c 71576 2001-01-24 12:35:55Z jasone $
35 */
36
37#include "opt_ffs.h"
38#include "opt_quota.h"
39
40#include <sys/param.h>
41#include <sys/systm.h>
42#include <sys/namei.h>
43#include <sys/proc.h>
44#include <sys/kernel.h>
45#include <sys/vnode.h>
46#include <sys/mount.h>
47#include <sys/bio.h>
48#include <sys/buf.h>
49#include <sys/conf.h>
50#include <sys/fcntl.h>
51#include <sys/disklabel.h>
52#include <sys/malloc.h>
35 */
36
37#include "opt_ffs.h"
38#include "opt_quota.h"
39
40#include <sys/param.h>
41#include <sys/systm.h>
42#include <sys/namei.h>
43#include <sys/proc.h>
44#include <sys/kernel.h>
45#include <sys/vnode.h>
46#include <sys/mount.h>
47#include <sys/bio.h>
48#include <sys/buf.h>
49#include <sys/conf.h>
50#include <sys/fcntl.h>
51#include <sys/disklabel.h>
52#include <sys/malloc.h>
53#include <sys/mutex.h>
53
54
54#include <machine/mutex.h>
55
56#include <ufs/ufs/extattr.h>
57#include <ufs/ufs/quota.h>
58#include <ufs/ufs/ufsmount.h>
59#include <ufs/ufs/inode.h>
60#include <ufs/ufs/ufs_extern.h>
61
62#include <ufs/ffs/fs.h>
63#include <ufs/ffs/ffs_extern.h>

--- 386 unchanged lines hidden (view full) ---

450 */
451 if (fs->fs_contigsumsize > 0) {
452 lp = fs->fs_maxcluster;
453 for (i = 0; i < fs->fs_ncg; i++)
454 *lp++ = fs->fs_contigsumsize;
455 }
456
457loop:
55#include <ufs/ufs/extattr.h>
56#include <ufs/ufs/quota.h>
57#include <ufs/ufs/ufsmount.h>
58#include <ufs/ufs/inode.h>
59#include <ufs/ufs/ufs_extern.h>
60
61#include <ufs/ffs/fs.h>
62#include <ufs/ffs/ffs_extern.h>

--- 386 unchanged lines hidden (view full) ---

449 */
450 if (fs->fs_contigsumsize > 0) {
451 lp = fs->fs_maxcluster;
452 for (i = 0; i < fs->fs_ncg; i++)
453 *lp++ = fs->fs_contigsumsize;
454 }
455
456loop:
458 simple_lock(&mntvnode_slock);
457 mtx_enter(&mntvnode_mtx, MTX_DEF);
459 for (vp = mp->mnt_vnodelist.lh_first; vp != NULL; vp = nvp) {
460 if (vp->v_mount != mp) {
458 for (vp = mp->mnt_vnodelist.lh_first; vp != NULL; vp = nvp) {
459 if (vp->v_mount != mp) {
461 simple_unlock(&mntvnode_slock);
460 mtx_exit(&mntvnode_mtx, MTX_DEF);
462 goto loop;
463 }
464 nvp = vp->v_mntvnodes.le_next;
465 /*
466 * Step 4: invalidate all inactive vnodes.
467 */
461 goto loop;
462 }
463 nvp = vp->v_mntvnodes.le_next;
464 /*
465 * Step 4: invalidate all inactive vnodes.
466 */
468 if (vrecycle(vp, &mntvnode_slock, p))
467 if (vrecycle(vp, &mntvnode_mtx, p))
469 goto loop;
470 /*
471 * Step 5: invalidate all cached file data.
472 */
473 mtx_enter(&vp->v_interlock, MTX_DEF);
468 goto loop;
469 /*
470 * Step 5: invalidate all cached file data.
471 */
472 mtx_enter(&vp->v_interlock, MTX_DEF);
474 simple_unlock(&mntvnode_slock);
473 mtx_exit(&mntvnode_mtx, MTX_DEF);
475 if (vget(vp, LK_EXCLUSIVE | LK_INTERLOCK, p)) {
476 goto loop;
477 }
478 if (vinvalbuf(vp, 0, cred, p, 0, 0))
479 panic("ffs_reload: dirty2");
480 /*
481 * Step 6: re-read inode data for all active vnodes.
482 */

--- 5 unchanged lines hidden (view full) ---

488 vput(vp);
489 return (error);
490 }
491 ip->i_din = *((struct dinode *)bp->b_data +
492 ino_to_fsbo(fs, ip->i_number));
493 ip->i_effnlink = ip->i_nlink;
494 brelse(bp);
495 vput(vp);
474 if (vget(vp, LK_EXCLUSIVE | LK_INTERLOCK, p)) {
475 goto loop;
476 }
477 if (vinvalbuf(vp, 0, cred, p, 0, 0))
478 panic("ffs_reload: dirty2");
479 /*
480 * Step 6: re-read inode data for all active vnodes.
481 */

--- 5 unchanged lines hidden (view full) ---

487 vput(vp);
488 return (error);
489 }
490 ip->i_din = *((struct dinode *)bp->b_data +
491 ino_to_fsbo(fs, ip->i_number));
492 ip->i_effnlink = ip->i_nlink;
493 brelse(bp);
494 vput(vp);
496 simple_lock(&mntvnode_slock);
495 mtx_enter(&mntvnode_mtx, MTX_DEF);
497 }
496 }
498 simple_unlock(&mntvnode_slock);
497 mtx_exit(&mntvnode_mtx, MTX_DEF);
499 return (0);
500}
501
502/*
503 * Common code for mount and mountroot
504 */
505int
506ffs_mountfs(devvp, mp, p, malloctype)

--- 426 unchanged lines hidden (view full) ---

933 * Write back each (modified) inode.
934 */
935 wait = 0;
936 lockreq = LK_EXCLUSIVE | LK_NOWAIT | LK_INTERLOCK;
937 if (waitfor == MNT_WAIT) {
938 wait = 1;
939 lockreq = LK_EXCLUSIVE | LK_INTERLOCK;
940 }
498 return (0);
499}
500
501/*
502 * Common code for mount and mountroot
503 */
504int
505ffs_mountfs(devvp, mp, p, malloctype)

--- 426 unchanged lines hidden (view full) ---

932 * Write back each (modified) inode.
933 */
934 wait = 0;
935 lockreq = LK_EXCLUSIVE | LK_NOWAIT | LK_INTERLOCK;
936 if (waitfor == MNT_WAIT) {
937 wait = 1;
938 lockreq = LK_EXCLUSIVE | LK_INTERLOCK;
939 }
941 simple_lock(&mntvnode_slock);
940 mtx_enter(&mntvnode_mtx, MTX_DEF);
942loop:
943 for (vp = mp->mnt_vnodelist.lh_first; vp != NULL; vp = nvp) {
944 /*
945 * If the vnode that we are about to sync is no longer
946 * associated with this mount point, start over.
947 */
948 if (vp->v_mount != mp)
949 goto loop;
950 mtx_enter(&vp->v_interlock, MTX_DEF);
951 nvp = vp->v_mntvnodes.le_next;
952 ip = VTOI(vp);
953 if (vp->v_type == VNON || ((ip->i_flag &
954 (IN_ACCESS | IN_CHANGE | IN_MODIFIED | IN_UPDATE)) == 0 &&
955 TAILQ_EMPTY(&vp->v_dirtyblkhd))) {
956 mtx_exit(&vp->v_interlock, MTX_DEF);
957 continue;
958 }
959 if (vp->v_type != VCHR) {
941loop:
942 for (vp = mp->mnt_vnodelist.lh_first; vp != NULL; vp = nvp) {
943 /*
944 * If the vnode that we are about to sync is no longer
945 * associated with this mount point, start over.
946 */
947 if (vp->v_mount != mp)
948 goto loop;
949 mtx_enter(&vp->v_interlock, MTX_DEF);
950 nvp = vp->v_mntvnodes.le_next;
951 ip = VTOI(vp);
952 if (vp->v_type == VNON || ((ip->i_flag &
953 (IN_ACCESS | IN_CHANGE | IN_MODIFIED | IN_UPDATE)) == 0 &&
954 TAILQ_EMPTY(&vp->v_dirtyblkhd))) {
955 mtx_exit(&vp->v_interlock, MTX_DEF);
956 continue;
957 }
958 if (vp->v_type != VCHR) {
960 simple_unlock(&mntvnode_slock);
959 mtx_exit(&mntvnode_mtx, MTX_DEF);
961 if ((error = vget(vp, lockreq, p)) != 0) {
960 if ((error = vget(vp, lockreq, p)) != 0) {
962 simple_lock(&mntvnode_slock);
961 mtx_enter(&mntvnode_mtx, MTX_DEF);
963 if (error == ENOENT)
964 goto loop;
965 continue;
966 }
967 if ((error = VOP_FSYNC(vp, cred, waitfor, p)) != 0)
968 allerror = error;
969 VOP_UNLOCK(vp, 0, p);
970 vrele(vp);
962 if (error == ENOENT)
963 goto loop;
964 continue;
965 }
966 if ((error = VOP_FSYNC(vp, cred, waitfor, p)) != 0)
967 allerror = error;
968 VOP_UNLOCK(vp, 0, p);
969 vrele(vp);
971 simple_lock(&mntvnode_slock);
970 mtx_enter(&mntvnode_mtx, MTX_DEF);
972 } else {
971 } else {
973 simple_unlock(&mntvnode_slock);
972 mtx_exit(&mntvnode_mtx, MTX_DEF);
974 mtx_exit(&vp->v_interlock, MTX_DEF);
975 UFS_UPDATE(vp, wait);
973 mtx_exit(&vp->v_interlock, MTX_DEF);
974 UFS_UPDATE(vp, wait);
976 simple_lock(&mntvnode_slock);
975 mtx_enter(&mntvnode_mtx, MTX_DEF);
977 }
978 }
976 }
977 }
979 simple_unlock(&mntvnode_slock);
978 mtx_exit(&mntvnode_mtx, MTX_DEF);
980 /*
981 * Force stale file system control information to be flushed.
982 */
983 if (waitfor == MNT_WAIT) {
984 if ((error = softdep_flushworklist(ump->um_mountp, &count, p)))
985 allerror = error;
986 /* Flushed work items may create new vnodes to clean */
987 if (count) {
979 /*
980 * Force stale file system control information to be flushed.
981 */
982 if (waitfor == MNT_WAIT) {
983 if ((error = softdep_flushworklist(ump->um_mountp, &count, p)))
984 allerror = error;
985 /* Flushed work items may create new vnodes to clean */
986 if (count) {
988 simple_lock(&mntvnode_slock);
987 mtx_enter(&mntvnode_mtx, MTX_DEF);
989 goto loop;
990 }
991 }
992 if (waitfor == MNT_NOWAIT) {
993 vn_lock(ump->um_devvp, LK_EXCLUSIVE | LK_RETRY, p);
994 if ((error = VOP_FSYNC(ump->um_devvp, cred, waitfor, p)) != 0)
995 allerror = error;
996 VOP_UNLOCK(ump->um_devvp, 0, p);

--- 322 unchanged lines hidden ---
988 goto loop;
989 }
990 }
991 if (waitfor == MNT_NOWAIT) {
992 vn_lock(ump->um_devvp, LK_EXCLUSIVE | LK_RETRY, p);
993 if ((error = VOP_FSYNC(ump->um_devvp, cred, waitfor, p)) != 0)
994 allerror = error;
995 VOP_UNLOCK(ump->um_devvp, 0, p);

--- 322 unchanged lines hidden ---