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 * SPDX-License-Identifier: BSD-3-Clause 9 * 10 * Copyright (c) 1982, 1986, 1989, 1993 11 * The Regents of the University of California. All rights reserved. 12 * (c) UNIX System Laboratories, Inc. 13 * All or some portions of this file are derived from material licensed 14 * to the University of California by American Telephone and Telegraph 15 * Co. or Unix System Laboratories, Inc. and are reproduced herein with 16 * the permission of UNIX System Laboratories, Inc. 17 * 18 * Redistribution and use in source and binary forms, with or without 19 * modification, are permitted provided that the following conditions 20 * are met: 21 * 1. Redistributions of source code must retain the above copyright 22 * notice, this list of conditions and the following disclaimer. 23 * 2. Redistributions in binary form must reproduce the above copyright 24 * notice, this list of conditions and the following disclaimer in the 25 * documentation and/or other materials provided with the distribution. 26 * 3. Neither the name of the University nor the names of its contributors 27 * may be used to endorse or promote products derived from this software 28 * without specific prior written permission. 29 * 30 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 31 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 32 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 33 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 34 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 35 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 36 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 37 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 38 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 39 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 40 * SUCH DAMAGE. 41 * 42 * @(#)ufs_vnops.c 8.7 (Berkeley) 2/3/94 43 * @(#)ufs_vnops.c 8.27 (Berkeley) 5/27/95 44 * $FreeBSD$ 45 */ 46 47 #include "opt_suiddir.h" 48 49 #include <sys/param.h> 50 #include <sys/systm.h> 51 #include <sys/kernel.h> 52 #include <sys/fcntl.h> 53 #include <sys/filio.h> 54 #include <sys/limits.h> 55 #include <sys/sdt.h> 56 #include <sys/stat.h> 57 #include <sys/bio.h> 58 #include <sys/buf.h> 59 #include <sys/endian.h> 60 #include <sys/priv.h> 61 #include <sys/rwlock.h> 62 #include <sys/mount.h> 63 #include <sys/unistd.h> 64 #include <sys/time.h> 65 #include <sys/vnode.h> 66 #include <sys/namei.h> 67 #include <sys/lockf.h> 68 #include <sys/event.h> 69 #include <sys/conf.h> 70 #include <sys/file.h> 71 #include <sys/extattr.h> 72 #include <sys/vmmeter.h> 73 74 #include <vm/vm.h> 75 #include <vm/vm_param.h> 76 #include <vm/vm_extern.h> 77 #include <vm/vm_object.h> 78 #include <vm/vm_page.h> 79 #include <vm/vm_pager.h> 80 #include <vm/vnode_pager.h> 81 82 #include "opt_directio.h" 83 84 #include <ufs/ufs/dir.h> 85 86 #include <fs/ext2fs/fs.h> 87 #include <fs/ext2fs/inode.h> 88 #include <fs/ext2fs/ext2_acl.h> 89 #include <fs/ext2fs/ext2fs.h> 90 #include <fs/ext2fs/ext2_extern.h> 91 #include <fs/ext2fs/ext2_dinode.h> 92 #include <fs/ext2fs/ext2_dir.h> 93 #include <fs/ext2fs/ext2_mount.h> 94 #include <fs/ext2fs/ext2_extattr.h> 95 #include <fs/ext2fs/ext2_extents.h> 96 97 SDT_PROVIDER_DECLARE(ext2fs); 98 /* 99 * ext2fs trace probe: 100 * arg0: verbosity. Higher numbers give more verbose messages 101 * arg1: Textual message 102 */ 103 SDT_PROBE_DEFINE2(ext2fs, , vnops, trace, "int", "char*"); 104 105 static int ext2_makeinode(int mode, struct vnode *, struct vnode **, struct componentname *); 106 static void ext2_itimes_locked(struct vnode *); 107 108 static vop_access_t ext2_access; 109 static int ext2_chmod(struct vnode *, int, struct ucred *, struct thread *); 110 static int ext2_chown(struct vnode *, uid_t, gid_t, struct ucred *, 111 struct thread *); 112 static vop_close_t ext2_close; 113 static vop_create_t ext2_create; 114 static vop_fsync_t ext2_fsync; 115 static vop_getattr_t ext2_getattr; 116 static vop_ioctl_t ext2_ioctl; 117 static vop_link_t ext2_link; 118 static vop_mkdir_t ext2_mkdir; 119 static vop_mknod_t ext2_mknod; 120 static vop_open_t ext2_open; 121 static vop_pathconf_t ext2_pathconf; 122 static vop_print_t ext2_print; 123 static vop_read_t ext2_read; 124 static vop_readlink_t ext2_readlink; 125 static vop_remove_t ext2_remove; 126 static vop_rename_t ext2_rename; 127 static vop_rmdir_t ext2_rmdir; 128 static vop_setattr_t ext2_setattr; 129 static vop_strategy_t ext2_strategy; 130 static vop_symlink_t ext2_symlink; 131 static vop_write_t ext2_write; 132 static vop_deleteextattr_t ext2_deleteextattr; 133 static vop_getextattr_t ext2_getextattr; 134 static vop_listextattr_t ext2_listextattr; 135 static vop_setextattr_t ext2_setextattr; 136 static vop_vptofh_t ext2_vptofh; 137 static vop_close_t ext2fifo_close; 138 static vop_kqfilter_t ext2fifo_kqfilter; 139 140 /* Global vfs data structures for ext2. */ 141 struct vop_vector ext2_vnodeops = { 142 .vop_default = &default_vnodeops, 143 .vop_access = ext2_access, 144 .vop_bmap = ext2_bmap, 145 .vop_cachedlookup = ext2_lookup, 146 .vop_close = ext2_close, 147 .vop_create = ext2_create, 148 .vop_fsync = ext2_fsync, 149 .vop_getpages = vnode_pager_local_getpages, 150 .vop_getpages_async = vnode_pager_local_getpages_async, 151 .vop_getattr = ext2_getattr, 152 .vop_inactive = ext2_inactive, 153 .vop_ioctl = ext2_ioctl, 154 .vop_link = ext2_link, 155 .vop_lookup = vfs_cache_lookup, 156 .vop_mkdir = ext2_mkdir, 157 .vop_mknod = ext2_mknod, 158 .vop_open = ext2_open, 159 .vop_pathconf = ext2_pathconf, 160 .vop_poll = vop_stdpoll, 161 .vop_print = ext2_print, 162 .vop_read = ext2_read, 163 .vop_readdir = ext2_readdir, 164 .vop_readlink = ext2_readlink, 165 .vop_reallocblks = ext2_reallocblks, 166 .vop_reclaim = ext2_reclaim, 167 .vop_remove = ext2_remove, 168 .vop_rename = ext2_rename, 169 .vop_rmdir = ext2_rmdir, 170 .vop_setattr = ext2_setattr, 171 .vop_strategy = ext2_strategy, 172 .vop_symlink = ext2_symlink, 173 .vop_write = ext2_write, 174 .vop_deleteextattr = ext2_deleteextattr, 175 .vop_getextattr = ext2_getextattr, 176 .vop_listextattr = ext2_listextattr, 177 .vop_setextattr = ext2_setextattr, 178 #ifdef UFS_ACL 179 .vop_getacl = ext2_getacl, 180 .vop_setacl = ext2_setacl, 181 .vop_aclcheck = ext2_aclcheck, 182 #endif /* UFS_ACL */ 183 .vop_vptofh = ext2_vptofh, 184 }; 185 VFS_VOP_VECTOR_REGISTER(ext2_vnodeops); 186 187 struct vop_vector ext2_fifoops = { 188 .vop_default = &fifo_specops, 189 .vop_access = ext2_access, 190 .vop_close = ext2fifo_close, 191 .vop_fsync = ext2_fsync, 192 .vop_getattr = ext2_getattr, 193 .vop_inactive = ext2_inactive, 194 .vop_kqfilter = ext2fifo_kqfilter, 195 .vop_pathconf = ext2_pathconf, 196 .vop_print = ext2_print, 197 .vop_read = VOP_PANIC, 198 .vop_reclaim = ext2_reclaim, 199 .vop_setattr = ext2_setattr, 200 .vop_write = VOP_PANIC, 201 .vop_vptofh = ext2_vptofh, 202 }; 203 VFS_VOP_VECTOR_REGISTER(ext2_fifoops); 204 205 /* 206 * A virgin directory (no blushing please). 207 * Note that the type and namlen fields are reversed relative to ext2. 208 * Also, we don't use `struct odirtemplate', since it would just cause 209 * endianness problems. 210 */ 211 static struct dirtemplate mastertemplate = { 212 0, 12, 1, EXT2_FT_DIR, ".", 213 0, DIRBLKSIZ - 12, 2, EXT2_FT_DIR, ".." 214 }; 215 static struct dirtemplate omastertemplate = { 216 0, 12, 1, EXT2_FT_UNKNOWN, ".", 217 0, DIRBLKSIZ - 12, 2, EXT2_FT_UNKNOWN, ".." 218 }; 219 220 static void 221 ext2_itimes_locked(struct vnode *vp) 222 { 223 struct inode *ip; 224 struct timespec ts; 225 226 ASSERT_VI_LOCKED(vp, __func__); 227 228 ip = VTOI(vp); 229 if ((ip->i_flag & (IN_ACCESS | IN_CHANGE | IN_UPDATE)) == 0) 230 return; 231 if ((vp->v_type == VBLK || vp->v_type == VCHR)) 232 ip->i_flag |= IN_LAZYMOD; 233 else 234 ip->i_flag |= IN_MODIFIED; 235 if ((vp->v_mount->mnt_flag & MNT_RDONLY) == 0) { 236 vfs_timestamp(&ts); 237 if (ip->i_flag & IN_ACCESS) { 238 ip->i_atime = ts.tv_sec; 239 ip->i_atimensec = ts.tv_nsec; 240 } 241 if (ip->i_flag & IN_UPDATE) { 242 ip->i_mtime = ts.tv_sec; 243 ip->i_mtimensec = ts.tv_nsec; 244 ip->i_modrev++; 245 } 246 if (ip->i_flag & IN_CHANGE) { 247 ip->i_ctime = ts.tv_sec; 248 ip->i_ctimensec = ts.tv_nsec; 249 } 250 } 251 ip->i_flag &= ~(IN_ACCESS | IN_CHANGE | IN_UPDATE); 252 } 253 254 void 255 ext2_itimes(struct vnode *vp) 256 { 257 258 VI_LOCK(vp); 259 ext2_itimes_locked(vp); 260 VI_UNLOCK(vp); 261 } 262 263 /* 264 * Create a regular file 265 */ 266 static int 267 ext2_create(struct vop_create_args *ap) 268 { 269 int error; 270 271 error = 272 ext2_makeinode(MAKEIMODE(ap->a_vap->va_type, ap->a_vap->va_mode), 273 ap->a_dvp, ap->a_vpp, ap->a_cnp); 274 if (error != 0) 275 return (error); 276 if ((ap->a_cnp->cn_flags & MAKEENTRY) != 0) 277 cache_enter(ap->a_dvp, *ap->a_vpp, ap->a_cnp); 278 return (0); 279 } 280 281 static int 282 ext2_open(struct vop_open_args *ap) 283 { 284 285 if (ap->a_vp->v_type == VBLK || ap->a_vp->v_type == VCHR) 286 return (EOPNOTSUPP); 287 288 /* 289 * Files marked append-only must be opened for appending. 290 */ 291 if ((VTOI(ap->a_vp)->i_flags & APPEND) && 292 (ap->a_mode & (FWRITE | O_APPEND)) == FWRITE) 293 return (EPERM); 294 295 vnode_create_vobject(ap->a_vp, VTOI(ap->a_vp)->i_size, ap->a_td); 296 297 return (0); 298 } 299 300 /* 301 * Close called. 302 * 303 * Update the times on the inode. 304 */ 305 static int 306 ext2_close(struct vop_close_args *ap) 307 { 308 struct vnode *vp = ap->a_vp; 309 310 VI_LOCK(vp); 311 if (vp->v_usecount > 1) 312 ext2_itimes_locked(vp); 313 VI_UNLOCK(vp); 314 return (0); 315 } 316 317 static int 318 ext2_access(struct vop_access_args *ap) 319 { 320 struct vnode *vp = ap->a_vp; 321 struct inode *ip = VTOI(vp); 322 accmode_t accmode = ap->a_accmode; 323 int error; 324 325 if (vp->v_type == VBLK || vp->v_type == VCHR) 326 return (EOPNOTSUPP); 327 328 /* 329 * Disallow write attempts on read-only file systems; 330 * unless the file is a socket, fifo, or a block or 331 * character device resident on the file system. 332 */ 333 if (accmode & VWRITE) { 334 switch (vp->v_type) { 335 case VDIR: 336 case VLNK: 337 case VREG: 338 if (vp->v_mount->mnt_flag & MNT_RDONLY) 339 return (EROFS); 340 break; 341 default: 342 break; 343 } 344 } 345 346 /* If immutable bit set, nobody gets to write it. */ 347 if ((accmode & VWRITE) && (ip->i_flags & (SF_IMMUTABLE | SF_SNAPSHOT))) 348 return (EPERM); 349 350 error = vaccess(vp->v_type, ip->i_mode, ip->i_uid, ip->i_gid, 351 ap->a_accmode, ap->a_cred, NULL); 352 return (error); 353 } 354 355 static int 356 ext2_getattr(struct vop_getattr_args *ap) 357 { 358 struct vnode *vp = ap->a_vp; 359 struct inode *ip = VTOI(vp); 360 struct vattr *vap = ap->a_vap; 361 362 ext2_itimes(vp); 363 /* 364 * Copy from inode table 365 */ 366 vap->va_fsid = dev2udev(ip->i_devvp->v_rdev); 367 vap->va_fileid = ip->i_number; 368 vap->va_mode = ip->i_mode & ~IFMT; 369 vap->va_nlink = ip->i_nlink; 370 vap->va_uid = ip->i_uid; 371 vap->va_gid = ip->i_gid; 372 vap->va_rdev = ip->i_rdev; 373 vap->va_size = ip->i_size; 374 vap->va_atime.tv_sec = ip->i_atime; 375 vap->va_atime.tv_nsec = E2DI_HAS_XTIME(ip) ? ip->i_atimensec : 0; 376 vap->va_mtime.tv_sec = ip->i_mtime; 377 vap->va_mtime.tv_nsec = E2DI_HAS_XTIME(ip) ? ip->i_mtimensec : 0; 378 vap->va_ctime.tv_sec = ip->i_ctime; 379 vap->va_ctime.tv_nsec = E2DI_HAS_XTIME(ip) ? ip->i_ctimensec : 0; 380 if E2DI_HAS_XTIME(ip) { 381 vap->va_birthtime.tv_sec = ip->i_birthtime; 382 vap->va_birthtime.tv_nsec = ip->i_birthnsec; 383 } 384 vap->va_flags = ip->i_flags; 385 vap->va_gen = ip->i_gen; 386 vap->va_blocksize = vp->v_mount->mnt_stat.f_iosize; 387 vap->va_bytes = dbtob((u_quad_t)ip->i_blocks); 388 vap->va_type = IFTOVT(ip->i_mode); 389 vap->va_filerev = ip->i_modrev; 390 return (0); 391 } 392 393 /* 394 * Set attribute vnode op. called from several syscalls 395 */ 396 static int 397 ext2_setattr(struct vop_setattr_args *ap) 398 { 399 struct vattr *vap = ap->a_vap; 400 struct vnode *vp = ap->a_vp; 401 struct inode *ip = VTOI(vp); 402 struct ucred *cred = ap->a_cred; 403 struct thread *td = curthread; 404 int error; 405 406 /* 407 * Check for unsettable attributes. 408 */ 409 if ((vap->va_type != VNON) || (vap->va_nlink != VNOVAL) || 410 (vap->va_fsid != VNOVAL) || (vap->va_fileid != VNOVAL) || 411 (vap->va_blocksize != VNOVAL) || (vap->va_rdev != VNOVAL) || 412 ((int)vap->va_bytes != VNOVAL) || (vap->va_gen != VNOVAL)) { 413 return (EINVAL); 414 } 415 if (vap->va_flags != VNOVAL) { 416 /* Disallow flags not supported by ext2fs. */ 417 if (vap->va_flags & ~(SF_APPEND | SF_IMMUTABLE | UF_NODUMP)) 418 return (EOPNOTSUPP); 419 420 if (vp->v_mount->mnt_flag & MNT_RDONLY) 421 return (EROFS); 422 /* 423 * Callers may only modify the file flags on objects they 424 * have VADMIN rights for. 425 */ 426 if ((error = VOP_ACCESS(vp, VADMIN, cred, td))) 427 return (error); 428 /* 429 * Unprivileged processes and privileged processes in 430 * jail() are not permitted to unset system flags, or 431 * modify flags if any system flags are set. 432 * Privileged non-jail processes may not modify system flags 433 * if securelevel > 0 and any existing system flags are set. 434 */ 435 if (!priv_check_cred(cred, PRIV_VFS_SYSFLAGS)) { 436 if (ip->i_flags & (SF_IMMUTABLE | SF_APPEND)) { 437 error = securelevel_gt(cred, 0); 438 if (error) 439 return (error); 440 } 441 } else { 442 if (ip->i_flags & (SF_IMMUTABLE | SF_APPEND) || 443 ((vap->va_flags ^ ip->i_flags) & SF_SETTABLE)) 444 return (EPERM); 445 } 446 ip->i_flags = vap->va_flags; 447 ip->i_flag |= IN_CHANGE; 448 if (ip->i_flags & (IMMUTABLE | APPEND)) 449 return (0); 450 } 451 if (ip->i_flags & (IMMUTABLE | APPEND)) 452 return (EPERM); 453 /* 454 * Go through the fields and update iff not VNOVAL. 455 */ 456 if (vap->va_uid != (uid_t)VNOVAL || vap->va_gid != (gid_t)VNOVAL) { 457 if (vp->v_mount->mnt_flag & MNT_RDONLY) 458 return (EROFS); 459 if ((error = ext2_chown(vp, vap->va_uid, vap->va_gid, cred, 460 td)) != 0) 461 return (error); 462 } 463 if (vap->va_size != VNOVAL) { 464 /* 465 * Disallow write attempts on read-only file systems; 466 * unless the file is a socket, fifo, or a block or 467 * character device resident on the file system. 468 */ 469 switch (vp->v_type) { 470 case VDIR: 471 return (EISDIR); 472 case VLNK: 473 case VREG: 474 if (vp->v_mount->mnt_flag & MNT_RDONLY) 475 return (EROFS); 476 break; 477 default: 478 break; 479 } 480 if ((error = ext2_truncate(vp, vap->va_size, 0, cred, td)) != 0) 481 return (error); 482 } 483 if (vap->va_atime.tv_sec != VNOVAL || vap->va_mtime.tv_sec != VNOVAL) { 484 if (vp->v_mount->mnt_flag & MNT_RDONLY) 485 return (EROFS); 486 /* 487 * From utimes(2): 488 * If times is NULL, ... The caller must be the owner of 489 * the file, have permission to write the file, or be the 490 * super-user. 491 * If times is non-NULL, ... The caller must be the owner of 492 * the file or be the super-user. 493 */ 494 if ((error = VOP_ACCESS(vp, VADMIN, cred, td)) && 495 ((vap->va_vaflags & VA_UTIMES_NULL) == 0 || 496 (error = VOP_ACCESS(vp, VWRITE, cred, td)))) 497 return (error); 498 ip->i_flag |= IN_CHANGE | IN_MODIFIED; 499 if (vap->va_atime.tv_sec != VNOVAL) { 500 ip->i_flag &= ~IN_ACCESS; 501 ip->i_atime = vap->va_atime.tv_sec; 502 ip->i_atimensec = vap->va_atime.tv_nsec; 503 } 504 if (vap->va_mtime.tv_sec != VNOVAL) { 505 ip->i_flag &= ~IN_UPDATE; 506 ip->i_mtime = vap->va_mtime.tv_sec; 507 ip->i_mtimensec = vap->va_mtime.tv_nsec; 508 } 509 ip->i_birthtime = vap->va_birthtime.tv_sec; 510 ip->i_birthnsec = vap->va_birthtime.tv_nsec; 511 error = ext2_update(vp, 0); 512 if (error) 513 return (error); 514 } 515 error = 0; 516 if (vap->va_mode != (mode_t)VNOVAL) { 517 if (vp->v_mount->mnt_flag & MNT_RDONLY) 518 return (EROFS); 519 error = ext2_chmod(vp, (int)vap->va_mode, cred, td); 520 } 521 return (error); 522 } 523 524 /* 525 * Change the mode on a file. 526 * Inode must be locked before calling. 527 */ 528 static int 529 ext2_chmod(struct vnode *vp, int mode, struct ucred *cred, struct thread *td) 530 { 531 struct inode *ip = VTOI(vp); 532 int error; 533 534 /* 535 * To modify the permissions on a file, must possess VADMIN 536 * for that file. 537 */ 538 if ((error = VOP_ACCESS(vp, VADMIN, cred, td))) 539 return (error); 540 /* 541 * Privileged processes may set the sticky bit on non-directories, 542 * as well as set the setgid bit on a file with a group that the 543 * process is not a member of. 544 */ 545 if (vp->v_type != VDIR && (mode & S_ISTXT)) { 546 error = priv_check_cred(cred, PRIV_VFS_STICKYFILE); 547 if (error) 548 return (EFTYPE); 549 } 550 if (!groupmember(ip->i_gid, cred) && (mode & ISGID)) { 551 error = priv_check_cred(cred, PRIV_VFS_SETGID); 552 if (error) 553 return (error); 554 } 555 ip->i_mode &= ~ALLPERMS; 556 ip->i_mode |= (mode & ALLPERMS); 557 ip->i_flag |= IN_CHANGE; 558 return (0); 559 } 560 561 /* 562 * Perform chown operation on inode ip; 563 * inode must be locked prior to call. 564 */ 565 static int 566 ext2_chown(struct vnode *vp, uid_t uid, gid_t gid, struct ucred *cred, 567 struct thread *td) 568 { 569 struct inode *ip = VTOI(vp); 570 uid_t ouid; 571 gid_t ogid; 572 int error = 0; 573 574 if (uid == (uid_t)VNOVAL) 575 uid = ip->i_uid; 576 if (gid == (gid_t)VNOVAL) 577 gid = ip->i_gid; 578 /* 579 * To modify the ownership of a file, must possess VADMIN 580 * for that file. 581 */ 582 if ((error = VOP_ACCESS(vp, VADMIN, cred, td))) 583 return (error); 584 /* 585 * To change the owner of a file, or change the group of a file 586 * to a group of which we are not a member, the caller must 587 * have privilege. 588 */ 589 if (uid != ip->i_uid || (gid != ip->i_gid && 590 !groupmember(gid, cred))) { 591 error = priv_check_cred(cred, PRIV_VFS_CHOWN); 592 if (error) 593 return (error); 594 } 595 ogid = ip->i_gid; 596 ouid = ip->i_uid; 597 ip->i_gid = gid; 598 ip->i_uid = uid; 599 ip->i_flag |= IN_CHANGE; 600 if ((ip->i_mode & (ISUID | ISGID)) && (ouid != uid || ogid != gid)) { 601 if (priv_check_cred(cred, PRIV_VFS_RETAINSUGID) != 0) 602 ip->i_mode &= ~(ISUID | ISGID); 603 } 604 return (0); 605 } 606 607 /* 608 * Synch an open file. 609 */ 610 /* ARGSUSED */ 611 static int 612 ext2_fsync(struct vop_fsync_args *ap) 613 { 614 /* 615 * Flush all dirty buffers associated with a vnode. 616 */ 617 618 vop_stdfsync(ap); 619 620 return (ext2_update(ap->a_vp, ap->a_waitfor == MNT_WAIT)); 621 } 622 623 /* 624 * Mknod vnode call 625 */ 626 /* ARGSUSED */ 627 static int 628 ext2_mknod(struct vop_mknod_args *ap) 629 { 630 struct vattr *vap = ap->a_vap; 631 struct vnode **vpp = ap->a_vpp; 632 struct inode *ip; 633 ino_t ino; 634 int error; 635 636 error = ext2_makeinode(MAKEIMODE(vap->va_type, vap->va_mode), 637 ap->a_dvp, vpp, ap->a_cnp); 638 if (error) 639 return (error); 640 ip = VTOI(*vpp); 641 ip->i_flag |= IN_ACCESS | IN_CHANGE | IN_UPDATE; 642 if (vap->va_rdev != VNOVAL) { 643 /* 644 * Want to be able to use this to make badblock 645 * inodes, so don't truncate the dev number. 646 */ 647 if (!(ip->i_flag & IN_E4EXTENTS)) 648 ip->i_rdev = vap->va_rdev; 649 } 650 /* 651 * Remove inode, then reload it through VFS_VGET so it is 652 * checked to see if it is an alias of an existing entry in 653 * the inode cache. XXX I don't believe this is necessary now. 654 */ 655 (*vpp)->v_type = VNON; 656 ino = ip->i_number; /* Save this before vgone() invalidates ip. */ 657 vgone(*vpp); 658 vput(*vpp); 659 error = VFS_VGET(ap->a_dvp->v_mount, ino, LK_EXCLUSIVE, vpp); 660 if (error) { 661 *vpp = NULL; 662 return (error); 663 } 664 return (0); 665 } 666 667 static int 668 ext2_remove(struct vop_remove_args *ap) 669 { 670 struct inode *ip; 671 struct vnode *vp = ap->a_vp; 672 struct vnode *dvp = ap->a_dvp; 673 int error; 674 675 ip = VTOI(vp); 676 if ((ip->i_flags & (NOUNLINK | IMMUTABLE | APPEND)) || 677 (VTOI(dvp)->i_flags & APPEND)) { 678 error = EPERM; 679 goto out; 680 } 681 error = ext2_dirremove(dvp, ap->a_cnp); 682 if (error == 0) { 683 ip->i_nlink--; 684 ip->i_flag |= IN_CHANGE; 685 } 686 out: 687 return (error); 688 } 689 690 /* 691 * link vnode call 692 */ 693 static int 694 ext2_link(struct vop_link_args *ap) 695 { 696 struct vnode *vp = ap->a_vp; 697 struct vnode *tdvp = ap->a_tdvp; 698 struct componentname *cnp = ap->a_cnp; 699 struct inode *ip; 700 int error; 701 702 #ifdef INVARIANTS 703 if ((cnp->cn_flags & HASBUF) == 0) 704 panic("ext2_link: no name"); 705 #endif 706 ip = VTOI(vp); 707 if ((nlink_t)ip->i_nlink >= EXT4_LINK_MAX) { 708 error = EMLINK; 709 goto out; 710 } 711 if (ip->i_flags & (IMMUTABLE | APPEND)) { 712 error = EPERM; 713 goto out; 714 } 715 ip->i_nlink++; 716 ip->i_flag |= IN_CHANGE; 717 error = ext2_update(vp, !DOINGASYNC(vp)); 718 if (!error) 719 error = ext2_direnter(ip, tdvp, cnp); 720 if (error) { 721 ip->i_nlink--; 722 ip->i_flag |= IN_CHANGE; 723 } 724 out: 725 return (error); 726 } 727 728 static int 729 ext2_inc_nlink(struct inode *ip) 730 { 731 732 ip->i_nlink++; 733 734 if (S_ISDIR(ip->i_mode) && 735 EXT2_HAS_RO_COMPAT_FEATURE(ip->i_e2fs, EXT2F_ROCOMPAT_DIR_NLINK) && 736 ip->i_nlink > 1) { 737 if (ip->i_nlink >= EXT4_LINK_MAX || ip->i_nlink == 2) 738 ip->i_nlink = 1; 739 } else if (ip->i_nlink > EXT4_LINK_MAX) { 740 ip->i_nlink--; 741 return (EMLINK); 742 } 743 744 return (0); 745 } 746 747 static void 748 ext2_dec_nlink(struct inode *ip) 749 { 750 751 if (!S_ISDIR(ip->i_mode) || ip->i_nlink > 2) 752 ip->i_nlink--; 753 } 754 755 /* 756 * Rename system call. 757 * rename("foo", "bar"); 758 * is essentially 759 * unlink("bar"); 760 * link("foo", "bar"); 761 * unlink("foo"); 762 * but ``atomically''. Can't do full commit without saving state in the 763 * inode on disk which isn't feasible at this time. Best we can do is 764 * always guarantee the target exists. 765 * 766 * Basic algorithm is: 767 * 768 * 1) Bump link count on source while we're linking it to the 769 * target. This also ensure the inode won't be deleted out 770 * from underneath us while we work (it may be truncated by 771 * a concurrent `trunc' or `open' for creation). 772 * 2) Link source to destination. If destination already exists, 773 * delete it first. 774 * 3) Unlink source reference to inode if still around. If a 775 * directory was moved and the parent of the destination 776 * is different from the source, patch the ".." entry in the 777 * directory. 778 */ 779 static int 780 ext2_rename(struct vop_rename_args *ap) 781 { 782 struct vnode *tvp = ap->a_tvp; 783 struct vnode *tdvp = ap->a_tdvp; 784 struct vnode *fvp = ap->a_fvp; 785 struct vnode *fdvp = ap->a_fdvp; 786 struct componentname *tcnp = ap->a_tcnp; 787 struct componentname *fcnp = ap->a_fcnp; 788 struct inode *ip, *xp, *dp; 789 struct dirtemplate *dirbuf; 790 int doingdirectory = 0, oldparent = 0, newparent = 0; 791 int error = 0; 792 u_char namlen; 793 794 #ifdef INVARIANTS 795 if ((tcnp->cn_flags & HASBUF) == 0 || 796 (fcnp->cn_flags & HASBUF) == 0) 797 panic("ext2_rename: no name"); 798 #endif 799 /* 800 * Check for cross-device rename. 801 */ 802 if ((fvp->v_mount != tdvp->v_mount) || 803 (tvp && (fvp->v_mount != tvp->v_mount))) { 804 error = EXDEV; 805 abortit: 806 if (tdvp == tvp) 807 vrele(tdvp); 808 else 809 vput(tdvp); 810 if (tvp) 811 vput(tvp); 812 vrele(fdvp); 813 vrele(fvp); 814 return (error); 815 } 816 817 if (tvp && ((VTOI(tvp)->i_flags & (NOUNLINK | IMMUTABLE | APPEND)) || 818 (VTOI(tdvp)->i_flags & APPEND))) { 819 error = EPERM; 820 goto abortit; 821 } 822 823 /* 824 * Renaming a file to itself has no effect. The upper layers should 825 * not call us in that case. Temporarily just warn if they do. 826 */ 827 if (fvp == tvp) { 828 SDT_PROBE2(ext2fs, , vnops, trace, 1, 829 "rename: fvp == tvp (can't happen)"); 830 error = 0; 831 goto abortit; 832 } 833 834 if ((error = vn_lock(fvp, LK_EXCLUSIVE)) != 0) 835 goto abortit; 836 dp = VTOI(fdvp); 837 ip = VTOI(fvp); 838 if (ip->i_nlink >= EXT4_LINK_MAX && 839 !EXT2_HAS_RO_COMPAT_FEATURE(ip->i_e2fs, EXT2F_ROCOMPAT_DIR_NLINK)) { 840 VOP_UNLOCK(fvp); 841 error = EMLINK; 842 goto abortit; 843 } 844 if ((ip->i_flags & (NOUNLINK | IMMUTABLE | APPEND)) 845 || (dp->i_flags & APPEND)) { 846 VOP_UNLOCK(fvp); 847 error = EPERM; 848 goto abortit; 849 } 850 if ((ip->i_mode & IFMT) == IFDIR) { 851 /* 852 * Avoid ".", "..", and aliases of "." for obvious reasons. 853 */ 854 if ((fcnp->cn_namelen == 1 && fcnp->cn_nameptr[0] == '.') || 855 dp == ip || (fcnp->cn_flags | tcnp->cn_flags) & ISDOTDOT || 856 (ip->i_flag & IN_RENAME)) { 857 VOP_UNLOCK(fvp); 858 error = EINVAL; 859 goto abortit; 860 } 861 ip->i_flag |= IN_RENAME; 862 oldparent = dp->i_number; 863 doingdirectory++; 864 } 865 vrele(fdvp); 866 867 /* 868 * When the target exists, both the directory 869 * and target vnodes are returned locked. 870 */ 871 dp = VTOI(tdvp); 872 xp = NULL; 873 if (tvp) 874 xp = VTOI(tvp); 875 876 /* 877 * 1) Bump link count while we're moving stuff 878 * around. If we crash somewhere before 879 * completing our work, the link count 880 * may be wrong, but correctable. 881 */ 882 ext2_inc_nlink(ip); 883 ip->i_flag |= IN_CHANGE; 884 if ((error = ext2_update(fvp, !DOINGASYNC(fvp))) != 0) { 885 VOP_UNLOCK(fvp); 886 goto bad; 887 } 888 889 /* 890 * If ".." must be changed (ie the directory gets a new 891 * parent) then the source directory must not be in the 892 * directory hierarchy above the target, as this would 893 * orphan everything below the source directory. Also 894 * the user must have write permission in the source so 895 * as to be able to change "..". We must repeat the call 896 * to namei, as the parent directory is unlocked by the 897 * call to checkpath(). 898 */ 899 error = VOP_ACCESS(fvp, VWRITE, tcnp->cn_cred, tcnp->cn_thread); 900 VOP_UNLOCK(fvp); 901 if (oldparent != dp->i_number) 902 newparent = dp->i_number; 903 if (doingdirectory && newparent) { 904 if (error) /* write access check above */ 905 goto bad; 906 if (xp != NULL) 907 vput(tvp); 908 error = ext2_checkpath(ip, dp, tcnp->cn_cred); 909 if (error) 910 goto out; 911 VREF(tdvp); 912 error = relookup(tdvp, &tvp, tcnp); 913 if (error) 914 goto out; 915 vrele(tdvp); 916 dp = VTOI(tdvp); 917 xp = NULL; 918 if (tvp) 919 xp = VTOI(tvp); 920 } 921 /* 922 * 2) If target doesn't exist, link the target 923 * to the source and unlink the source. 924 * Otherwise, rewrite the target directory 925 * entry to reference the source inode and 926 * expunge the original entry's existence. 927 */ 928 if (xp == NULL) { 929 if (dp->i_devvp != ip->i_devvp) 930 panic("ext2_rename: EXDEV"); 931 /* 932 * Account for ".." in new directory. 933 * When source and destination have the same 934 * parent we don't fool with the link count. 935 */ 936 if (doingdirectory && newparent) { 937 error = ext2_inc_nlink(dp); 938 if (error) 939 goto bad; 940 941 dp->i_flag |= IN_CHANGE; 942 error = ext2_update(tdvp, !DOINGASYNC(tdvp)); 943 if (error) 944 goto bad; 945 } 946 error = ext2_direnter(ip, tdvp, tcnp); 947 if (error) { 948 if (doingdirectory && newparent) { 949 ext2_dec_nlink(dp); 950 dp->i_flag |= IN_CHANGE; 951 (void)ext2_update(tdvp, 1); 952 } 953 goto bad; 954 } 955 vput(tdvp); 956 } else { 957 if (xp->i_devvp != dp->i_devvp || xp->i_devvp != ip->i_devvp) 958 panic("ext2_rename: EXDEV"); 959 /* 960 * Short circuit rename(foo, foo). 961 */ 962 if (xp->i_number == ip->i_number) 963 panic("ext2_rename: same file"); 964 /* 965 * If the parent directory is "sticky", then the user must 966 * own the parent directory, or the destination of the rename, 967 * otherwise the destination may not be changed (except by 968 * root). This implements append-only directories. 969 */ 970 if ((dp->i_mode & S_ISTXT) && tcnp->cn_cred->cr_uid != 0 && 971 tcnp->cn_cred->cr_uid != dp->i_uid && 972 xp->i_uid != tcnp->cn_cred->cr_uid) { 973 error = EPERM; 974 goto bad; 975 } 976 /* 977 * Target must be empty if a directory and have no links 978 * to it. Also, ensure source and target are compatible 979 * (both directories, or both not directories). 980 */ 981 if ((xp->i_mode & IFMT) == IFDIR) { 982 if (!ext2_dirempty(xp, dp->i_number, tcnp->cn_cred)) { 983 error = ENOTEMPTY; 984 goto bad; 985 } 986 if (!doingdirectory) { 987 error = ENOTDIR; 988 goto bad; 989 } 990 cache_purge(tdvp); 991 } else if (doingdirectory) { 992 error = EISDIR; 993 goto bad; 994 } 995 error = ext2_dirrewrite(dp, ip, tcnp); 996 if (error) 997 goto bad; 998 /* 999 * If the target directory is in the same 1000 * directory as the source directory, 1001 * decrement the link count on the parent 1002 * of the target directory. 1003 */ 1004 if (doingdirectory && !newparent) { 1005 ext2_dec_nlink(dp); 1006 dp->i_flag |= IN_CHANGE; 1007 } 1008 vput(tdvp); 1009 /* 1010 * Adjust the link count of the target to 1011 * reflect the dirrewrite above. If this is 1012 * a directory it is empty and there are 1013 * no links to it, so we can squash the inode and 1014 * any space associated with it. We disallowed 1015 * renaming over top of a directory with links to 1016 * it above, as the remaining link would point to 1017 * a directory without "." or ".." entries. 1018 */ 1019 ext2_dec_nlink(xp); 1020 if (doingdirectory) { 1021 if (--xp->i_nlink != 0) 1022 panic("ext2_rename: linked directory"); 1023 error = ext2_truncate(tvp, (off_t)0, IO_SYNC, 1024 tcnp->cn_cred, tcnp->cn_thread); 1025 } 1026 xp->i_flag |= IN_CHANGE; 1027 vput(tvp); 1028 xp = NULL; 1029 } 1030 1031 /* 1032 * 3) Unlink the source. 1033 */ 1034 fcnp->cn_flags &= ~MODMASK; 1035 fcnp->cn_flags |= LOCKPARENT | LOCKLEAF; 1036 VREF(fdvp); 1037 error = relookup(fdvp, &fvp, fcnp); 1038 if (error == 0) 1039 vrele(fdvp); 1040 if (fvp != NULL) { 1041 xp = VTOI(fvp); 1042 dp = VTOI(fdvp); 1043 } else { 1044 /* 1045 * From name has disappeared. IN_RENAME is not sufficient 1046 * to protect against directory races due to timing windows, 1047 * so we can't panic here. 1048 */ 1049 vrele(ap->a_fvp); 1050 return (0); 1051 } 1052 /* 1053 * Ensure that the directory entry still exists and has not 1054 * changed while the new name has been entered. If the source is 1055 * a file then the entry may have been unlinked or renamed. In 1056 * either case there is no further work to be done. If the source 1057 * is a directory then it cannot have been rmdir'ed; its link 1058 * count of three would cause a rmdir to fail with ENOTEMPTY. 1059 * The IN_RENAME flag ensures that it cannot be moved by another 1060 * rename. 1061 */ 1062 if (xp != ip) { 1063 /* 1064 * From name resolves to a different inode. IN_RENAME is 1065 * not sufficient protection against timing window races 1066 * so we can't panic here. 1067 */ 1068 } else { 1069 /* 1070 * If the source is a directory with a 1071 * new parent, the link count of the old 1072 * parent directory must be decremented 1073 * and ".." set to point to the new parent. 1074 */ 1075 if (doingdirectory && newparent) { 1076 ext2_dec_nlink(dp); 1077 dp->i_flag |= IN_CHANGE; 1078 dirbuf = malloc(dp->i_e2fs->e2fs_bsize, M_TEMP, M_WAITOK | M_ZERO); 1079 if (!dirbuf) { 1080 error = ENOMEM; 1081 goto bad; 1082 } 1083 error = vn_rdwr(UIO_READ, fvp, (caddr_t)dirbuf, 1084 ip->i_e2fs->e2fs_bsize, (off_t)0, 1085 UIO_SYSSPACE, IO_NODELOCKED | IO_NOMACCHECK, 1086 tcnp->cn_cred, NOCRED, NULL, NULL); 1087 if (error == 0) { 1088 /* Like ufs little-endian: */ 1089 namlen = dirbuf->dotdot_type; 1090 if (namlen != 2 || 1091 dirbuf->dotdot_name[0] != '.' || 1092 dirbuf->dotdot_name[1] != '.') { 1093 ext2_dirbad(xp, (doff_t)12, 1094 "rename: mangled dir"); 1095 } else { 1096 dirbuf->dotdot_ino = newparent; 1097 /* 1098 * dirblock 0 could be htree root, 1099 * try both csum update functions. 1100 */ 1101 ext2_dirent_csum_set(ip, 1102 (struct ext2fs_direct_2 *)dirbuf); 1103 ext2_dx_csum_set(ip, 1104 (struct ext2fs_direct_2 *)dirbuf); 1105 (void)vn_rdwr(UIO_WRITE, fvp, 1106 (caddr_t)dirbuf, 1107 ip->i_e2fs->e2fs_bsize, 1108 (off_t)0, UIO_SYSSPACE, 1109 IO_NODELOCKED | IO_SYNC | 1110 IO_NOMACCHECK, tcnp->cn_cred, 1111 NOCRED, NULL, NULL); 1112 cache_purge(fdvp); 1113 } 1114 } 1115 free(dirbuf, M_TEMP); 1116 } 1117 error = ext2_dirremove(fdvp, fcnp); 1118 if (!error) { 1119 ext2_dec_nlink(xp); 1120 xp->i_flag |= IN_CHANGE; 1121 } 1122 xp->i_flag &= ~IN_RENAME; 1123 } 1124 if (dp) 1125 vput(fdvp); 1126 if (xp) 1127 vput(fvp); 1128 vrele(ap->a_fvp); 1129 return (error); 1130 1131 bad: 1132 if (xp) 1133 vput(ITOV(xp)); 1134 vput(ITOV(dp)); 1135 out: 1136 if (doingdirectory) 1137 ip->i_flag &= ~IN_RENAME; 1138 if (vn_lock(fvp, LK_EXCLUSIVE) == 0) { 1139 ext2_dec_nlink(ip); 1140 ip->i_flag |= IN_CHANGE; 1141 ip->i_flag &= ~IN_RENAME; 1142 vput(fvp); 1143 } else 1144 vrele(fvp); 1145 return (error); 1146 } 1147 1148 #ifdef UFS_ACL 1149 static int 1150 ext2_do_posix1e_acl_inheritance_dir(struct vnode *dvp, struct vnode *tvp, 1151 mode_t dmode, struct ucred *cred, struct thread *td) 1152 { 1153 int error; 1154 struct inode *ip = VTOI(tvp); 1155 struct acl *dacl, *acl; 1156 1157 acl = acl_alloc(M_WAITOK); 1158 dacl = acl_alloc(M_WAITOK); 1159 1160 /* 1161 * Retrieve default ACL from parent, if any. 1162 */ 1163 error = VOP_GETACL(dvp, ACL_TYPE_DEFAULT, acl, cred, td); 1164 switch (error) { 1165 case 0: 1166 /* 1167 * Retrieved a default ACL, so merge mode and ACL if 1168 * necessary. If the ACL is empty, fall through to 1169 * the "not defined or available" case. 1170 */ 1171 if (acl->acl_cnt != 0) { 1172 dmode = acl_posix1e_newfilemode(dmode, acl); 1173 ip->i_mode = dmode; 1174 *dacl = *acl; 1175 ext2_sync_acl_from_inode(ip, acl); 1176 break; 1177 } 1178 /* FALLTHROUGH */ 1179 1180 case EOPNOTSUPP: 1181 /* 1182 * Just use the mode as-is. 1183 */ 1184 ip->i_mode = dmode; 1185 error = 0; 1186 goto out; 1187 1188 default: 1189 goto out; 1190 } 1191 1192 error = VOP_SETACL(tvp, ACL_TYPE_ACCESS, acl, cred, td); 1193 if (error == 0) 1194 error = VOP_SETACL(tvp, ACL_TYPE_DEFAULT, dacl, cred, td); 1195 switch (error) { 1196 case 0: 1197 break; 1198 1199 case EOPNOTSUPP: 1200 /* 1201 * XXX: This should not happen, as EOPNOTSUPP above 1202 * was supposed to free acl. 1203 */ 1204 #ifdef DEBUG 1205 printf("ext2_mkdir: VOP_GETACL() but no VOP_SETACL()\n"); 1206 #endif /* DEBUG */ 1207 break; 1208 1209 default: 1210 goto out; 1211 } 1212 1213 out: 1214 acl_free(acl); 1215 acl_free(dacl); 1216 1217 return (error); 1218 } 1219 1220 static int 1221 ext2_do_posix1e_acl_inheritance_file(struct vnode *dvp, struct vnode *tvp, 1222 mode_t mode, struct ucred *cred, struct thread *td) 1223 { 1224 int error; 1225 struct inode *ip = VTOI(tvp); 1226 struct acl *acl; 1227 1228 acl = acl_alloc(M_WAITOK); 1229 1230 /* 1231 * Retrieve default ACL for parent, if any. 1232 */ 1233 error = VOP_GETACL(dvp, ACL_TYPE_DEFAULT, acl, cred, td); 1234 switch (error) { 1235 case 0: 1236 /* 1237 * Retrieved a default ACL, so merge mode and ACL if 1238 * necessary. 1239 */ 1240 if (acl->acl_cnt != 0) { 1241 /* 1242 * Two possible ways for default ACL to not 1243 * be present. First, the EA can be 1244 * undefined, or second, the default ACL can 1245 * be blank. If it's blank, fall through to 1246 * the it's not defined case. 1247 */ 1248 mode = acl_posix1e_newfilemode(mode, acl); 1249 ip->i_mode = mode; 1250 ext2_sync_acl_from_inode(ip, acl); 1251 break; 1252 } 1253 /* FALLTHROUGH */ 1254 1255 case EOPNOTSUPP: 1256 /* 1257 * Just use the mode as-is. 1258 */ 1259 ip->i_mode = mode; 1260 error = 0; 1261 goto out; 1262 1263 default: 1264 goto out; 1265 } 1266 1267 error = VOP_SETACL(tvp, ACL_TYPE_ACCESS, acl, cred, td); 1268 switch (error) { 1269 case 0: 1270 break; 1271 1272 case EOPNOTSUPP: 1273 /* 1274 * XXX: This should not happen, as EOPNOTSUPP above was 1275 * supposed to free acl. 1276 */ 1277 printf("ufs_do_posix1e_acl_inheritance_file: VOP_GETACL() " 1278 "but no VOP_SETACL()\n"); 1279 /* panic("ufs_do_posix1e_acl_inheritance_file: VOP_GETACL() " 1280 "but no VOP_SETACL()"); */ 1281 break; 1282 1283 default: 1284 goto out; 1285 } 1286 1287 out: 1288 acl_free(acl); 1289 1290 return (error); 1291 } 1292 1293 #endif /* UFS_ACL */ 1294 1295 /* 1296 * Mkdir system call 1297 */ 1298 static int 1299 ext2_mkdir(struct vop_mkdir_args *ap) 1300 { 1301 struct m_ext2fs *fs; 1302 struct vnode *dvp = ap->a_dvp; 1303 struct vattr *vap = ap->a_vap; 1304 struct componentname *cnp = ap->a_cnp; 1305 struct inode *ip, *dp; 1306 struct vnode *tvp; 1307 struct dirtemplate dirtemplate, *dtp; 1308 char *buf = NULL; 1309 int error, dmode; 1310 1311 #ifdef INVARIANTS 1312 if ((cnp->cn_flags & HASBUF) == 0) 1313 panic("ext2_mkdir: no name"); 1314 #endif 1315 dp = VTOI(dvp); 1316 if ((nlink_t)dp->i_nlink >= EXT4_LINK_MAX && 1317 !EXT2_HAS_RO_COMPAT_FEATURE(dp->i_e2fs, EXT2F_ROCOMPAT_DIR_NLINK)) { 1318 error = EMLINK; 1319 goto out; 1320 } 1321 dmode = vap->va_mode & 0777; 1322 dmode |= IFDIR; 1323 /* 1324 * Must simulate part of ext2_makeinode here to acquire the inode, 1325 * but not have it entered in the parent directory. The entry is 1326 * made later after writing "." and ".." entries. 1327 */ 1328 error = ext2_valloc(dvp, dmode, cnp->cn_cred, &tvp); 1329 if (error) 1330 goto out; 1331 ip = VTOI(tvp); 1332 fs = ip->i_e2fs; 1333 ip->i_gid = dp->i_gid; 1334 #ifdef SUIDDIR 1335 { 1336 /* 1337 * if we are hacking owners here, (only do this where told to) 1338 * and we are not giving it TOO root, (would subvert quotas) 1339 * then go ahead and give it to the other user. 1340 * The new directory also inherits the SUID bit. 1341 * If user's UID and dir UID are the same, 1342 * 'give it away' so that the SUID is still forced on. 1343 */ 1344 if ((dvp->v_mount->mnt_flag & MNT_SUIDDIR) && 1345 (dp->i_mode & ISUID) && dp->i_uid) { 1346 dmode |= ISUID; 1347 ip->i_uid = dp->i_uid; 1348 } else { 1349 ip->i_uid = cnp->cn_cred->cr_uid; 1350 } 1351 } 1352 #else 1353 ip->i_uid = cnp->cn_cred->cr_uid; 1354 #endif 1355 ip->i_flag |= IN_ACCESS | IN_CHANGE | IN_UPDATE; 1356 ip->i_mode = dmode; 1357 tvp->v_type = VDIR; /* Rest init'd in getnewvnode(). */ 1358 ip->i_nlink = 2; 1359 if (cnp->cn_flags & ISWHITEOUT) 1360 ip->i_flags |= UF_OPAQUE; 1361 error = ext2_update(tvp, 1); 1362 1363 /* 1364 * Bump link count in parent directory 1365 * to reflect work done below. Should 1366 * be done before reference is created 1367 * so reparation is possible if we crash. 1368 */ 1369 ext2_inc_nlink(dp); 1370 dp->i_flag |= IN_CHANGE; 1371 error = ext2_update(dvp, !DOINGASYNC(dvp)); 1372 if (error) 1373 goto bad; 1374 1375 /* Initialize directory with "." and ".." from static template. */ 1376 if (EXT2_HAS_INCOMPAT_FEATURE(ip->i_e2fs, 1377 EXT2F_INCOMPAT_FTYPE)) 1378 dtp = &mastertemplate; 1379 else 1380 dtp = &omastertemplate; 1381 dirtemplate = *dtp; 1382 dirtemplate.dot_ino = ip->i_number; 1383 dirtemplate.dotdot_ino = dp->i_number; 1384 /* 1385 * note that in ext2 DIRBLKSIZ == blocksize, not DEV_BSIZE so let's 1386 * just redefine it - for this function only 1387 */ 1388 #undef DIRBLKSIZ 1389 #define DIRBLKSIZ VTOI(dvp)->i_e2fs->e2fs_bsize 1390 dirtemplate.dotdot_reclen = DIRBLKSIZ - 12; 1391 buf = malloc(DIRBLKSIZ, M_TEMP, M_WAITOK | M_ZERO); 1392 if (!buf) { 1393 error = ENOMEM; 1394 ext2_dec_nlink(dp); 1395 dp->i_flag |= IN_CHANGE; 1396 goto bad; 1397 } 1398 if (EXT2_HAS_RO_COMPAT_FEATURE(fs, EXT2F_ROCOMPAT_METADATA_CKSUM)) { 1399 dirtemplate.dotdot_reclen -= sizeof(struct ext2fs_direct_tail); 1400 ext2_init_dirent_tail(EXT2_DIRENT_TAIL(buf, DIRBLKSIZ)); 1401 } 1402 memcpy(buf, &dirtemplate, sizeof(dirtemplate)); 1403 ext2_dirent_csum_set(ip, (struct ext2fs_direct_2 *)buf); 1404 error = vn_rdwr(UIO_WRITE, tvp, (caddr_t)buf, 1405 DIRBLKSIZ, (off_t)0, UIO_SYSSPACE, 1406 IO_NODELOCKED | IO_SYNC | IO_NOMACCHECK, cnp->cn_cred, NOCRED, 1407 NULL, NULL); 1408 if (error) { 1409 ext2_dec_nlink(dp); 1410 dp->i_flag |= IN_CHANGE; 1411 goto bad; 1412 } 1413 if (DIRBLKSIZ > VFSTOEXT2(dvp->v_mount)->um_mountp->mnt_stat.f_bsize) 1414 /* XXX should grow with balloc() */ 1415 panic("ext2_mkdir: blksize"); 1416 else { 1417 ip->i_size = DIRBLKSIZ; 1418 ip->i_flag |= IN_CHANGE; 1419 } 1420 1421 #ifdef UFS_ACL 1422 if (dvp->v_mount->mnt_flag & MNT_ACLS) { 1423 error = ext2_do_posix1e_acl_inheritance_dir(dvp, tvp, dmode, 1424 cnp->cn_cred, cnp->cn_thread); 1425 if (error) 1426 goto bad; 1427 } 1428 1429 #endif /* UFS_ACL */ 1430 1431 /* Directory set up, now install its entry in the parent directory. */ 1432 error = ext2_direnter(ip, dvp, cnp); 1433 if (error) { 1434 ext2_dec_nlink(dp); 1435 dp->i_flag |= IN_CHANGE; 1436 } 1437 bad: 1438 /* 1439 * No need to do an explicit VOP_TRUNCATE here, vrele will do this 1440 * for us because we set the link count to 0. 1441 */ 1442 if (error) { 1443 ip->i_nlink = 0; 1444 ip->i_flag |= IN_CHANGE; 1445 vput(tvp); 1446 } else 1447 *ap->a_vpp = tvp; 1448 out: 1449 free(buf, M_TEMP); 1450 return (error); 1451 #undef DIRBLKSIZ 1452 #define DIRBLKSIZ DEV_BSIZE 1453 } 1454 1455 /* 1456 * Rmdir system call. 1457 */ 1458 static int 1459 ext2_rmdir(struct vop_rmdir_args *ap) 1460 { 1461 struct vnode *vp = ap->a_vp; 1462 struct vnode *dvp = ap->a_dvp; 1463 struct componentname *cnp = ap->a_cnp; 1464 struct inode *ip, *dp; 1465 int error; 1466 1467 ip = VTOI(vp); 1468 dp = VTOI(dvp); 1469 1470 /* 1471 * Verify the directory is empty (and valid). 1472 * (Rmdir ".." won't be valid since 1473 * ".." will contain a reference to 1474 * the current directory and thus be 1475 * non-empty.) 1476 */ 1477 if (!ext2_dirempty(ip, dp->i_number, cnp->cn_cred)) { 1478 error = ENOTEMPTY; 1479 goto out; 1480 } 1481 if ((dp->i_flags & APPEND) 1482 || (ip->i_flags & (NOUNLINK | IMMUTABLE | APPEND))) { 1483 error = EPERM; 1484 goto out; 1485 } 1486 /* 1487 * Delete reference to directory before purging 1488 * inode. If we crash in between, the directory 1489 * will be reattached to lost+found, 1490 */ 1491 error = ext2_dirremove(dvp, cnp); 1492 if (error) 1493 goto out; 1494 ext2_dec_nlink(dp); 1495 dp->i_flag |= IN_CHANGE; 1496 cache_purge(dvp); 1497 VOP_UNLOCK(dvp); 1498 /* 1499 * Truncate inode. The only stuff left 1500 * in the directory is "." and "..". 1501 */ 1502 ip->i_nlink = 0; 1503 error = ext2_truncate(vp, (off_t)0, IO_SYNC, cnp->cn_cred, 1504 cnp->cn_thread); 1505 cache_purge(ITOV(ip)); 1506 if (vn_lock(dvp, LK_EXCLUSIVE | LK_NOWAIT) != 0) { 1507 VOP_UNLOCK(vp); 1508 vn_lock(dvp, LK_EXCLUSIVE | LK_RETRY); 1509 vn_lock(vp, LK_EXCLUSIVE | LK_RETRY); 1510 } 1511 out: 1512 return (error); 1513 } 1514 1515 /* 1516 * symlink -- make a symbolic link 1517 */ 1518 static int 1519 ext2_symlink(struct vop_symlink_args *ap) 1520 { 1521 struct vnode *vp, **vpp = ap->a_vpp; 1522 struct inode *ip; 1523 int len, error; 1524 1525 error = ext2_makeinode(IFLNK | ap->a_vap->va_mode, ap->a_dvp, 1526 vpp, ap->a_cnp); 1527 if (error) 1528 return (error); 1529 vp = *vpp; 1530 len = strlen(ap->a_target); 1531 if (len < vp->v_mount->mnt_maxsymlinklen) { 1532 ip = VTOI(vp); 1533 bcopy(ap->a_target, (char *)ip->i_shortlink, len); 1534 ip->i_size = len; 1535 ip->i_flag |= IN_CHANGE | IN_UPDATE; 1536 } else 1537 error = vn_rdwr(UIO_WRITE, vp, __DECONST(void *, ap->a_target), 1538 len, (off_t)0, UIO_SYSSPACE, IO_NODELOCKED | IO_NOMACCHECK, 1539 ap->a_cnp->cn_cred, NOCRED, NULL, NULL); 1540 if (error) 1541 vput(vp); 1542 return (error); 1543 } 1544 1545 /* 1546 * Return target name of a symbolic link 1547 */ 1548 static int 1549 ext2_readlink(struct vop_readlink_args *ap) 1550 { 1551 struct vnode *vp = ap->a_vp; 1552 struct inode *ip = VTOI(vp); 1553 int isize; 1554 1555 isize = ip->i_size; 1556 if (isize < vp->v_mount->mnt_maxsymlinklen) { 1557 uiomove((char *)ip->i_shortlink, isize, ap->a_uio); 1558 return (0); 1559 } 1560 return (VOP_READ(vp, ap->a_uio, 0, ap->a_cred)); 1561 } 1562 1563 /* 1564 * Calculate the logical to physical mapping if not done already, 1565 * then call the device strategy routine. 1566 * 1567 * In order to be able to swap to a file, the ext2_bmaparray() operation may not 1568 * deadlock on memory. See ext2_bmap() for details. 1569 */ 1570 static int 1571 ext2_strategy(struct vop_strategy_args *ap) 1572 { 1573 struct buf *bp = ap->a_bp; 1574 struct vnode *vp = ap->a_vp; 1575 struct bufobj *bo; 1576 daddr_t blkno; 1577 int error; 1578 1579 if (vp->v_type == VBLK || vp->v_type == VCHR) 1580 panic("ext2_strategy: spec"); 1581 if (bp->b_blkno == bp->b_lblkno) { 1582 1583 if (VTOI(ap->a_vp)->i_flag & IN_E4EXTENTS) 1584 error = ext4_bmapext(vp, bp->b_lblkno, &blkno, NULL, NULL); 1585 else 1586 error = ext2_bmaparray(vp, bp->b_lblkno, &blkno, NULL, NULL); 1587 1588 bp->b_blkno = blkno; 1589 if (error) { 1590 bp->b_error = error; 1591 bp->b_ioflags |= BIO_ERROR; 1592 bufdone(bp); 1593 return (0); 1594 } 1595 if ((long)bp->b_blkno == -1) 1596 vfs_bio_clrbuf(bp); 1597 } 1598 if ((long)bp->b_blkno == -1) { 1599 bufdone(bp); 1600 return (0); 1601 } 1602 bp->b_iooffset = dbtob(bp->b_blkno); 1603 bo = VFSTOEXT2(vp->v_mount)->um_bo; 1604 BO_STRATEGY(bo, bp); 1605 return (0); 1606 } 1607 1608 /* 1609 * Print out the contents of an inode. 1610 */ 1611 static int 1612 ext2_print(struct vop_print_args *ap) 1613 { 1614 struct vnode *vp = ap->a_vp; 1615 struct inode *ip = VTOI(vp); 1616 1617 vn_printf(ip->i_devvp, "\tino %ju", (uintmax_t)ip->i_number); 1618 if (vp->v_type == VFIFO) 1619 fifo_printinfo(vp); 1620 printf("\n"); 1621 return (0); 1622 } 1623 1624 /* 1625 * Close wrapper for fifos. 1626 * 1627 * Update the times on the inode then do device close. 1628 */ 1629 static int 1630 ext2fifo_close(struct vop_close_args *ap) 1631 { 1632 struct vnode *vp = ap->a_vp; 1633 1634 VI_LOCK(vp); 1635 if (vp->v_usecount > 1) 1636 ext2_itimes_locked(vp); 1637 VI_UNLOCK(vp); 1638 return (fifo_specops.vop_close(ap)); 1639 } 1640 1641 /* 1642 * Kqfilter wrapper for fifos. 1643 * 1644 * Fall through to ext2 kqfilter routines if needed 1645 */ 1646 static int 1647 ext2fifo_kqfilter(struct vop_kqfilter_args *ap) 1648 { 1649 int error; 1650 1651 error = fifo_specops.vop_kqfilter(ap); 1652 if (error) 1653 error = vfs_kqfilter(ap); 1654 return (error); 1655 } 1656 1657 /* 1658 * Return POSIX pathconf information applicable to ext2 filesystems. 1659 */ 1660 static int 1661 ext2_pathconf(struct vop_pathconf_args *ap) 1662 { 1663 int error = 0; 1664 1665 switch (ap->a_name) { 1666 case _PC_LINK_MAX: 1667 if (EXT2_HAS_RO_COMPAT_FEATURE(VTOI(ap->a_vp)->i_e2fs, 1668 EXT2F_ROCOMPAT_DIR_NLINK)) 1669 *ap->a_retval = INT_MAX; 1670 else 1671 *ap->a_retval = EXT4_LINK_MAX; 1672 break; 1673 case _PC_NAME_MAX: 1674 *ap->a_retval = NAME_MAX; 1675 break; 1676 case _PC_PIPE_BUF: 1677 if (ap->a_vp->v_type == VDIR || ap->a_vp->v_type == VFIFO) 1678 *ap->a_retval = PIPE_BUF; 1679 else 1680 error = EINVAL; 1681 break; 1682 case _PC_CHOWN_RESTRICTED: 1683 *ap->a_retval = 1; 1684 break; 1685 case _PC_NO_TRUNC: 1686 *ap->a_retval = 1; 1687 break; 1688 1689 #ifdef UFS_ACL 1690 case _PC_ACL_EXTENDED: 1691 if (ap->a_vp->v_mount->mnt_flag & MNT_ACLS) 1692 *ap->a_retval = 1; 1693 else 1694 *ap->a_retval = 0; 1695 break; 1696 case _PC_ACL_PATH_MAX: 1697 if (ap->a_vp->v_mount->mnt_flag & MNT_ACLS) 1698 *ap->a_retval = ACL_MAX_ENTRIES; 1699 else 1700 *ap->a_retval = 3; 1701 break; 1702 #endif /* UFS_ACL */ 1703 1704 case _PC_MIN_HOLE_SIZE: 1705 *ap->a_retval = ap->a_vp->v_mount->mnt_stat.f_iosize; 1706 break; 1707 case _PC_PRIO_IO: 1708 *ap->a_retval = 0; 1709 break; 1710 case _PC_SYNC_IO: 1711 *ap->a_retval = 0; 1712 break; 1713 case _PC_ALLOC_SIZE_MIN: 1714 *ap->a_retval = ap->a_vp->v_mount->mnt_stat.f_bsize; 1715 break; 1716 case _PC_FILESIZEBITS: 1717 *ap->a_retval = 64; 1718 break; 1719 case _PC_REC_INCR_XFER_SIZE: 1720 *ap->a_retval = ap->a_vp->v_mount->mnt_stat.f_iosize; 1721 break; 1722 case _PC_REC_MAX_XFER_SIZE: 1723 *ap->a_retval = -1; /* means ``unlimited'' */ 1724 break; 1725 case _PC_REC_MIN_XFER_SIZE: 1726 *ap->a_retval = ap->a_vp->v_mount->mnt_stat.f_iosize; 1727 break; 1728 case _PC_REC_XFER_ALIGN: 1729 *ap->a_retval = PAGE_SIZE; 1730 break; 1731 case _PC_SYMLINK_MAX: 1732 *ap->a_retval = MAXPATHLEN; 1733 break; 1734 1735 default: 1736 error = vop_stdpathconf(ap); 1737 break; 1738 } 1739 return (error); 1740 } 1741 1742 /* 1743 * Vnode operation to remove a named attribute. 1744 */ 1745 static int 1746 ext2_deleteextattr(struct vop_deleteextattr_args *ap) 1747 { 1748 struct inode *ip; 1749 struct m_ext2fs *fs; 1750 int error; 1751 1752 ip = VTOI(ap->a_vp); 1753 fs = ip->i_e2fs; 1754 1755 if (!EXT2_HAS_COMPAT_FEATURE(ip->i_e2fs, EXT2F_COMPAT_EXT_ATTR)) 1756 return (EOPNOTSUPP); 1757 1758 if (ap->a_vp->v_type == VCHR || ap->a_vp->v_type == VBLK) 1759 return (EOPNOTSUPP); 1760 1761 error = extattr_check_cred(ap->a_vp, ap->a_attrnamespace, 1762 ap->a_cred, ap->a_td, VWRITE); 1763 if (error) 1764 return (error); 1765 1766 error = ENOATTR; 1767 1768 if (EXT2_INODE_SIZE(fs) != E2FS_REV0_INODE_SIZE) { 1769 error = ext2_extattr_inode_delete(ip, ap->a_attrnamespace, ap->a_name); 1770 if (error != ENOATTR) 1771 return (error); 1772 } 1773 1774 if (ip->i_facl) 1775 error = ext2_extattr_block_delete(ip, ap->a_attrnamespace, ap->a_name); 1776 1777 return (error); 1778 } 1779 1780 /* 1781 * Vnode operation to retrieve a named extended attribute. 1782 */ 1783 static int 1784 ext2_getextattr(struct vop_getextattr_args *ap) 1785 { 1786 struct inode *ip; 1787 struct m_ext2fs *fs; 1788 int error; 1789 1790 ip = VTOI(ap->a_vp); 1791 fs = ip->i_e2fs; 1792 1793 if (!EXT2_HAS_COMPAT_FEATURE(ip->i_e2fs, EXT2F_COMPAT_EXT_ATTR)) 1794 return (EOPNOTSUPP); 1795 1796 if (ap->a_vp->v_type == VCHR || ap->a_vp->v_type == VBLK) 1797 return (EOPNOTSUPP); 1798 1799 error = extattr_check_cred(ap->a_vp, ap->a_attrnamespace, 1800 ap->a_cred, ap->a_td, VREAD); 1801 if (error) 1802 return (error); 1803 1804 if (ap->a_size != NULL) 1805 *ap->a_size = 0; 1806 1807 error = ENOATTR; 1808 1809 if (EXT2_INODE_SIZE(fs) != E2FS_REV0_INODE_SIZE) { 1810 error = ext2_extattr_inode_get(ip, ap->a_attrnamespace, 1811 ap->a_name, ap->a_uio, ap->a_size); 1812 if (error != ENOATTR) 1813 return (error); 1814 } 1815 1816 if (ip->i_facl) 1817 error = ext2_extattr_block_get(ip, ap->a_attrnamespace, 1818 ap->a_name, ap->a_uio, ap->a_size); 1819 1820 return (error); 1821 } 1822 1823 /* 1824 * Vnode operation to retrieve extended attributes on a vnode. 1825 */ 1826 static int 1827 ext2_listextattr(struct vop_listextattr_args *ap) 1828 { 1829 struct inode *ip; 1830 struct m_ext2fs *fs; 1831 int error; 1832 1833 ip = VTOI(ap->a_vp); 1834 fs = ip->i_e2fs; 1835 1836 if (!EXT2_HAS_COMPAT_FEATURE(ip->i_e2fs, EXT2F_COMPAT_EXT_ATTR)) 1837 return (EOPNOTSUPP); 1838 1839 if (ap->a_vp->v_type == VCHR || ap->a_vp->v_type == VBLK) 1840 return (EOPNOTSUPP); 1841 1842 error = extattr_check_cred(ap->a_vp, ap->a_attrnamespace, 1843 ap->a_cred, ap->a_td, VREAD); 1844 if (error) 1845 return (error); 1846 1847 if (ap->a_size != NULL) 1848 *ap->a_size = 0; 1849 1850 if (EXT2_INODE_SIZE(fs) != E2FS_REV0_INODE_SIZE) { 1851 error = ext2_extattr_inode_list(ip, ap->a_attrnamespace, 1852 ap->a_uio, ap->a_size); 1853 if (error) 1854 return (error); 1855 } 1856 1857 if (ip->i_facl) 1858 error = ext2_extattr_block_list(ip, ap->a_attrnamespace, 1859 ap->a_uio, ap->a_size); 1860 1861 return (error); 1862 } 1863 1864 /* 1865 * Vnode operation to set a named attribute. 1866 */ 1867 static int 1868 ext2_setextattr(struct vop_setextattr_args *ap) 1869 { 1870 struct inode *ip; 1871 struct m_ext2fs *fs; 1872 int error; 1873 1874 ip = VTOI(ap->a_vp); 1875 fs = ip->i_e2fs; 1876 1877 if (!EXT2_HAS_COMPAT_FEATURE(ip->i_e2fs, EXT2F_COMPAT_EXT_ATTR)) 1878 return (EOPNOTSUPP); 1879 1880 if (ap->a_vp->v_type == VCHR || ap->a_vp->v_type == VBLK) 1881 return (EOPNOTSUPP); 1882 1883 error = extattr_check_cred(ap->a_vp, ap->a_attrnamespace, 1884 ap->a_cred, ap->a_td, VWRITE); 1885 if (error) 1886 return (error); 1887 1888 error = ext2_extattr_valid_attrname(ap->a_attrnamespace, ap->a_name); 1889 if (error) 1890 return (error); 1891 1892 if (EXT2_INODE_SIZE(fs) != E2FS_REV0_INODE_SIZE) { 1893 error = ext2_extattr_inode_set(ip, ap->a_attrnamespace, 1894 ap->a_name, ap->a_uio); 1895 if (error != ENOSPC) 1896 return (error); 1897 } 1898 1899 error = ext2_extattr_block_set(ip, ap->a_attrnamespace, 1900 ap->a_name, ap->a_uio); 1901 1902 return (error); 1903 } 1904 1905 /* 1906 * Vnode pointer to File handle 1907 */ 1908 /* ARGSUSED */ 1909 static int 1910 ext2_vptofh(struct vop_vptofh_args *ap) 1911 { 1912 struct inode *ip; 1913 struct ufid *ufhp; 1914 1915 ip = VTOI(ap->a_vp); 1916 ufhp = (struct ufid *)ap->a_fhp; 1917 ufhp->ufid_len = sizeof(struct ufid); 1918 ufhp->ufid_ino = ip->i_number; 1919 ufhp->ufid_gen = ip->i_gen; 1920 return (0); 1921 } 1922 1923 /* 1924 * Initialize the vnode associated with a new inode, handle aliased 1925 * vnodes. 1926 */ 1927 int 1928 ext2_vinit(struct mount *mntp, struct vop_vector *fifoops, struct vnode **vpp) 1929 { 1930 struct inode *ip; 1931 struct vnode *vp; 1932 1933 vp = *vpp; 1934 ip = VTOI(vp); 1935 vp->v_type = IFTOVT(ip->i_mode); 1936 /* 1937 * Only unallocated inodes should be of type VNON. 1938 */ 1939 if (ip->i_mode != 0 && vp->v_type == VNON) 1940 return (EINVAL); 1941 if (vp->v_type == VFIFO) 1942 vp->v_op = fifoops; 1943 1944 if (ip->i_number == EXT2_ROOTINO) 1945 vp->v_vflag |= VV_ROOT; 1946 ip->i_modrev = init_va_filerev(); 1947 *vpp = vp; 1948 return (0); 1949 } 1950 1951 /* 1952 * Allocate a new inode. 1953 */ 1954 static int 1955 ext2_makeinode(int mode, struct vnode *dvp, struct vnode **vpp, 1956 struct componentname *cnp) 1957 { 1958 struct inode *ip, *pdir; 1959 struct vnode *tvp; 1960 int error; 1961 1962 pdir = VTOI(dvp); 1963 #ifdef INVARIANTS 1964 if ((cnp->cn_flags & HASBUF) == 0) 1965 panic("ext2_makeinode: no name"); 1966 #endif 1967 *vpp = NULL; 1968 if ((mode & IFMT) == 0) 1969 mode |= IFREG; 1970 1971 error = ext2_valloc(dvp, mode, cnp->cn_cred, &tvp); 1972 if (error) { 1973 return (error); 1974 } 1975 ip = VTOI(tvp); 1976 ip->i_gid = pdir->i_gid; 1977 #ifdef SUIDDIR 1978 { 1979 /* 1980 * if we are 1981 * not the owner of the directory, 1982 * and we are hacking owners here, (only do this where told to) 1983 * and we are not giving it TOO root, (would subvert quotas) 1984 * then go ahead and give it to the other user. 1985 * Note that this drops off the execute bits for security. 1986 */ 1987 if ((dvp->v_mount->mnt_flag & MNT_SUIDDIR) && 1988 (pdir->i_mode & ISUID) && 1989 (pdir->i_uid != cnp->cn_cred->cr_uid) && pdir->i_uid) { 1990 ip->i_uid = pdir->i_uid; 1991 mode &= ~07111; 1992 } else { 1993 ip->i_uid = cnp->cn_cred->cr_uid; 1994 } 1995 } 1996 #else 1997 ip->i_uid = cnp->cn_cred->cr_uid; 1998 #endif 1999 ip->i_flag |= IN_ACCESS | IN_CHANGE | IN_UPDATE; 2000 ip->i_mode = mode; 2001 tvp->v_type = IFTOVT(mode); /* Rest init'd in getnewvnode(). */ 2002 ip->i_nlink = 1; 2003 if ((ip->i_mode & ISGID) && !groupmember(ip->i_gid, cnp->cn_cred)) { 2004 if (priv_check_cred(cnp->cn_cred, PRIV_VFS_RETAINSUGID)) 2005 ip->i_mode &= ~ISGID; 2006 } 2007 2008 if (cnp->cn_flags & ISWHITEOUT) 2009 ip->i_flags |= UF_OPAQUE; 2010 2011 /* 2012 * Make sure inode goes to disk before directory entry. 2013 */ 2014 error = ext2_update(tvp, !DOINGASYNC(tvp)); 2015 if (error) 2016 goto bad; 2017 2018 #ifdef UFS_ACL 2019 if (dvp->v_mount->mnt_flag & MNT_ACLS) { 2020 error = ext2_do_posix1e_acl_inheritance_file(dvp, tvp, mode, 2021 cnp->cn_cred, cnp->cn_thread); 2022 if (error) 2023 goto bad; 2024 } 2025 #endif /* UFS_ACL */ 2026 2027 error = ext2_direnter(ip, dvp, cnp); 2028 if (error) 2029 goto bad; 2030 2031 *vpp = tvp; 2032 return (0); 2033 2034 bad: 2035 /* 2036 * Write error occurred trying to update the inode 2037 * or the directory so must deallocate the inode. 2038 */ 2039 ip->i_nlink = 0; 2040 ip->i_flag |= IN_CHANGE; 2041 vput(tvp); 2042 return (error); 2043 } 2044 2045 /* 2046 * Vnode op for reading. 2047 */ 2048 static int 2049 ext2_read(struct vop_read_args *ap) 2050 { 2051 struct vnode *vp; 2052 struct inode *ip; 2053 struct uio *uio; 2054 struct m_ext2fs *fs; 2055 struct buf *bp; 2056 daddr_t lbn, nextlbn; 2057 off_t bytesinfile; 2058 long size, xfersize, blkoffset; 2059 int error, orig_resid, seqcount; 2060 int ioflag; 2061 2062 vp = ap->a_vp; 2063 uio = ap->a_uio; 2064 ioflag = ap->a_ioflag; 2065 2066 seqcount = ap->a_ioflag >> IO_SEQSHIFT; 2067 ip = VTOI(vp); 2068 2069 #ifdef INVARIANTS 2070 if (uio->uio_rw != UIO_READ) 2071 panic("%s: mode", "ext2_read"); 2072 2073 if (vp->v_type == VLNK) { 2074 if ((int)ip->i_size < vp->v_mount->mnt_maxsymlinklen) 2075 panic("%s: short symlink", "ext2_read"); 2076 } else if (vp->v_type != VREG && vp->v_type != VDIR) 2077 panic("%s: type %d", "ext2_read", vp->v_type); 2078 #endif 2079 orig_resid = uio->uio_resid; 2080 KASSERT(orig_resid >= 0, ("ext2_read: uio->uio_resid < 0")); 2081 if (orig_resid == 0) 2082 return (0); 2083 KASSERT(uio->uio_offset >= 0, ("ext2_read: uio->uio_offset < 0")); 2084 fs = ip->i_e2fs; 2085 if (uio->uio_offset < ip->i_size && 2086 uio->uio_offset >= fs->e2fs_maxfilesize) 2087 return (EOVERFLOW); 2088 2089 for (error = 0, bp = NULL; uio->uio_resid > 0; bp = NULL) { 2090 if ((bytesinfile = ip->i_size - uio->uio_offset) <= 0) 2091 break; 2092 lbn = lblkno(fs, uio->uio_offset); 2093 nextlbn = lbn + 1; 2094 size = blksize(fs, ip, lbn); 2095 blkoffset = blkoff(fs, uio->uio_offset); 2096 2097 xfersize = fs->e2fs_fsize - blkoffset; 2098 if (uio->uio_resid < xfersize) 2099 xfersize = uio->uio_resid; 2100 if (bytesinfile < xfersize) 2101 xfersize = bytesinfile; 2102 2103 if (lblktosize(fs, nextlbn) >= ip->i_size) 2104 error = bread(vp, lbn, size, NOCRED, &bp); 2105 else if ((vp->v_mount->mnt_flag & MNT_NOCLUSTERR) == 0) { 2106 error = cluster_read(vp, ip->i_size, lbn, size, 2107 NOCRED, blkoffset + uio->uio_resid, seqcount, 2108 0, &bp); 2109 } else if (seqcount > 1) { 2110 u_int nextsize = blksize(fs, ip, nextlbn); 2111 2112 error = breadn(vp, lbn, 2113 size, &nextlbn, &nextsize, 1, NOCRED, &bp); 2114 } else 2115 error = bread(vp, lbn, size, NOCRED, &bp); 2116 if (error) { 2117 brelse(bp); 2118 bp = NULL; 2119 break; 2120 } 2121 2122 /* 2123 * We should only get non-zero b_resid when an I/O error 2124 * has occurred, which should cause us to break above. 2125 * However, if the short read did not cause an error, 2126 * then we want to ensure that we do not uiomove bad 2127 * or uninitialized data. 2128 */ 2129 size -= bp->b_resid; 2130 if (size < xfersize) { 2131 if (size == 0) 2132 break; 2133 xfersize = size; 2134 } 2135 error = uiomove((char *)bp->b_data + blkoffset, 2136 (int)xfersize, uio); 2137 if (error) 2138 break; 2139 vfs_bio_brelse(bp, ioflag); 2140 } 2141 2142 /* 2143 * This can only happen in the case of an error because the loop 2144 * above resets bp to NULL on each iteration and on normal 2145 * completion has not set a new value into it. so it must have come 2146 * from a 'break' statement 2147 */ 2148 if (bp != NULL) 2149 vfs_bio_brelse(bp, ioflag); 2150 2151 if ((error == 0 || uio->uio_resid != orig_resid) && 2152 (vp->v_mount->mnt_flag & (MNT_NOATIME | MNT_RDONLY)) == 0) 2153 ip->i_flag |= IN_ACCESS; 2154 return (error); 2155 } 2156 2157 static int 2158 ext2_ioctl(struct vop_ioctl_args *ap) 2159 { 2160 2161 switch (ap->a_command) { 2162 case FIOSEEKDATA: 2163 case FIOSEEKHOLE: 2164 return (vn_bmap_seekhole(ap->a_vp, ap->a_command, 2165 (off_t *)ap->a_data, ap->a_cred)); 2166 default: 2167 return (ENOTTY); 2168 } 2169 } 2170 2171 /* 2172 * Vnode op for writing. 2173 */ 2174 static int 2175 ext2_write(struct vop_write_args *ap) 2176 { 2177 struct vnode *vp; 2178 struct uio *uio; 2179 struct inode *ip; 2180 struct m_ext2fs *fs; 2181 struct buf *bp; 2182 daddr_t lbn; 2183 off_t osize; 2184 int blkoffset, error, flags, ioflag, resid, size, seqcount, xfersize; 2185 2186 ioflag = ap->a_ioflag; 2187 uio = ap->a_uio; 2188 vp = ap->a_vp; 2189 2190 seqcount = ioflag >> IO_SEQSHIFT; 2191 ip = VTOI(vp); 2192 2193 #ifdef INVARIANTS 2194 if (uio->uio_rw != UIO_WRITE) 2195 panic("%s: mode", "ext2_write"); 2196 #endif 2197 2198 switch (vp->v_type) { 2199 case VREG: 2200 if (ioflag & IO_APPEND) 2201 uio->uio_offset = ip->i_size; 2202 if ((ip->i_flags & APPEND) && uio->uio_offset != ip->i_size) 2203 return (EPERM); 2204 /* FALLTHROUGH */ 2205 case VLNK: 2206 break; 2207 case VDIR: 2208 /* XXX differs from ffs -- this is called from ext2_mkdir(). */ 2209 if ((ioflag & IO_SYNC) == 0) 2210 panic("ext2_write: nonsync dir write"); 2211 break; 2212 default: 2213 panic("ext2_write: type %p %d (%jd,%jd)", (void *)vp, 2214 vp->v_type, (intmax_t)uio->uio_offset, 2215 (intmax_t)uio->uio_resid); 2216 } 2217 2218 KASSERT(uio->uio_resid >= 0, ("ext2_write: uio->uio_resid < 0")); 2219 KASSERT(uio->uio_offset >= 0, ("ext2_write: uio->uio_offset < 0")); 2220 fs = ip->i_e2fs; 2221 if ((uoff_t)uio->uio_offset + uio->uio_resid > fs->e2fs_maxfilesize) 2222 return (EFBIG); 2223 /* 2224 * Maybe this should be above the vnode op call, but so long as 2225 * file servers have no limits, I don't think it matters. 2226 */ 2227 if (vn_rlimit_fsize(vp, uio, uio->uio_td)) 2228 return (EFBIG); 2229 2230 resid = uio->uio_resid; 2231 osize = ip->i_size; 2232 if (seqcount > BA_SEQMAX) 2233 flags = BA_SEQMAX << BA_SEQSHIFT; 2234 else 2235 flags = seqcount << BA_SEQSHIFT; 2236 if ((ioflag & IO_SYNC) && !DOINGASYNC(vp)) 2237 flags |= IO_SYNC; 2238 2239 for (error = 0; uio->uio_resid > 0;) { 2240 lbn = lblkno(fs, uio->uio_offset); 2241 blkoffset = blkoff(fs, uio->uio_offset); 2242 xfersize = fs->e2fs_fsize - blkoffset; 2243 if (uio->uio_resid < xfersize) 2244 xfersize = uio->uio_resid; 2245 if (uio->uio_offset + xfersize > ip->i_size) 2246 vnode_pager_setsize(vp, uio->uio_offset + xfersize); 2247 2248 /* 2249 * We must perform a read-before-write if the transfer size 2250 * does not cover the entire buffer. 2251 */ 2252 if (fs->e2fs_bsize > xfersize) 2253 flags |= BA_CLRBUF; 2254 else 2255 flags &= ~BA_CLRBUF; 2256 error = ext2_balloc(ip, lbn, blkoffset + xfersize, 2257 ap->a_cred, &bp, flags); 2258 if (error != 0) 2259 break; 2260 2261 if ((ioflag & (IO_SYNC | IO_INVAL)) == (IO_SYNC | IO_INVAL)) 2262 bp->b_flags |= B_NOCACHE; 2263 if (uio->uio_offset + xfersize > ip->i_size) 2264 ip->i_size = uio->uio_offset + xfersize; 2265 size = blksize(fs, ip, lbn) - bp->b_resid; 2266 if (size < xfersize) 2267 xfersize = size; 2268 2269 error = 2270 uiomove((char *)bp->b_data + blkoffset, (int)xfersize, uio); 2271 /* 2272 * If the buffer is not already filled and we encounter an 2273 * error while trying to fill it, we have to clear out any 2274 * garbage data from the pages instantiated for the buffer. 2275 * If we do not, a failed uiomove() during a write can leave 2276 * the prior contents of the pages exposed to a userland mmap. 2277 * 2278 * Note that we need only clear buffers with a transfer size 2279 * equal to the block size because buffers with a shorter 2280 * transfer size were cleared above by the call to ext2_balloc() 2281 * with the BA_CLRBUF flag set. 2282 * 2283 * If the source region for uiomove identically mmaps the 2284 * buffer, uiomove() performed the NOP copy, and the buffer 2285 * content remains valid because the page fault handler 2286 * validated the pages. 2287 */ 2288 if (error != 0 && (bp->b_flags & B_CACHE) == 0 && 2289 fs->e2fs_bsize == xfersize) 2290 vfs_bio_clrbuf(bp); 2291 2292 vfs_bio_set_flags(bp, ioflag); 2293 2294 /* 2295 * If IO_SYNC each buffer is written synchronously. Otherwise 2296 * if we have a severe page deficiency write the buffer 2297 * asynchronously. Otherwise try to cluster, and if that 2298 * doesn't do it then either do an async write (if O_DIRECT), 2299 * or a delayed write (if not). 2300 */ 2301 if (ioflag & IO_SYNC) { 2302 (void)bwrite(bp); 2303 } else if (vm_page_count_severe() || 2304 buf_dirty_count_severe() || 2305 (ioflag & IO_ASYNC)) { 2306 bp->b_flags |= B_CLUSTEROK; 2307 bawrite(bp); 2308 } else if (xfersize + blkoffset == fs->e2fs_fsize) { 2309 if ((vp->v_mount->mnt_flag & MNT_NOCLUSTERW) == 0) { 2310 bp->b_flags |= B_CLUSTEROK; 2311 cluster_write(vp, bp, ip->i_size, seqcount, 0); 2312 } else { 2313 bawrite(bp); 2314 } 2315 } else if (ioflag & IO_DIRECT) { 2316 bp->b_flags |= B_CLUSTEROK; 2317 bawrite(bp); 2318 } else { 2319 bp->b_flags |= B_CLUSTEROK; 2320 bdwrite(bp); 2321 } 2322 if (error || xfersize == 0) 2323 break; 2324 } 2325 /* 2326 * If we successfully wrote any data, and we are not the superuser 2327 * we clear the setuid and setgid bits as a precaution against 2328 * tampering. 2329 */ 2330 if ((ip->i_mode & (ISUID | ISGID)) && resid > uio->uio_resid && 2331 ap->a_cred) { 2332 if (priv_check_cred(ap->a_cred, PRIV_VFS_RETAINSUGID)) 2333 ip->i_mode &= ~(ISUID | ISGID); 2334 } 2335 if (error) { 2336 if (ioflag & IO_UNIT) { 2337 (void)ext2_truncate(vp, osize, 2338 ioflag & IO_SYNC, ap->a_cred, uio->uio_td); 2339 uio->uio_offset -= resid - uio->uio_resid; 2340 uio->uio_resid = resid; 2341 } 2342 } 2343 if (uio->uio_resid != resid) { 2344 ip->i_flag |= IN_CHANGE | IN_UPDATE; 2345 if (ioflag & IO_SYNC) 2346 error = ext2_update(vp, 1); 2347 } 2348 return (error); 2349 } 2350