| @@ -1,14 +1,14 @@ | | | @@ -1,14 +1,14 @@ |
1 | /* $NetBSD: lfs_vnops.c,v 1.318 2017/07/26 16:42:37 maya Exp $ */ | | 1 | /* $NetBSD: lfs_vnops.c,v 1.319 2017/08/19 11:27:42 maya Exp $ */ |
2 | | | 2 | |
3 | /*- | | 3 | /*- |
4 | * Copyright (c) 1999, 2000, 2001, 2002, 2003 The NetBSD Foundation, Inc. | | 4 | * Copyright (c) 1999, 2000, 2001, 2002, 2003 The NetBSD Foundation, Inc. |
5 | * All rights reserved. | | 5 | * All rights reserved. |
6 | * | | 6 | * |
7 | * This code is derived from software contributed to The NetBSD Foundation | | 7 | * This code is derived from software contributed to The NetBSD Foundation |
8 | * by Konrad E. Schroder <perseant@hhhh.org>. | | 8 | * by Konrad E. Schroder <perseant@hhhh.org>. |
9 | * | | 9 | * |
10 | * Redistribution and use in source and binary forms, with or without | | 10 | * Redistribution and use in source and binary forms, with or without |
11 | * modification, are permitted provided that the following conditions | | 11 | * modification, are permitted provided that the following conditions |
12 | * are met: | | 12 | * are met: |
13 | * 1. Redistributions of source code must retain the above copyright | | 13 | * 1. Redistributions of source code must retain the above copyright |
14 | * notice, this list of conditions and the following disclaimer. | | 14 | * notice, this list of conditions and the following disclaimer. |
| @@ -115,27 +115,27 @@ | | | @@ -115,27 +115,27 @@ |
115 | * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE | | 115 | * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
116 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | | 116 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
117 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | | 117 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
118 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | | 118 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
119 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | | 119 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
120 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | | 120 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
121 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | | 121 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
122 | * SUCH DAMAGE. | | 122 | * SUCH DAMAGE. |
123 | * | | 123 | * |
124 | * @(#)ufs_vnops.c 8.28 (Berkeley) 7/31/95 | | 124 | * @(#)ufs_vnops.c 8.28 (Berkeley) 7/31/95 |
125 | */ | | 125 | */ |
126 | | | 126 | |
127 | #include <sys/cdefs.h> | | 127 | #include <sys/cdefs.h> |
128 | __KERNEL_RCSID(0, "$NetBSD: lfs_vnops.c,v 1.318 2017/07/26 16:42:37 maya Exp $"); | | 128 | __KERNEL_RCSID(0, "$NetBSD: lfs_vnops.c,v 1.319 2017/08/19 11:27:42 maya Exp $"); |
129 | | | 129 | |
130 | #ifdef _KERNEL_OPT | | 130 | #ifdef _KERNEL_OPT |
131 | #include "opt_compat_netbsd.h" | | 131 | #include "opt_compat_netbsd.h" |
132 | #include "opt_uvm_page_trkown.h" | | 132 | #include "opt_uvm_page_trkown.h" |
133 | #endif | | 133 | #endif |
134 | | | 134 | |
135 | #include <sys/param.h> | | 135 | #include <sys/param.h> |
136 | #include <sys/systm.h> | | 136 | #include <sys/systm.h> |
137 | #include <sys/namei.h> | | 137 | #include <sys/namei.h> |
138 | #include <sys/resourcevar.h> | | 138 | #include <sys/resourcevar.h> |
139 | #include <sys/kernel.h> | | 139 | #include <sys/kernel.h> |
140 | #include <sys/file.h> | | 140 | #include <sys/file.h> |
141 | #include <sys/stat.h> | | 141 | #include <sys/stat.h> |
| @@ -364,27 +364,27 @@ lfs_makeinode(struct vattr *vap, struct | | | @@ -364,27 +364,27 @@ lfs_makeinode(struct vattr *vap, struct |
364 | { | | 364 | { |
365 | struct inode *ip; | | 365 | struct inode *ip; |
366 | struct vnode *tvp; | | 366 | struct vnode *tvp; |
367 | int error; | | 367 | int error; |
368 | | | 368 | |
369 | error = vcache_new(dvp->v_mount, dvp, vap, cnp->cn_cred, &tvp); | | 369 | error = vcache_new(dvp->v_mount, dvp, vap, cnp->cn_cred, &tvp); |
370 | if (error) | | 370 | if (error) |
371 | return error; | | 371 | return error; |
372 | error = vn_lock(tvp, LK_EXCLUSIVE); | | 372 | error = vn_lock(tvp, LK_EXCLUSIVE); |
373 | if (error) { | | 373 | if (error) { |
374 | vrele(tvp); | | 374 | vrele(tvp); |
375 | return error; | | 375 | return error; |
376 | } | | 376 | } |
377 | lfs_mark_vnode(tvp); | | 377 | MARK_VNODE(tvp); |
378 | *vpp = tvp; | | 378 | *vpp = tvp; |
379 | ip = VTOI(tvp); | | 379 | ip = VTOI(tvp); |
380 | ip->i_state |= IN_ACCESS | IN_CHANGE | IN_UPDATE; | | 380 | ip->i_state |= IN_ACCESS | IN_CHANGE | IN_UPDATE; |
381 | ip->i_nlink = 1; | | 381 | ip->i_nlink = 1; |
382 | DIP_ASSIGN(ip, nlink, 1); | | 382 | DIP_ASSIGN(ip, nlink, 1); |
383 | | | 383 | |
384 | /* Authorize setting SGID if needed. */ | | 384 | /* Authorize setting SGID if needed. */ |
385 | if (ip->i_mode & ISGID) { | | 385 | if (ip->i_mode & ISGID) { |
386 | error = kauth_authorize_vnode(cnp->cn_cred, KAUTH_VNODE_WRITE_SECURITY, | | 386 | error = kauth_authorize_vnode(cnp->cn_cred, KAUTH_VNODE_WRITE_SECURITY, |
387 | tvp, NULL, genfs_can_chmod(tvp->v_type, cnp->cn_cred, ip->i_uid, | | 387 | tvp, NULL, genfs_can_chmod(tvp->v_type, cnp->cn_cred, ip->i_uid, |
388 | ip->i_gid, MAKEIMODE(vap->va_type, vap->va_mode))); | | 388 | ip->i_gid, MAKEIMODE(vap->va_type, vap->va_mode))); |
389 | if (error) { | | 389 | if (error) { |
390 | ip->i_mode &= ~ISGID; | | 390 | ip->i_mode &= ~ISGID; |
| @@ -409,27 +409,27 @@ lfs_makeinode(struct vattr *vap, struct | | | @@ -409,27 +409,27 @@ lfs_makeinode(struct vattr *vap, struct |
409 | *vpp = tvp; | | 409 | *vpp = tvp; |
410 | KASSERT(VOP_ISLOCKED(*vpp) == LK_EXCLUSIVE); | | 410 | KASSERT(VOP_ISLOCKED(*vpp) == LK_EXCLUSIVE); |
411 | return (0); | | 411 | return (0); |
412 | | | 412 | |
413 | bad: | | 413 | bad: |
414 | /* | | 414 | /* |
415 | * Write error occurred trying to update the inode | | 415 | * Write error occurred trying to update the inode |
416 | * or the directory so must deallocate the inode. | | 416 | * or the directory so must deallocate the inode. |
417 | */ | | 417 | */ |
418 | ip->i_nlink = 0; | | 418 | ip->i_nlink = 0; |
419 | DIP_ASSIGN(ip, nlink, 0); | | 419 | DIP_ASSIGN(ip, nlink, 0); |
420 | ip->i_state |= IN_CHANGE; | | 420 | ip->i_state |= IN_CHANGE; |
421 | /* If IN_ADIROP, account for it */ | | 421 | /* If IN_ADIROP, account for it */ |
422 | lfs_unmark_vnode(tvp); | | 422 | UNMARK_VNODE(tvp); |
423 | vput(tvp); | | 423 | vput(tvp); |
424 | return (error); | | 424 | return (error); |
425 | } | | 425 | } |
426 | | | 426 | |
427 | /* | | 427 | /* |
428 | * Synch an open file. | | 428 | * Synch an open file. |
429 | */ | | 429 | */ |
430 | /* ARGSUSED */ | | 430 | /* ARGSUSED */ |
431 | int | | 431 | int |
432 | lfs_fsync(void *v) | | 432 | lfs_fsync(void *v) |
433 | { | | 433 | { |
434 | struct vop_fsync_args /* { | | 434 | struct vop_fsync_args /* { |
435 | struct vnode *a_vp; | | 435 | struct vnode *a_vp; |
| @@ -516,27 +516,27 @@ out: | | | @@ -516,27 +516,27 @@ out: |
516 | /* | | 516 | /* |
517 | * Take IN_ADIROP off, then call ulfs_inactive. | | 517 | * Take IN_ADIROP off, then call ulfs_inactive. |
518 | */ | | 518 | */ |
519 | int | | 519 | int |
520 | lfs_inactive(void *v) | | 520 | lfs_inactive(void *v) |
521 | { | | 521 | { |
522 | struct vop_inactive_v2_args /* { | | 522 | struct vop_inactive_v2_args /* { |
523 | struct vnode *a_vp; | | 523 | struct vnode *a_vp; |
524 | bool *a_recycle; | | 524 | bool *a_recycle; |
525 | } */ *ap = v; | | 525 | } */ *ap = v; |
526 | | | 526 | |
527 | KASSERT(VOP_ISLOCKED(ap->a_vp) == LK_EXCLUSIVE); | | 527 | KASSERT(VOP_ISLOCKED(ap->a_vp) == LK_EXCLUSIVE); |
528 | | | 528 | |
529 | lfs_unmark_vnode(ap->a_vp); | | 529 | UNMARK_VNODE(ap->a_vp); |
530 | | | 530 | |
531 | /* | | 531 | /* |
532 | * The Ifile is only ever inactivated on unmount. | | 532 | * The Ifile is only ever inactivated on unmount. |
533 | * Streamline this process by not giving it more dirty blocks. | | 533 | * Streamline this process by not giving it more dirty blocks. |
534 | */ | | 534 | */ |
535 | if (VTOI(ap->a_vp)->i_number == LFS_IFILE_INUM) { | | 535 | if (VTOI(ap->a_vp)->i_number == LFS_IFILE_INUM) { |
536 | mutex_enter(&lfs_lock); | | 536 | mutex_enter(&lfs_lock); |
537 | LFS_CLR_UINO(VTOI(ap->a_vp), IN_ALLMOD); | | 537 | LFS_CLR_UINO(VTOI(ap->a_vp), IN_ALLMOD); |
538 | mutex_exit(&lfs_lock); | | 538 | mutex_exit(&lfs_lock); |
539 | return 0; | | 539 | return 0; |
540 | } | | 540 | } |
541 | | | 541 | |
542 | #ifdef DEBUG | | 542 | #ifdef DEBUG |
| @@ -979,27 +979,27 @@ lfs_mkdir(void *v) | | | @@ -979,27 +979,27 @@ lfs_mkdir(void *v) |
979 | */ | | 979 | */ |
980 | error = vcache_new(dvp->v_mount, dvp, vap, cnp->cn_cred, ap->a_vpp); | | 980 | error = vcache_new(dvp->v_mount, dvp, vap, cnp->cn_cred, ap->a_vpp); |
981 | if (error) | | 981 | if (error) |
982 | goto out; | | 982 | goto out; |
983 | | | 983 | |
984 | error = vn_lock(*ap->a_vpp, LK_EXCLUSIVE); | | 984 | error = vn_lock(*ap->a_vpp, LK_EXCLUSIVE); |
985 | if (error) { | | 985 | if (error) { |
986 | vrele(*ap->a_vpp); | | 986 | vrele(*ap->a_vpp); |
987 | *ap->a_vpp = NULL; | | 987 | *ap->a_vpp = NULL; |
988 | goto out; | | 988 | goto out; |
989 | } | | 989 | } |
990 | | | 990 | |
991 | tvp = *ap->a_vpp; | | 991 | tvp = *ap->a_vpp; |
992 | lfs_mark_vnode(tvp); | | 992 | MARK_VNODE(tvp); |
993 | ip = VTOI(tvp); | | 993 | ip = VTOI(tvp); |
994 | ip->i_state |= IN_ACCESS | IN_CHANGE | IN_UPDATE; | | 994 | ip->i_state |= IN_ACCESS | IN_CHANGE | IN_UPDATE; |
995 | ip->i_nlink = 2; | | 995 | ip->i_nlink = 2; |
996 | DIP_ASSIGN(ip, nlink, 2); | | 996 | DIP_ASSIGN(ip, nlink, 2); |
997 | if (cnp->cn_flags & ISWHITEOUT) { | | 997 | if (cnp->cn_flags & ISWHITEOUT) { |
998 | ip->i_flags |= UF_OPAQUE; | | 998 | ip->i_flags |= UF_OPAQUE; |
999 | DIP_ASSIGN(ip, flags, ip->i_flags); | | 999 | DIP_ASSIGN(ip, flags, ip->i_flags); |
1000 | } | | 1000 | } |
1001 | | | 1001 | |
1002 | /* | | 1002 | /* |
1003 | * Bump link count in parent directory to reflect work done below. | | 1003 | * Bump link count in parent directory to reflect work done below. |
1004 | */ | | 1004 | */ |
1005 | dp->i_nlink++; | | 1005 | dp->i_nlink++; |
| @@ -1054,27 +1054,27 @@ lfs_mkdir(void *v) | | | @@ -1054,27 +1054,27 @@ lfs_mkdir(void *v) |
1054 | VOP_UNLOCK(tvp); | | 1054 | VOP_UNLOCK(tvp); |
1055 | } else { | | 1055 | } else { |
1056 | dp->i_nlink--; | | 1056 | dp->i_nlink--; |
1057 | DIP_ASSIGN(dp, nlink, dp->i_nlink); | | 1057 | DIP_ASSIGN(dp, nlink, dp->i_nlink); |
1058 | dp->i_state |= IN_CHANGE; | | 1058 | dp->i_state |= IN_CHANGE; |
1059 | /* | | 1059 | /* |
1060 | * No need to do an explicit lfs_truncate here, vrele will | | 1060 | * No need to do an explicit lfs_truncate here, vrele will |
1061 | * do this for us because we set the link count to 0. | | 1061 | * do this for us because we set the link count to 0. |
1062 | */ | | 1062 | */ |
1063 | ip->i_nlink = 0; | | 1063 | ip->i_nlink = 0; |
1064 | DIP_ASSIGN(ip, nlink, 0); | | 1064 | DIP_ASSIGN(ip, nlink, 0); |
1065 | ip->i_state |= IN_CHANGE; | | 1065 | ip->i_state |= IN_CHANGE; |
1066 | /* If IN_ADIROP, account for it */ | | 1066 | /* If IN_ADIROP, account for it */ |
1067 | lfs_unmark_vnode(tvp); | | 1067 | UNMARK_VNODE(tvp); |
1068 | vput(tvp); | | 1068 | vput(tvp); |
1069 | } | | 1069 | } |
1070 | | | 1070 | |
1071 | out: | | 1071 | out: |
1072 | UNMARK_VNODE(dvp); | | 1072 | UNMARK_VNODE(dvp); |
1073 | UNMARK_VNODE(*vpp); | | 1073 | UNMARK_VNODE(*vpp); |
1074 | if (error) { | | 1074 | if (error) { |
1075 | *vpp = NULL; | | 1075 | *vpp = NULL; |
1076 | } | | 1076 | } |
1077 | lfs_unset_dirop(fs, dvp, "mkdir"); | | 1077 | lfs_unset_dirop(fs, dvp, "mkdir"); |
1078 | | | 1078 | |
1079 | vrele(dvp); | | 1079 | vrele(dvp); |
1080 | return (error); | | 1080 | return (error); |