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 --- |