ext2_vnops.c (53131) | ext2_vnops.c (54655) |
---|---|
1/* 2 * modified for EXT2FS support in Lites 1.1 3 * 4 * Aug 1995, Godmar Back (gback@cs.utah.edu) 5 * University of Utah, Department of Computer Science 6 */ 7/* 8 * Copyright (c) 1982, 1986, 1989, 1993 --- 29 unchanged lines hidden (view full) --- 38 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 39 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 40 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 41 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 42 * SUCH DAMAGE. 43 * 44 * @(#)ufs_vnops.c 8.27 (Berkeley) 5/27/95 45 * @(#)ext2_vnops.c 8.7 (Berkeley) 2/3/94 | 1/* 2 * modified for EXT2FS support in Lites 1.1 3 * 4 * Aug 1995, Godmar Back (gback@cs.utah.edu) 5 * University of Utah, Department of Computer Science 6 */ 7/* 8 * Copyright (c) 1982, 1986, 1989, 1993 --- 29 unchanged lines hidden (view full) --- 38 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 39 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 40 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 41 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 42 * SUCH DAMAGE. 43 * 44 * @(#)ufs_vnops.c 8.27 (Berkeley) 5/27/95 45 * @(#)ext2_vnops.c 8.7 (Berkeley) 2/3/94 |
46 * $FreeBSD: head/sys/gnu/fs/ext2fs/ext2_vnops.c 53131 1999-11-13 20:58:17Z eivind $ | 46 * $FreeBSD: head/sys/gnu/fs/ext2fs/ext2_vnops.c 54655 1999-12-15 23:02:35Z eivind $ |
47 */ 48 49#include "opt_quota.h" 50#include "opt_suiddir.h" 51 52#include <sys/param.h> 53#include <sys/systm.h> 54#include <sys/resourcevar.h> --- 269 unchanged lines hidden (view full) --- 324 struct inode *ip; 325 int error; 326 327#ifdef DIAGNOSTIC 328 if ((cnp->cn_flags & HASBUF) == 0) 329 panic("ufs_link: no name"); 330#endif 331 if (tdvp->v_mount != vp->v_mount) { | 47 */ 48 49#include "opt_quota.h" 50#include "opt_suiddir.h" 51 52#include <sys/param.h> 53#include <sys/systm.h> 54#include <sys/resourcevar.h> --- 269 unchanged lines hidden (view full) --- 324 struct inode *ip; 325 int error; 326 327#ifdef DIAGNOSTIC 328 if ((cnp->cn_flags & HASBUF) == 0) 329 panic("ufs_link: no name"); 330#endif 331 if (tdvp->v_mount != vp->v_mount) { |
332 VOP_ABORTOP(tdvp, cnp); | |
333 error = EXDEV; 334 goto out2; 335 } 336 if (tdvp != vp && (error = vn_lock(vp, LK_EXCLUSIVE, p))) { | 332 error = EXDEV; 333 goto out2; 334 } 335 if (tdvp != vp && (error = vn_lock(vp, LK_EXCLUSIVE, p))) { |
337 VOP_ABORTOP(tdvp, cnp); | |
338 goto out2; 339 } 340 ip = VTOI(vp); 341 if ((nlink_t)ip->i_nlink >= LINK_MAX) { | 336 goto out2; 337 } 338 ip = VTOI(vp); 339 if ((nlink_t)ip->i_nlink >= LINK_MAX) { |
342 VOP_ABORTOP(tdvp, cnp); | |
343 error = EMLINK; 344 goto out1; 345 } 346 if (ip->i_flags & (IMMUTABLE | APPEND)) { | 340 error = EMLINK; 341 goto out1; 342 } 343 if (ip->i_flags & (IMMUTABLE | APPEND)) { |
347 VOP_ABORTOP(tdvp, cnp); | |
348 error = EPERM; 349 goto out1; 350 } 351 ip->i_nlink++; 352 ip->i_flag |= IN_CHANGE; 353 error = UFS_UPDATE(vp, 1); 354 if (!error) 355 error = ext2_direnter(ip, tdvp, cnp); 356 if (error) { 357 ip->i_nlink--; 358 ip->i_flag |= IN_CHANGE; 359 } | 344 error = EPERM; 345 goto out1; 346 } 347 ip->i_nlink++; 348 ip->i_flag |= IN_CHANGE; 349 error = UFS_UPDATE(vp, 1); 350 if (!error) 351 error = ext2_direnter(ip, tdvp, cnp); 352 if (error) { 353 ip->i_nlink--; 354 ip->i_flag |= IN_CHANGE; 355 } |
360 zfree(namei_zone, cnp->cn_pnbuf); | |
361out1: 362 if (tdvp != vp) 363 VOP_UNLOCK(vp, 0, p); 364out2: 365 return (error); 366} 367 368/* --- 31 unchanged lines hidden (view full) --- 400#endif 401 /* 402 * Check for cross-device rename. 403 */ 404 if ((fvp->v_mount != tdvp->v_mount) || 405 (tvp && (fvp->v_mount != tvp->v_mount))) { 406 error = EXDEV; 407abortit: | 356out1: 357 if (tdvp != vp) 358 VOP_UNLOCK(vp, 0, p); 359out2: 360 return (error); 361} 362 363/* --- 31 unchanged lines hidden (view full) --- 395#endif 396 /* 397 * Check for cross-device rename. 398 */ 399 if ((fvp->v_mount != tdvp->v_mount) || 400 (tvp && (fvp->v_mount != tvp->v_mount))) { 401 error = EXDEV; 402abortit: |
408 VOP_ABORTOP(tdvp, tcnp); /* XXX, why not in NFS? */ | |
409 if (tdvp == tvp) 410 vrele(tdvp); 411 else 412 vput(tdvp); 413 if (tvp) 414 vput(tvp); | 403 if (tdvp == tvp) 404 vrele(tdvp); 405 else 406 vput(tdvp); 407 if (tvp) 408 vput(tvp); |
415 VOP_ABORTOP(fdvp, fcnp); /* XXX, why not in NFS? */ | |
416 vrele(fdvp); 417 vrele(fvp); 418 return (error); 419 } 420 421 if (tvp && ((VTOI(tvp)->i_flags & (NOUNLINK | IMMUTABLE | APPEND)) || 422 (VTOI(tdvp)->i_flags & APPEND))) { 423 error = EPERM; --- 17 unchanged lines hidden (view full) --- 441#ifdef UFS_RENAME_DEBUG 442 printf("ufs_rename: fvp == tvp for directories\n"); 443#endif 444 error = ENOENT; 445 goto abortit; 446 } 447 448 /* Release destination completely. */ | 409 vrele(fdvp); 410 vrele(fvp); 411 return (error); 412 } 413 414 if (tvp && ((VTOI(tvp)->i_flags & (NOUNLINK | IMMUTABLE | APPEND)) || 415 (VTOI(tdvp)->i_flags & APPEND))) { 416 error = EPERM; --- 17 unchanged lines hidden (view full) --- 434#ifdef UFS_RENAME_DEBUG 435 printf("ufs_rename: fvp == tvp for directories\n"); 436#endif 437 error = ENOENT; 438 goto abortit; 439 } 440 441 /* Release destination completely. */ |
449 VOP_ABORTOP(tdvp, tcnp); | |
450 vput(tdvp); 451 vput(tvp); 452 453 /* 454 * Delete source. There is another race now that everything 455 * is unlocked, but this doesn't cause any new complications. 456 * Relookup() may find a file that is unrelated to the 457 * original one, or it may fail. Too bad. 458 */ 459 vrele(fdvp); 460 vrele(fvp); 461 fcnp->cn_flags &= ~MODMASK; 462 fcnp->cn_flags |= LOCKPARENT | LOCKLEAF; | 442 vput(tdvp); 443 vput(tvp); 444 445 /* 446 * Delete source. There is another race now that everything 447 * is unlocked, but this doesn't cause any new complications. 448 * Relookup() may find a file that is unrelated to the 449 * original one, or it may fail. Too bad. 450 */ 451 vrele(fdvp); 452 vrele(fvp); 453 fcnp->cn_flags &= ~MODMASK; 454 fcnp->cn_flags |= LOCKPARENT | LOCKLEAF; |
463 if ((fcnp->cn_flags & SAVESTART) == 0) 464 panic("ufs_rename: lost from startdir"); | |
465 fcnp->cn_nameiop = DELETE; 466 VREF(fdvp); 467 error = relookup(fdvp, &fvp, fcnp); 468 if (error == 0) 469 vrele(fdvp); 470 if (fvp == NULL) { 471#ifdef UFS_RENAME_DEBUG 472 printf("ufs_rename: from name disappeared\n"); --- 80 unchanged lines hidden (view full) --- 553 if (doingdirectory && newparent) { 554 if (error) /* write access check above */ 555 goto bad; 556 if (xp != NULL) 557 vput(tvp); 558 error = ext2_checkpath(ip, dp, tcnp->cn_cred); 559 if (error) 560 goto out; | 455 fcnp->cn_nameiop = DELETE; 456 VREF(fdvp); 457 error = relookup(fdvp, &fvp, fcnp); 458 if (error == 0) 459 vrele(fdvp); 460 if (fvp == NULL) { 461#ifdef UFS_RENAME_DEBUG 462 printf("ufs_rename: from name disappeared\n"); --- 80 unchanged lines hidden (view full) --- 543 if (doingdirectory && newparent) { 544 if (error) /* write access check above */ 545 goto bad; 546 if (xp != NULL) 547 vput(tvp); 548 error = ext2_checkpath(ip, dp, tcnp->cn_cred); 549 if (error) 550 goto out; |
561 if ((tcnp->cn_flags & SAVESTART) == 0) 562 panic("ufs_rename: lost to startdir"); | |
563 VREF(tdvp); 564 error = relookup(tdvp, &tvp, tcnp); 565 if (error) 566 goto out; 567 vrele(tdvp); 568 dp = VTOI(tdvp); 569 xp = NULL; 570 if (tvp) --- 111 unchanged lines hidden (view full) --- 682 xp = NULL; 683 } 684 685 /* 686 * 3) Unlink the source. 687 */ 688 fcnp->cn_flags &= ~MODMASK; 689 fcnp->cn_flags |= LOCKPARENT | LOCKLEAF; | 551 VREF(tdvp); 552 error = relookup(tdvp, &tvp, tcnp); 553 if (error) 554 goto out; 555 vrele(tdvp); 556 dp = VTOI(tdvp); 557 xp = NULL; 558 if (tvp) --- 111 unchanged lines hidden (view full) --- 670 xp = NULL; 671 } 672 673 /* 674 * 3) Unlink the source. 675 */ 676 fcnp->cn_flags &= ~MODMASK; 677 fcnp->cn_flags |= LOCKPARENT | LOCKLEAF; |
690 if ((fcnp->cn_flags & SAVESTART) == 0) 691 panic("ufs_rename: lost from startdir"); | |
692 VREF(fdvp); 693 error = relookup(fdvp, &fvp, fcnp); 694 if (error == 0) 695 vrele(fdvp); 696 if (fvp != NULL) { 697 xp = VTOI(fvp); 698 dp = VTOI(fdvp); 699 } else { --- 168 unchanged lines hidden (view full) --- 868 } 869#endif I 870 } else { 871 ip->i_uid = cnp->cn_cred->cr_uid; 872 } 873#ifdef QUOTA 874 if ((error = getinoquota(ip)) || 875 (error = chkiq(ip, 1, ucp, 0))) { | 678 VREF(fdvp); 679 error = relookup(fdvp, &fvp, fcnp); 680 if (error == 0) 681 vrele(fdvp); 682 if (fvp != NULL) { 683 xp = VTOI(fvp); 684 dp = VTOI(fdvp); 685 } else { --- 168 unchanged lines hidden (view full) --- 854 } 855#endif I 856 } else { 857 ip->i_uid = cnp->cn_cred->cr_uid; 858 } 859#ifdef QUOTA 860 if ((error = getinoquota(ip)) || 861 (error = chkiq(ip, 1, ucp, 0))) { |
876 zfree(namei_zone, cnp->cn_pnbuf); | |
877 UFS_VFREE(tvp, ip->i_number, dmode); 878 vput(tvp); 879 return (error); 880 } 881#endif 882 } 883#else 884 ip->i_uid = cnp->cn_cred->cr_uid; 885#ifdef QUOTA 886 if ((error = getinoquota(ip)) || 887 (error = chkiq(ip, 1, cnp->cn_cred, 0))) { | 862 UFS_VFREE(tvp, ip->i_number, dmode); 863 vput(tvp); 864 return (error); 865 } 866#endif 867 } 868#else 869 ip->i_uid = cnp->cn_cred->cr_uid; 870#ifdef QUOTA 871 if ((error = getinoquota(ip)) || 872 (error = chkiq(ip, 1, cnp->cn_cred, 0))) { |
888 zfree(namei_zone, cnp->cn_pnbuf); | |
889 UFS_VFREE(tvp, ip->i_number, dmode); 890 vput(tvp); 891 return (error); 892 } 893#endif 894#endif 895 ip->i_flag |= IN_ACCESS | IN_CHANGE | IN_UPDATE; 896 ip->i_mode = dmode; --- 54 unchanged lines hidden (view full) --- 951 */ 952 if (error) { 953 ip->i_nlink = 0; 954 ip->i_flag |= IN_CHANGE; 955 vput(tvp); 956 } else 957 *ap->a_vpp = tvp; 958out: | 873 UFS_VFREE(tvp, ip->i_number, dmode); 874 vput(tvp); 875 return (error); 876 } 877#endif 878#endif 879 ip->i_flag |= IN_ACCESS | IN_CHANGE | IN_UPDATE; 880 ip->i_mode = dmode; --- 54 unchanged lines hidden (view full) --- 935 */ 936 if (error) { 937 ip->i_nlink = 0; 938 ip->i_flag |= IN_CHANGE; 939 vput(tvp); 940 } else 941 *ap->a_vpp = tvp; 942out: |
959 zfree(namei_zone, cnp->cn_pnbuf); | |
960 return (error); 961#undef DIRBLKSIZ 962#define DIRBLKSIZ DEV_BSIZE 963} 964 965/* 966 * Rmdir system call. 967 */ --- 120 unchanged lines hidden (view full) --- 1088 panic("ext2_makeinode: no name"); 1089#endif 1090 *vpp = NULL; 1091 if ((mode & IFMT) == 0) 1092 mode |= IFREG; 1093 1094 error = UFS_VALLOC(dvp, mode, cnp->cn_cred, &tvp); 1095 if (error) { | 943 return (error); 944#undef DIRBLKSIZ 945#define DIRBLKSIZ DEV_BSIZE 946} 947 948/* 949 * Rmdir system call. 950 */ --- 120 unchanged lines hidden (view full) --- 1071 panic("ext2_makeinode: no name"); 1072#endif 1073 *vpp = NULL; 1074 if ((mode & IFMT) == 0) 1075 mode |= IFREG; 1076 1077 error = UFS_VALLOC(dvp, mode, cnp->cn_cred, &tvp); 1078 if (error) { |
1096 zfree(namei_zone, cnp->cn_pnbuf); | |
1097 return (error); 1098 } 1099 ip = VTOI(tvp); 1100 ip->i_gid = pdir->i_gid; 1101#ifdef SUIDDIR 1102 { 1103#ifdef QUOTA 1104 struct ucred ucred, *ucp; --- 28 unchanged lines hidden (view full) --- 1133#endif I 1134 } else { 1135 ip->i_uid = cnp->cn_cred->cr_uid; 1136 } 1137 1138#ifdef QUOTA 1139 if ((error = getinoquota(ip)) || 1140 (error = chkiq(ip, 1, ucp, 0))) { | 1079 return (error); 1080 } 1081 ip = VTOI(tvp); 1082 ip->i_gid = pdir->i_gid; 1083#ifdef SUIDDIR 1084 { 1085#ifdef QUOTA 1086 struct ucred ucred, *ucp; --- 28 unchanged lines hidden (view full) --- 1115#endif I 1116 } else { 1117 ip->i_uid = cnp->cn_cred->cr_uid; 1118 } 1119 1120#ifdef QUOTA 1121 if ((error = getinoquota(ip)) || 1122 (error = chkiq(ip, 1, ucp, 0))) { |
1141 zfree(namei_zone, cnp->cn_pnbuf); | |
1142 UFS_VFREE(tvp, ip->i_number, mode); 1143 vput(tvp); 1144 return (error); 1145 } 1146#endif 1147 } 1148#else 1149 ip->i_uid = cnp->cn_cred->cr_uid; 1150#ifdef QUOTA 1151 if ((error = getinoquota(ip)) || 1152 (error = chkiq(ip, 1, cnp->cn_cred, 0))) { | 1123 UFS_VFREE(tvp, ip->i_number, mode); 1124 vput(tvp); 1125 return (error); 1126 } 1127#endif 1128 } 1129#else 1130 ip->i_uid = cnp->cn_cred->cr_uid; 1131#ifdef QUOTA 1132 if ((error = getinoquota(ip)) || 1133 (error = chkiq(ip, 1, cnp->cn_cred, 0))) { |
1153 zfree(namei_zone, cnp->cn_pnbuf); | |
1154 UFS_VFREE(tvp, ip->i_number, mode); 1155 vput(tvp); 1156 return (error); 1157 } 1158#endif 1159#endif 1160 ip->i_flag |= IN_ACCESS | IN_CHANGE | IN_UPDATE; 1161 ip->i_mode = mode; --- 11 unchanged lines hidden (view full) --- 1173 */ 1174 error = UFS_UPDATE(tvp, 1); 1175 if (error) 1176 goto bad; 1177 error = ext2_direnter(ip, dvp, cnp); 1178 if (error) 1179 goto bad; 1180 | 1134 UFS_VFREE(tvp, ip->i_number, mode); 1135 vput(tvp); 1136 return (error); 1137 } 1138#endif 1139#endif 1140 ip->i_flag |= IN_ACCESS | IN_CHANGE | IN_UPDATE; 1141 ip->i_mode = mode; --- 11 unchanged lines hidden (view full) --- 1153 */ 1154 error = UFS_UPDATE(tvp, 1); 1155 if (error) 1156 goto bad; 1157 error = ext2_direnter(ip, dvp, cnp); 1158 if (error) 1159 goto bad; 1160 |
1181 if ((cnp->cn_flags & SAVESTART) == 0) 1182 zfree(namei_zone, cnp->cn_pnbuf); | |
1183 *vpp = tvp; 1184 return (0); 1185 1186bad: 1187 /* 1188 * Write error occurred trying to update the inode 1189 * or the directory so must deallocate the inode. 1190 */ | 1161 *vpp = tvp; 1162 return (0); 1163 1164bad: 1165 /* 1166 * Write error occurred trying to update the inode 1167 * or the directory so must deallocate the inode. 1168 */ |
1191 zfree(namei_zone, cnp->cn_pnbuf); | |
1192 ip->i_nlink = 0; 1193 ip->i_flag |= IN_CHANGE; 1194 vput(tvp); 1195 return (error); 1196} 1197 1198/* 1199 * get page routine --- 25 unchanged lines hidden --- | 1169 ip->i_nlink = 0; 1170 ip->i_flag |= IN_CHANGE; 1171 vput(tvp); 1172 return (error); 1173} 1174 1175/* 1176 * get page routine --- 25 unchanged lines hidden --- |