1 /* 2 * linux/fs/ext4/file.c 3 * 4 * Copyright (C) 1992, 1993, 1994, 1995 5 * Remy Card (card@masi.ibp.fr) 6 * Laboratoire MASI - Institut Blaise Pascal 7 * Universite Pierre et Marie Curie (Paris VI) 8 * 9 * from 10 * 11 * linux/fs/minix/file.c 12 * 13 * Copyright (C) 1991, 1992 Linus Torvalds 14 * 15 * ext4 fs regular file handling primitives 16 * 17 * 64-bit file support on 64-bit platforms by Jakub Jelinek 18 * (jj@sunsite.ms.mff.cuni.cz) 19 */ 20 21 #include <linux/time.h> 22 #include <linux/fs.h> 23 #include <linux/mount.h> 24 #include <linux/path.h> 25 #include <linux/dax.h> 26 #include <linux/quotaops.h> 27 #include <linux/pagevec.h> 28 #include <linux/uio.h> 29 #include "ext4.h" 30 #include "ext4_jbd2.h" 31 #include "xattr.h" 32 #include "acl.h" 33 34 #ifdef CONFIG_FS_DAX 35 static ssize_t ext4_dax_read_iter(struct kiocb *iocb, struct iov_iter *to) 36 { 37 struct inode *inode = file_inode(iocb->ki_filp); 38 ssize_t ret; 39 40 inode_lock_shared(inode); 41 /* 42 * Recheck under inode lock - at this point we are sure it cannot 43 * change anymore 44 */ 45 if (!IS_DAX(inode)) { 46 inode_unlock_shared(inode); 47 /* Fallback to buffered IO in case we cannot support DAX */ 48 return generic_file_read_iter(iocb, to); 49 } 50 ret = dax_iomap_rw(iocb, to, &ext4_iomap_ops); 51 inode_unlock_shared(inode); 52 53 file_accessed(iocb->ki_filp); 54 return ret; 55 } 56 #endif 57 58 static ssize_t ext4_file_read_iter(struct kiocb *iocb, struct iov_iter *to) 59 { 60 if (unlikely(ext4_forced_shutdown(EXT4_SB(file_inode(iocb->ki_filp)->i_sb)))) 61 return -EIO; 62 63 if (!iov_iter_count(to)) 64 return 0; /* skip atime */ 65 66 #ifdef CONFIG_FS_DAX 67 if (IS_DAX(file_inode(iocb->ki_filp))) 68 return ext4_dax_read_iter(iocb, to); 69 #endif 70 return generic_file_read_iter(iocb, to); 71 } 72 73 /* 74 * Called when an inode is released. Note that this is different 75 * from ext4_file_open: open gets called at every open, but release 76 * gets called only when /all/ the files are closed. 77 */ 78 static int ext4_release_file(struct inode *inode, struct file *filp) 79 { 80 if (ext4_test_inode_state(inode, EXT4_STATE_DA_ALLOC_CLOSE)) { 81 ext4_alloc_da_blocks(inode); 82 ext4_clear_inode_state(inode, EXT4_STATE_DA_ALLOC_CLOSE); 83 } 84 /* if we are the last writer on the inode, drop the block reservation */ 85 if ((filp->f_mode & FMODE_WRITE) && 86 (atomic_read(&inode->i_writecount) == 1) && 87 !EXT4_I(inode)->i_reserved_data_blocks) 88 { 89 down_write(&EXT4_I(inode)->i_data_sem); 90 ext4_discard_preallocations(inode); 91 up_write(&EXT4_I(inode)->i_data_sem); 92 } 93 if (is_dx(inode) && filp->private_data) 94 ext4_htree_free_dir_info(filp->private_data); 95 96 return 0; 97 } 98 99 static void ext4_unwritten_wait(struct inode *inode) 100 { 101 wait_queue_head_t *wq = ext4_ioend_wq(inode); 102 103 wait_event(*wq, (atomic_read(&EXT4_I(inode)->i_unwritten) == 0)); 104 } 105 106 /* 107 * This tests whether the IO in question is block-aligned or not. 108 * Ext4 utilizes unwritten extents when hole-filling during direct IO, and they 109 * are converted to written only after the IO is complete. Until they are 110 * mapped, these blocks appear as holes, so dio_zero_block() will assume that 111 * it needs to zero out portions of the start and/or end block. If 2 AIO 112 * threads are at work on the same unwritten block, they must be synchronized 113 * or one thread will zero the other's data, causing corruption. 114 */ 115 static int 116 ext4_unaligned_aio(struct inode *inode, struct iov_iter *from, loff_t pos) 117 { 118 struct super_block *sb = inode->i_sb; 119 int blockmask = sb->s_blocksize - 1; 120 121 if (pos >= i_size_read(inode)) 122 return 0; 123 124 if ((pos | iov_iter_alignment(from)) & blockmask) 125 return 1; 126 127 return 0; 128 } 129 130 /* Is IO overwriting allocated and initialized blocks? */ 131 static bool ext4_overwrite_io(struct inode *inode, loff_t pos, loff_t len) 132 { 133 struct ext4_map_blocks map; 134 unsigned int blkbits = inode->i_blkbits; 135 int err, blklen; 136 137 if (pos + len > i_size_read(inode)) 138 return false; 139 140 map.m_lblk = pos >> blkbits; 141 map.m_len = EXT4_MAX_BLOCKS(len, pos, blkbits); 142 blklen = map.m_len; 143 144 err = ext4_map_blocks(NULL, inode, &map, 0); 145 /* 146 * 'err==len' means that all of the blocks have been preallocated, 147 * regardless of whether they have been initialized or not. To exclude 148 * unwritten extents, we need to check m_flags. 149 */ 150 return err == blklen && (map.m_flags & EXT4_MAP_MAPPED); 151 } 152 153 static ssize_t ext4_write_checks(struct kiocb *iocb, struct iov_iter *from) 154 { 155 struct inode *inode = file_inode(iocb->ki_filp); 156 ssize_t ret; 157 158 ret = generic_write_checks(iocb, from); 159 if (ret <= 0) 160 return ret; 161 /* 162 * If we have encountered a bitmap-format file, the size limit 163 * is smaller than s_maxbytes, which is for extent-mapped files. 164 */ 165 if (!(ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS))) { 166 struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); 167 168 if (iocb->ki_pos >= sbi->s_bitmap_maxbytes) 169 return -EFBIG; 170 iov_iter_truncate(from, sbi->s_bitmap_maxbytes - iocb->ki_pos); 171 } 172 return iov_iter_count(from); 173 } 174 175 #ifdef CONFIG_FS_DAX 176 static ssize_t 177 ext4_dax_write_iter(struct kiocb *iocb, struct iov_iter *from) 178 { 179 struct inode *inode = file_inode(iocb->ki_filp); 180 ssize_t ret; 181 182 inode_lock(inode); 183 ret = ext4_write_checks(iocb, from); 184 if (ret <= 0) 185 goto out; 186 ret = file_remove_privs(iocb->ki_filp); 187 if (ret) 188 goto out; 189 ret = file_update_time(iocb->ki_filp); 190 if (ret) 191 goto out; 192 193 ret = dax_iomap_rw(iocb, from, &ext4_iomap_ops); 194 out: 195 inode_unlock(inode); 196 if (ret > 0) 197 ret = generic_write_sync(iocb, ret); 198 return ret; 199 } 200 #endif 201 202 static ssize_t 203 ext4_file_write_iter(struct kiocb *iocb, struct iov_iter *from) 204 { 205 struct inode *inode = file_inode(iocb->ki_filp); 206 int o_direct = iocb->ki_flags & IOCB_DIRECT; 207 int unaligned_aio = 0; 208 int overwrite = 0; 209 ssize_t ret; 210 211 if (unlikely(ext4_forced_shutdown(EXT4_SB(inode->i_sb)))) 212 return -EIO; 213 214 #ifdef CONFIG_FS_DAX 215 if (IS_DAX(inode)) 216 return ext4_dax_write_iter(iocb, from); 217 #endif 218 219 inode_lock(inode); 220 ret = ext4_write_checks(iocb, from); 221 if (ret <= 0) 222 goto out; 223 224 /* 225 * Unaligned direct AIO must be serialized among each other as zeroing 226 * of partial blocks of two competing unaligned AIOs can result in data 227 * corruption. 228 */ 229 if (o_direct && ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS) && 230 !is_sync_kiocb(iocb) && 231 ext4_unaligned_aio(inode, from, iocb->ki_pos)) { 232 unaligned_aio = 1; 233 ext4_unwritten_wait(inode); 234 } 235 236 iocb->private = &overwrite; 237 /* Check whether we do a DIO overwrite or not */ 238 if (o_direct && ext4_should_dioread_nolock(inode) && !unaligned_aio && 239 ext4_overwrite_io(inode, iocb->ki_pos, iov_iter_count(from))) 240 overwrite = 1; 241 242 ret = __generic_file_write_iter(iocb, from); 243 inode_unlock(inode); 244 245 if (ret > 0) 246 ret = generic_write_sync(iocb, ret); 247 248 return ret; 249 250 out: 251 inode_unlock(inode); 252 return ret; 253 } 254 255 #ifdef CONFIG_FS_DAX 256 static int ext4_dax_huge_fault(struct vm_fault *vmf, 257 enum page_entry_size pe_size) 258 { 259 int result; 260 struct inode *inode = file_inode(vmf->vma->vm_file); 261 struct super_block *sb = inode->i_sb; 262 bool write = vmf->flags & FAULT_FLAG_WRITE; 263 264 if (write) { 265 sb_start_pagefault(sb); 266 file_update_time(vmf->vma->vm_file); 267 } 268 down_read(&EXT4_I(inode)->i_mmap_sem); 269 result = dax_iomap_fault(vmf, pe_size, &ext4_iomap_ops); 270 up_read(&EXT4_I(inode)->i_mmap_sem); 271 if (write) 272 sb_end_pagefault(sb); 273 274 return result; 275 } 276 277 static int ext4_dax_fault(struct vm_fault *vmf) 278 { 279 return ext4_dax_huge_fault(vmf, PE_SIZE_PTE); 280 } 281 282 /* 283 * Handle write fault for VM_MIXEDMAP mappings. Similarly to ext4_dax_fault() 284 * handler we check for races agaist truncate. Note that since we cycle through 285 * i_mmap_sem, we are sure that also any hole punching that began before we 286 * were called is finished by now and so if it included part of the file we 287 * are working on, our pte will get unmapped and the check for pte_same() in 288 * wp_pfn_shared() fails. Thus fault gets retried and things work out as 289 * desired. 290 */ 291 static int ext4_dax_pfn_mkwrite(struct vm_fault *vmf) 292 { 293 struct inode *inode = file_inode(vmf->vma->vm_file); 294 struct super_block *sb = inode->i_sb; 295 loff_t size; 296 int ret; 297 298 sb_start_pagefault(sb); 299 file_update_time(vmf->vma->vm_file); 300 down_read(&EXT4_I(inode)->i_mmap_sem); 301 size = (i_size_read(inode) + PAGE_SIZE - 1) >> PAGE_SHIFT; 302 if (vmf->pgoff >= size) 303 ret = VM_FAULT_SIGBUS; 304 else 305 ret = dax_pfn_mkwrite(vmf); 306 up_read(&EXT4_I(inode)->i_mmap_sem); 307 sb_end_pagefault(sb); 308 309 return ret; 310 } 311 312 static const struct vm_operations_struct ext4_dax_vm_ops = { 313 .fault = ext4_dax_fault, 314 .huge_fault = ext4_dax_huge_fault, 315 .page_mkwrite = ext4_dax_fault, 316 .pfn_mkwrite = ext4_dax_pfn_mkwrite, 317 }; 318 #else 319 #define ext4_dax_vm_ops ext4_file_vm_ops 320 #endif 321 322 static const struct vm_operations_struct ext4_file_vm_ops = { 323 .fault = ext4_filemap_fault, 324 .map_pages = filemap_map_pages, 325 .page_mkwrite = ext4_page_mkwrite, 326 }; 327 328 static int ext4_file_mmap(struct file *file, struct vm_area_struct *vma) 329 { 330 struct inode *inode = file->f_mapping->host; 331 332 if (unlikely(ext4_forced_shutdown(EXT4_SB(inode->i_sb)))) 333 return -EIO; 334 335 if (ext4_encrypted_inode(inode)) { 336 int err = fscrypt_get_encryption_info(inode); 337 if (err) 338 return 0; 339 if (!fscrypt_has_encryption_key(inode)) 340 return -ENOKEY; 341 } 342 file_accessed(file); 343 if (IS_DAX(file_inode(file))) { 344 vma->vm_ops = &ext4_dax_vm_ops; 345 vma->vm_flags |= VM_MIXEDMAP | VM_HUGEPAGE; 346 } else { 347 vma->vm_ops = &ext4_file_vm_ops; 348 } 349 return 0; 350 } 351 352 static int ext4_file_open(struct inode * inode, struct file * filp) 353 { 354 struct super_block *sb = inode->i_sb; 355 struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); 356 struct vfsmount *mnt = filp->f_path.mnt; 357 struct dentry *dir; 358 struct path path; 359 char buf[64], *cp; 360 int ret; 361 362 if (unlikely(ext4_forced_shutdown(EXT4_SB(inode->i_sb)))) 363 return -EIO; 364 365 if (unlikely(!(sbi->s_mount_flags & EXT4_MF_MNTDIR_SAMPLED) && 366 !(sb->s_flags & MS_RDONLY))) { 367 sbi->s_mount_flags |= EXT4_MF_MNTDIR_SAMPLED; 368 /* 369 * Sample where the filesystem has been mounted and 370 * store it in the superblock for sysadmin convenience 371 * when trying to sort through large numbers of block 372 * devices or filesystem images. 373 */ 374 memset(buf, 0, sizeof(buf)); 375 path.mnt = mnt; 376 path.dentry = mnt->mnt_root; 377 cp = d_path(&path, buf, sizeof(buf)); 378 if (!IS_ERR(cp)) { 379 handle_t *handle; 380 int err; 381 382 handle = ext4_journal_start_sb(sb, EXT4_HT_MISC, 1); 383 if (IS_ERR(handle)) 384 return PTR_ERR(handle); 385 BUFFER_TRACE(sbi->s_sbh, "get_write_access"); 386 err = ext4_journal_get_write_access(handle, sbi->s_sbh); 387 if (err) { 388 ext4_journal_stop(handle); 389 return err; 390 } 391 strlcpy(sbi->s_es->s_last_mounted, cp, 392 sizeof(sbi->s_es->s_last_mounted)); 393 ext4_handle_dirty_super(handle, sb); 394 ext4_journal_stop(handle); 395 } 396 } 397 if (ext4_encrypted_inode(inode)) { 398 ret = fscrypt_get_encryption_info(inode); 399 if (ret) 400 return -EACCES; 401 if (!fscrypt_has_encryption_key(inode)) 402 return -ENOKEY; 403 } 404 405 dir = dget_parent(file_dentry(filp)); 406 if (ext4_encrypted_inode(d_inode(dir)) && 407 !fscrypt_has_permitted_context(d_inode(dir), inode)) { 408 ext4_warning(inode->i_sb, 409 "Inconsistent encryption contexts: %lu/%lu", 410 (unsigned long) d_inode(dir)->i_ino, 411 (unsigned long) inode->i_ino); 412 dput(dir); 413 return -EPERM; 414 } 415 dput(dir); 416 /* 417 * Set up the jbd2_inode if we are opening the inode for 418 * writing and the journal is present 419 */ 420 if (filp->f_mode & FMODE_WRITE) { 421 ret = ext4_inode_attach_jinode(inode); 422 if (ret < 0) 423 return ret; 424 } 425 return dquot_file_open(inode, filp); 426 } 427 428 /* 429 * Here we use ext4_map_blocks() to get a block mapping for a extent-based 430 * file rather than ext4_ext_walk_space() because we can introduce 431 * SEEK_DATA/SEEK_HOLE for block-mapped and extent-mapped file at the same 432 * function. When extent status tree has been fully implemented, it will 433 * track all extent status for a file and we can directly use it to 434 * retrieve the offset for SEEK_DATA/SEEK_HOLE. 435 */ 436 437 /* 438 * When we retrieve the offset for SEEK_DATA/SEEK_HOLE, we would need to 439 * lookup page cache to check whether or not there has some data between 440 * [startoff, endoff] because, if this range contains an unwritten extent, 441 * we determine this extent as a data or a hole according to whether the 442 * page cache has data or not. 443 */ 444 static int ext4_find_unwritten_pgoff(struct inode *inode, 445 int whence, 446 ext4_lblk_t end_blk, 447 loff_t *offset) 448 { 449 struct pagevec pvec; 450 unsigned int blkbits; 451 pgoff_t index; 452 pgoff_t end; 453 loff_t endoff; 454 loff_t startoff; 455 loff_t lastoff; 456 int found = 0; 457 458 blkbits = inode->i_sb->s_blocksize_bits; 459 startoff = *offset; 460 lastoff = startoff; 461 endoff = (loff_t)end_blk << blkbits; 462 463 index = startoff >> PAGE_SHIFT; 464 end = endoff >> PAGE_SHIFT; 465 466 pagevec_init(&pvec, 0); 467 do { 468 int i, num; 469 unsigned long nr_pages; 470 471 num = min_t(pgoff_t, end - index, PAGEVEC_SIZE); 472 nr_pages = pagevec_lookup(&pvec, inode->i_mapping, index, 473 (pgoff_t)num); 474 if (nr_pages == 0) { 475 if (whence == SEEK_DATA) 476 break; 477 478 BUG_ON(whence != SEEK_HOLE); 479 /* 480 * If this is the first time to go into the loop and 481 * offset is not beyond the end offset, it will be a 482 * hole at this offset 483 */ 484 if (lastoff == startoff || lastoff < endoff) 485 found = 1; 486 break; 487 } 488 489 /* 490 * If this is the first time to go into the loop and 491 * offset is smaller than the first page offset, it will be a 492 * hole at this offset. 493 */ 494 if (lastoff == startoff && whence == SEEK_HOLE && 495 lastoff < page_offset(pvec.pages[0])) { 496 found = 1; 497 break; 498 } 499 500 for (i = 0; i < nr_pages; i++) { 501 struct page *page = pvec.pages[i]; 502 struct buffer_head *bh, *head; 503 504 /* 505 * If the current offset is not beyond the end of given 506 * range, it will be a hole. 507 */ 508 if (lastoff < endoff && whence == SEEK_HOLE && 509 page->index > end) { 510 found = 1; 511 *offset = lastoff; 512 goto out; 513 } 514 515 lock_page(page); 516 517 if (unlikely(page->mapping != inode->i_mapping)) { 518 unlock_page(page); 519 continue; 520 } 521 522 if (!page_has_buffers(page)) { 523 unlock_page(page); 524 continue; 525 } 526 527 if (page_has_buffers(page)) { 528 lastoff = page_offset(page); 529 bh = head = page_buffers(page); 530 do { 531 if (buffer_uptodate(bh) || 532 buffer_unwritten(bh)) { 533 if (whence == SEEK_DATA) 534 found = 1; 535 } else { 536 if (whence == SEEK_HOLE) 537 found = 1; 538 } 539 if (found) { 540 *offset = max_t(loff_t, 541 startoff, lastoff); 542 unlock_page(page); 543 goto out; 544 } 545 lastoff += bh->b_size; 546 bh = bh->b_this_page; 547 } while (bh != head); 548 } 549 550 lastoff = page_offset(page) + PAGE_SIZE; 551 unlock_page(page); 552 } 553 554 /* 555 * The no. of pages is less than our desired, that would be a 556 * hole in there. 557 */ 558 if (nr_pages < num && whence == SEEK_HOLE) { 559 found = 1; 560 *offset = lastoff; 561 break; 562 } 563 564 index = pvec.pages[i - 1]->index + 1; 565 pagevec_release(&pvec); 566 } while (index <= end); 567 568 out: 569 pagevec_release(&pvec); 570 return found; 571 } 572 573 /* 574 * ext4_seek_data() retrieves the offset for SEEK_DATA. 575 */ 576 static loff_t ext4_seek_data(struct file *file, loff_t offset, loff_t maxsize) 577 { 578 struct inode *inode = file->f_mapping->host; 579 struct extent_status es; 580 ext4_lblk_t start, last, end; 581 loff_t dataoff, isize; 582 int blkbits; 583 int ret; 584 585 inode_lock(inode); 586 587 isize = i_size_read(inode); 588 if (offset >= isize) { 589 inode_unlock(inode); 590 return -ENXIO; 591 } 592 593 blkbits = inode->i_sb->s_blocksize_bits; 594 start = offset >> blkbits; 595 last = start; 596 end = isize >> blkbits; 597 dataoff = offset; 598 599 do { 600 ret = ext4_get_next_extent(inode, last, end - last + 1, &es); 601 if (ret <= 0) { 602 /* No extent found -> no data */ 603 if (ret == 0) 604 ret = -ENXIO; 605 inode_unlock(inode); 606 return ret; 607 } 608 609 last = es.es_lblk; 610 if (last != start) 611 dataoff = (loff_t)last << blkbits; 612 if (!ext4_es_is_unwritten(&es)) 613 break; 614 615 /* 616 * If there is a unwritten extent at this offset, 617 * it will be as a data or a hole according to page 618 * cache that has data or not. 619 */ 620 if (ext4_find_unwritten_pgoff(inode, SEEK_DATA, 621 es.es_lblk + es.es_len, &dataoff)) 622 break; 623 last += es.es_len; 624 dataoff = (loff_t)last << blkbits; 625 cond_resched(); 626 } while (last <= end); 627 628 inode_unlock(inode); 629 630 if (dataoff > isize) 631 return -ENXIO; 632 633 return vfs_setpos(file, dataoff, maxsize); 634 } 635 636 /* 637 * ext4_seek_hole() retrieves the offset for SEEK_HOLE. 638 */ 639 static loff_t ext4_seek_hole(struct file *file, loff_t offset, loff_t maxsize) 640 { 641 struct inode *inode = file->f_mapping->host; 642 struct extent_status es; 643 ext4_lblk_t start, last, end; 644 loff_t holeoff, isize; 645 int blkbits; 646 int ret; 647 648 inode_lock(inode); 649 650 isize = i_size_read(inode); 651 if (offset >= isize) { 652 inode_unlock(inode); 653 return -ENXIO; 654 } 655 656 blkbits = inode->i_sb->s_blocksize_bits; 657 start = offset >> blkbits; 658 last = start; 659 end = isize >> blkbits; 660 holeoff = offset; 661 662 do { 663 ret = ext4_get_next_extent(inode, last, end - last + 1, &es); 664 if (ret < 0) { 665 inode_unlock(inode); 666 return ret; 667 } 668 /* Found a hole? */ 669 if (ret == 0 || es.es_lblk > last) { 670 if (last != start) 671 holeoff = (loff_t)last << blkbits; 672 break; 673 } 674 /* 675 * If there is a unwritten extent at this offset, 676 * it will be as a data or a hole according to page 677 * cache that has data or not. 678 */ 679 if (ext4_es_is_unwritten(&es) && 680 ext4_find_unwritten_pgoff(inode, SEEK_HOLE, 681 last + es.es_len, &holeoff)) 682 break; 683 684 last += es.es_len; 685 holeoff = (loff_t)last << blkbits; 686 cond_resched(); 687 } while (last <= end); 688 689 inode_unlock(inode); 690 691 if (holeoff > isize) 692 holeoff = isize; 693 694 return vfs_setpos(file, holeoff, maxsize); 695 } 696 697 /* 698 * ext4_llseek() handles both block-mapped and extent-mapped maxbytes values 699 * by calling generic_file_llseek_size() with the appropriate maxbytes 700 * value for each. 701 */ 702 loff_t ext4_llseek(struct file *file, loff_t offset, int whence) 703 { 704 struct inode *inode = file->f_mapping->host; 705 loff_t maxbytes; 706 707 if (!(ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS))) 708 maxbytes = EXT4_SB(inode->i_sb)->s_bitmap_maxbytes; 709 else 710 maxbytes = inode->i_sb->s_maxbytes; 711 712 switch (whence) { 713 case SEEK_SET: 714 case SEEK_CUR: 715 case SEEK_END: 716 return generic_file_llseek_size(file, offset, whence, 717 maxbytes, i_size_read(inode)); 718 case SEEK_DATA: 719 return ext4_seek_data(file, offset, maxbytes); 720 case SEEK_HOLE: 721 return ext4_seek_hole(file, offset, maxbytes); 722 } 723 724 return -EINVAL; 725 } 726 727 const struct file_operations ext4_file_operations = { 728 .llseek = ext4_llseek, 729 .read_iter = ext4_file_read_iter, 730 .write_iter = ext4_file_write_iter, 731 .unlocked_ioctl = ext4_ioctl, 732 #ifdef CONFIG_COMPAT 733 .compat_ioctl = ext4_compat_ioctl, 734 #endif 735 .mmap = ext4_file_mmap, 736 .open = ext4_file_open, 737 .release = ext4_release_file, 738 .fsync = ext4_sync_file, 739 .get_unmapped_area = thp_get_unmapped_area, 740 .splice_read = generic_file_splice_read, 741 .splice_write = iter_file_splice_write, 742 .fallocate = ext4_fallocate, 743 }; 744 745 const struct inode_operations ext4_file_inode_operations = { 746 .setattr = ext4_setattr, 747 .getattr = ext4_file_getattr, 748 .listxattr = ext4_listxattr, 749 .get_acl = ext4_get_acl, 750 .set_acl = ext4_set_acl, 751 .fiemap = ext4_fiemap, 752 }; 753 754