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