1 /* 2 * linux/fs/affs/file.c 3 * 4 * (c) 1996 Hans-Joachim Widmaier - Rewritten 5 * 6 * (C) 1993 Ray Burr - Modified for Amiga FFS filesystem. 7 * 8 * (C) 1992 Eric Youngdale Modified for ISO 9660 filesystem. 9 * 10 * (C) 1991 Linus Torvalds - minix filesystem 11 * 12 * affs regular file handling primitives 13 */ 14 15 #include "affs.h" 16 17 #if PAGE_SIZE < 4096 18 #error PAGE_SIZE must be at least 4096 19 #endif 20 21 static int affs_grow_extcache(struct inode *inode, u32 lc_idx); 22 static struct buffer_head *affs_alloc_extblock(struct inode *inode, struct buffer_head *bh, u32 ext); 23 static inline struct buffer_head *affs_get_extblock(struct inode *inode, u32 ext); 24 static struct buffer_head *affs_get_extblock_slow(struct inode *inode, u32 ext); 25 static int affs_file_open(struct inode *inode, struct file *filp); 26 static int affs_file_release(struct inode *inode, struct file *filp); 27 28 const struct file_operations affs_file_operations = { 29 .llseek = generic_file_llseek, 30 .read = new_sync_read, 31 .read_iter = generic_file_read_iter, 32 .write = new_sync_write, 33 .write_iter = generic_file_write_iter, 34 .mmap = generic_file_mmap, 35 .open = affs_file_open, 36 .release = affs_file_release, 37 .fsync = affs_file_fsync, 38 .splice_read = generic_file_splice_read, 39 }; 40 41 const struct inode_operations affs_file_inode_operations = { 42 .setattr = affs_notify_change, 43 }; 44 45 static int 46 affs_file_open(struct inode *inode, struct file *filp) 47 { 48 pr_debug("open(%lu,%d)\n", 49 inode->i_ino, atomic_read(&AFFS_I(inode)->i_opencnt)); 50 atomic_inc(&AFFS_I(inode)->i_opencnt); 51 return 0; 52 } 53 54 static int 55 affs_file_release(struct inode *inode, struct file *filp) 56 { 57 pr_debug("release(%lu, %d)\n", 58 inode->i_ino, atomic_read(&AFFS_I(inode)->i_opencnt)); 59 60 if (atomic_dec_and_test(&AFFS_I(inode)->i_opencnt)) { 61 mutex_lock(&inode->i_mutex); 62 if (inode->i_size != AFFS_I(inode)->mmu_private) 63 affs_truncate(inode); 64 affs_free_prealloc(inode); 65 mutex_unlock(&inode->i_mutex); 66 } 67 68 return 0; 69 } 70 71 static int 72 affs_grow_extcache(struct inode *inode, u32 lc_idx) 73 { 74 struct super_block *sb = inode->i_sb; 75 struct buffer_head *bh; 76 u32 lc_max; 77 int i, j, key; 78 79 if (!AFFS_I(inode)->i_lc) { 80 char *ptr = (char *)get_zeroed_page(GFP_NOFS); 81 if (!ptr) 82 return -ENOMEM; 83 AFFS_I(inode)->i_lc = (u32 *)ptr; 84 AFFS_I(inode)->i_ac = (struct affs_ext_key *)(ptr + AFFS_CACHE_SIZE / 2); 85 } 86 87 lc_max = AFFS_LC_SIZE << AFFS_I(inode)->i_lc_shift; 88 89 if (AFFS_I(inode)->i_extcnt > lc_max) { 90 u32 lc_shift, lc_mask, tmp, off; 91 92 /* need to recalculate linear cache, start from old size */ 93 lc_shift = AFFS_I(inode)->i_lc_shift; 94 tmp = (AFFS_I(inode)->i_extcnt / AFFS_LC_SIZE) >> lc_shift; 95 for (; tmp; tmp >>= 1) 96 lc_shift++; 97 lc_mask = (1 << lc_shift) - 1; 98 99 /* fix idx and old size to new shift */ 100 lc_idx >>= (lc_shift - AFFS_I(inode)->i_lc_shift); 101 AFFS_I(inode)->i_lc_size >>= (lc_shift - AFFS_I(inode)->i_lc_shift); 102 103 /* first shrink old cache to make more space */ 104 off = 1 << (lc_shift - AFFS_I(inode)->i_lc_shift); 105 for (i = 1, j = off; j < AFFS_LC_SIZE; i++, j += off) 106 AFFS_I(inode)->i_ac[i] = AFFS_I(inode)->i_ac[j]; 107 108 AFFS_I(inode)->i_lc_shift = lc_shift; 109 AFFS_I(inode)->i_lc_mask = lc_mask; 110 } 111 112 /* fill cache to the needed index */ 113 i = AFFS_I(inode)->i_lc_size; 114 AFFS_I(inode)->i_lc_size = lc_idx + 1; 115 for (; i <= lc_idx; i++) { 116 if (!i) { 117 AFFS_I(inode)->i_lc[0] = inode->i_ino; 118 continue; 119 } 120 key = AFFS_I(inode)->i_lc[i - 1]; 121 j = AFFS_I(inode)->i_lc_mask + 1; 122 // unlock cache 123 for (; j > 0; j--) { 124 bh = affs_bread(sb, key); 125 if (!bh) 126 goto err; 127 key = be32_to_cpu(AFFS_TAIL(sb, bh)->extension); 128 affs_brelse(bh); 129 } 130 // lock cache 131 AFFS_I(inode)->i_lc[i] = key; 132 } 133 134 return 0; 135 136 err: 137 // lock cache 138 return -EIO; 139 } 140 141 static struct buffer_head * 142 affs_alloc_extblock(struct inode *inode, struct buffer_head *bh, u32 ext) 143 { 144 struct super_block *sb = inode->i_sb; 145 struct buffer_head *new_bh; 146 u32 blocknr, tmp; 147 148 blocknr = affs_alloc_block(inode, bh->b_blocknr); 149 if (!blocknr) 150 return ERR_PTR(-ENOSPC); 151 152 new_bh = affs_getzeroblk(sb, blocknr); 153 if (!new_bh) { 154 affs_free_block(sb, blocknr); 155 return ERR_PTR(-EIO); 156 } 157 158 AFFS_HEAD(new_bh)->ptype = cpu_to_be32(T_LIST); 159 AFFS_HEAD(new_bh)->key = cpu_to_be32(blocknr); 160 AFFS_TAIL(sb, new_bh)->stype = cpu_to_be32(ST_FILE); 161 AFFS_TAIL(sb, new_bh)->parent = cpu_to_be32(inode->i_ino); 162 affs_fix_checksum(sb, new_bh); 163 164 mark_buffer_dirty_inode(new_bh, inode); 165 166 tmp = be32_to_cpu(AFFS_TAIL(sb, bh)->extension); 167 if (tmp) 168 affs_warning(sb, "alloc_ext", "previous extension set (%x)", tmp); 169 AFFS_TAIL(sb, bh)->extension = cpu_to_be32(blocknr); 170 affs_adjust_checksum(bh, blocknr - tmp); 171 mark_buffer_dirty_inode(bh, inode); 172 173 AFFS_I(inode)->i_extcnt++; 174 mark_inode_dirty(inode); 175 176 return new_bh; 177 } 178 179 static inline struct buffer_head * 180 affs_get_extblock(struct inode *inode, u32 ext) 181 { 182 /* inline the simplest case: same extended block as last time */ 183 struct buffer_head *bh = AFFS_I(inode)->i_ext_bh; 184 if (ext == AFFS_I(inode)->i_ext_last) 185 get_bh(bh); 186 else 187 /* we have to do more (not inlined) */ 188 bh = affs_get_extblock_slow(inode, ext); 189 190 return bh; 191 } 192 193 static struct buffer_head * 194 affs_get_extblock_slow(struct inode *inode, u32 ext) 195 { 196 struct super_block *sb = inode->i_sb; 197 struct buffer_head *bh; 198 u32 ext_key; 199 u32 lc_idx, lc_off, ac_idx; 200 u32 tmp, idx; 201 202 if (ext == AFFS_I(inode)->i_ext_last + 1) { 203 /* read the next extended block from the current one */ 204 bh = AFFS_I(inode)->i_ext_bh; 205 ext_key = be32_to_cpu(AFFS_TAIL(sb, bh)->extension); 206 if (ext < AFFS_I(inode)->i_extcnt) 207 goto read_ext; 208 if (ext > AFFS_I(inode)->i_extcnt) 209 BUG(); 210 bh = affs_alloc_extblock(inode, bh, ext); 211 if (IS_ERR(bh)) 212 return bh; 213 goto store_ext; 214 } 215 216 if (ext == 0) { 217 /* we seek back to the file header block */ 218 ext_key = inode->i_ino; 219 goto read_ext; 220 } 221 222 if (ext >= AFFS_I(inode)->i_extcnt) { 223 struct buffer_head *prev_bh; 224 225 /* allocate a new extended block */ 226 if (ext > AFFS_I(inode)->i_extcnt) 227 BUG(); 228 229 /* get previous extended block */ 230 prev_bh = affs_get_extblock(inode, ext - 1); 231 if (IS_ERR(prev_bh)) 232 return prev_bh; 233 bh = affs_alloc_extblock(inode, prev_bh, ext); 234 affs_brelse(prev_bh); 235 if (IS_ERR(bh)) 236 return bh; 237 goto store_ext; 238 } 239 240 again: 241 /* check if there is an extended cache and whether it's large enough */ 242 lc_idx = ext >> AFFS_I(inode)->i_lc_shift; 243 lc_off = ext & AFFS_I(inode)->i_lc_mask; 244 245 if (lc_idx >= AFFS_I(inode)->i_lc_size) { 246 int err; 247 248 err = affs_grow_extcache(inode, lc_idx); 249 if (err) 250 return ERR_PTR(err); 251 goto again; 252 } 253 254 /* every n'th key we find in the linear cache */ 255 if (!lc_off) { 256 ext_key = AFFS_I(inode)->i_lc[lc_idx]; 257 goto read_ext; 258 } 259 260 /* maybe it's still in the associative cache */ 261 ac_idx = (ext - lc_idx - 1) & AFFS_AC_MASK; 262 if (AFFS_I(inode)->i_ac[ac_idx].ext == ext) { 263 ext_key = AFFS_I(inode)->i_ac[ac_idx].key; 264 goto read_ext; 265 } 266 267 /* try to find one of the previous extended blocks */ 268 tmp = ext; 269 idx = ac_idx; 270 while (--tmp, --lc_off > 0) { 271 idx = (idx - 1) & AFFS_AC_MASK; 272 if (AFFS_I(inode)->i_ac[idx].ext == tmp) { 273 ext_key = AFFS_I(inode)->i_ac[idx].key; 274 goto find_ext; 275 } 276 } 277 278 /* fall back to the linear cache */ 279 ext_key = AFFS_I(inode)->i_lc[lc_idx]; 280 find_ext: 281 /* read all extended blocks until we find the one we need */ 282 //unlock cache 283 do { 284 bh = affs_bread(sb, ext_key); 285 if (!bh) 286 goto err_bread; 287 ext_key = be32_to_cpu(AFFS_TAIL(sb, bh)->extension); 288 affs_brelse(bh); 289 tmp++; 290 } while (tmp < ext); 291 //lock cache 292 293 /* store it in the associative cache */ 294 // recalculate ac_idx? 295 AFFS_I(inode)->i_ac[ac_idx].ext = ext; 296 AFFS_I(inode)->i_ac[ac_idx].key = ext_key; 297 298 read_ext: 299 /* finally read the right extended block */ 300 //unlock cache 301 bh = affs_bread(sb, ext_key); 302 if (!bh) 303 goto err_bread; 304 //lock cache 305 306 store_ext: 307 /* release old cached extended block and store the new one */ 308 affs_brelse(AFFS_I(inode)->i_ext_bh); 309 AFFS_I(inode)->i_ext_last = ext; 310 AFFS_I(inode)->i_ext_bh = bh; 311 get_bh(bh); 312 313 return bh; 314 315 err_bread: 316 affs_brelse(bh); 317 return ERR_PTR(-EIO); 318 } 319 320 static int 321 affs_get_block(struct inode *inode, sector_t block, struct buffer_head *bh_result, int create) 322 { 323 struct super_block *sb = inode->i_sb; 324 struct buffer_head *ext_bh; 325 u32 ext; 326 327 pr_debug("%s(%u, %lu)\n", 328 __func__, (u32)inode->i_ino, (unsigned long)block); 329 330 BUG_ON(block > (sector_t)0x7fffffffUL); 331 332 if (block >= AFFS_I(inode)->i_blkcnt) { 333 if (block > AFFS_I(inode)->i_blkcnt || !create) 334 goto err_big; 335 } else 336 create = 0; 337 338 //lock cache 339 affs_lock_ext(inode); 340 341 ext = (u32)block / AFFS_SB(sb)->s_hashsize; 342 block -= ext * AFFS_SB(sb)->s_hashsize; 343 ext_bh = affs_get_extblock(inode, ext); 344 if (IS_ERR(ext_bh)) 345 goto err_ext; 346 map_bh(bh_result, sb, (sector_t)be32_to_cpu(AFFS_BLOCK(sb, ext_bh, block))); 347 348 if (create) { 349 u32 blocknr = affs_alloc_block(inode, ext_bh->b_blocknr); 350 if (!blocknr) 351 goto err_alloc; 352 set_buffer_new(bh_result); 353 AFFS_I(inode)->mmu_private += AFFS_SB(sb)->s_data_blksize; 354 AFFS_I(inode)->i_blkcnt++; 355 356 /* store new block */ 357 if (bh_result->b_blocknr) 358 affs_warning(sb, "get_block", "block already set (%x)", bh_result->b_blocknr); 359 AFFS_BLOCK(sb, ext_bh, block) = cpu_to_be32(blocknr); 360 AFFS_HEAD(ext_bh)->block_count = cpu_to_be32(block + 1); 361 affs_adjust_checksum(ext_bh, blocknr - bh_result->b_blocknr + 1); 362 bh_result->b_blocknr = blocknr; 363 364 if (!block) { 365 /* insert first block into header block */ 366 u32 tmp = be32_to_cpu(AFFS_HEAD(ext_bh)->first_data); 367 if (tmp) 368 affs_warning(sb, "get_block", "first block already set (%d)", tmp); 369 AFFS_HEAD(ext_bh)->first_data = cpu_to_be32(blocknr); 370 affs_adjust_checksum(ext_bh, blocknr - tmp); 371 } 372 } 373 374 affs_brelse(ext_bh); 375 //unlock cache 376 affs_unlock_ext(inode); 377 return 0; 378 379 err_big: 380 affs_error(inode->i_sb,"get_block","strange block request %d", block); 381 return -EIO; 382 err_ext: 383 // unlock cache 384 affs_unlock_ext(inode); 385 return PTR_ERR(ext_bh); 386 err_alloc: 387 brelse(ext_bh); 388 clear_buffer_mapped(bh_result); 389 bh_result->b_bdev = NULL; 390 // unlock cache 391 affs_unlock_ext(inode); 392 return -ENOSPC; 393 } 394 395 static int affs_writepage(struct page *page, struct writeback_control *wbc) 396 { 397 return block_write_full_page(page, affs_get_block, wbc); 398 } 399 400 static int affs_readpage(struct file *file, struct page *page) 401 { 402 return block_read_full_page(page, affs_get_block); 403 } 404 405 static void affs_write_failed(struct address_space *mapping, loff_t to) 406 { 407 struct inode *inode = mapping->host; 408 409 if (to > inode->i_size) { 410 truncate_pagecache(inode, inode->i_size); 411 affs_truncate(inode); 412 } 413 } 414 415 static int affs_write_begin(struct file *file, struct address_space *mapping, 416 loff_t pos, unsigned len, unsigned flags, 417 struct page **pagep, void **fsdata) 418 { 419 int ret; 420 421 *pagep = NULL; 422 ret = cont_write_begin(file, mapping, pos, len, flags, pagep, fsdata, 423 affs_get_block, 424 &AFFS_I(mapping->host)->mmu_private); 425 if (unlikely(ret)) 426 affs_write_failed(mapping, pos + len); 427 428 return ret; 429 } 430 431 static sector_t _affs_bmap(struct address_space *mapping, sector_t block) 432 { 433 return generic_block_bmap(mapping,block,affs_get_block); 434 } 435 436 const struct address_space_operations affs_aops = { 437 .readpage = affs_readpage, 438 .writepage = affs_writepage, 439 .write_begin = affs_write_begin, 440 .write_end = generic_write_end, 441 .bmap = _affs_bmap 442 }; 443 444 static inline struct buffer_head * 445 affs_bread_ino(struct inode *inode, int block, int create) 446 { 447 struct buffer_head *bh, tmp_bh; 448 int err; 449 450 tmp_bh.b_state = 0; 451 err = affs_get_block(inode, block, &tmp_bh, create); 452 if (!err) { 453 bh = affs_bread(inode->i_sb, tmp_bh.b_blocknr); 454 if (bh) { 455 bh->b_state |= tmp_bh.b_state; 456 return bh; 457 } 458 err = -EIO; 459 } 460 return ERR_PTR(err); 461 } 462 463 static inline struct buffer_head * 464 affs_getzeroblk_ino(struct inode *inode, int block) 465 { 466 struct buffer_head *bh, tmp_bh; 467 int err; 468 469 tmp_bh.b_state = 0; 470 err = affs_get_block(inode, block, &tmp_bh, 1); 471 if (!err) { 472 bh = affs_getzeroblk(inode->i_sb, tmp_bh.b_blocknr); 473 if (bh) { 474 bh->b_state |= tmp_bh.b_state; 475 return bh; 476 } 477 err = -EIO; 478 } 479 return ERR_PTR(err); 480 } 481 482 static inline struct buffer_head * 483 affs_getemptyblk_ino(struct inode *inode, int block) 484 { 485 struct buffer_head *bh, tmp_bh; 486 int err; 487 488 tmp_bh.b_state = 0; 489 err = affs_get_block(inode, block, &tmp_bh, 1); 490 if (!err) { 491 bh = affs_getemptyblk(inode->i_sb, tmp_bh.b_blocknr); 492 if (bh) { 493 bh->b_state |= tmp_bh.b_state; 494 return bh; 495 } 496 err = -EIO; 497 } 498 return ERR_PTR(err); 499 } 500 501 static int 502 affs_do_readpage_ofs(struct page *page, unsigned to) 503 { 504 struct inode *inode = page->mapping->host; 505 struct super_block *sb = inode->i_sb; 506 struct buffer_head *bh; 507 char *data; 508 unsigned pos = 0; 509 u32 bidx, boff, bsize; 510 u32 tmp; 511 512 pr_debug("%s(%u, %ld, 0, %d)\n", __func__, (u32)inode->i_ino, 513 page->index, to); 514 BUG_ON(to > PAGE_CACHE_SIZE); 515 kmap(page); 516 data = page_address(page); 517 bsize = AFFS_SB(sb)->s_data_blksize; 518 tmp = page->index << PAGE_CACHE_SHIFT; 519 bidx = tmp / bsize; 520 boff = tmp % bsize; 521 522 while (pos < to) { 523 bh = affs_bread_ino(inode, bidx, 0); 524 if (IS_ERR(bh)) 525 return PTR_ERR(bh); 526 tmp = min(bsize - boff, to - pos); 527 BUG_ON(pos + tmp > to || tmp > bsize); 528 memcpy(data + pos, AFFS_DATA(bh) + boff, tmp); 529 affs_brelse(bh); 530 bidx++; 531 pos += tmp; 532 boff = 0; 533 } 534 flush_dcache_page(page); 535 kunmap(page); 536 return 0; 537 } 538 539 static int 540 affs_extent_file_ofs(struct inode *inode, u32 newsize) 541 { 542 struct super_block *sb = inode->i_sb; 543 struct buffer_head *bh, *prev_bh; 544 u32 bidx, boff; 545 u32 size, bsize; 546 u32 tmp; 547 548 pr_debug("%s(%u, %d)\n", __func__, (u32)inode->i_ino, newsize); 549 bsize = AFFS_SB(sb)->s_data_blksize; 550 bh = NULL; 551 size = AFFS_I(inode)->mmu_private; 552 bidx = size / bsize; 553 boff = size % bsize; 554 if (boff) { 555 bh = affs_bread_ino(inode, bidx, 0); 556 if (IS_ERR(bh)) 557 return PTR_ERR(bh); 558 tmp = min(bsize - boff, newsize - size); 559 BUG_ON(boff + tmp > bsize || tmp > bsize); 560 memset(AFFS_DATA(bh) + boff, 0, tmp); 561 be32_add_cpu(&AFFS_DATA_HEAD(bh)->size, tmp); 562 affs_fix_checksum(sb, bh); 563 mark_buffer_dirty_inode(bh, inode); 564 size += tmp; 565 bidx++; 566 } else if (bidx) { 567 bh = affs_bread_ino(inode, bidx - 1, 0); 568 if (IS_ERR(bh)) 569 return PTR_ERR(bh); 570 } 571 572 while (size < newsize) { 573 prev_bh = bh; 574 bh = affs_getzeroblk_ino(inode, bidx); 575 if (IS_ERR(bh)) 576 goto out; 577 tmp = min(bsize, newsize - size); 578 BUG_ON(tmp > bsize); 579 AFFS_DATA_HEAD(bh)->ptype = cpu_to_be32(T_DATA); 580 AFFS_DATA_HEAD(bh)->key = cpu_to_be32(inode->i_ino); 581 AFFS_DATA_HEAD(bh)->sequence = cpu_to_be32(bidx); 582 AFFS_DATA_HEAD(bh)->size = cpu_to_be32(tmp); 583 affs_fix_checksum(sb, bh); 584 bh->b_state &= ~(1UL << BH_New); 585 mark_buffer_dirty_inode(bh, inode); 586 if (prev_bh) { 587 u32 tmp_next = be32_to_cpu(AFFS_DATA_HEAD(prev_bh)->next); 588 589 if (tmp_next) 590 affs_warning(sb, "extent_file_ofs", 591 "next block already set for %d (%d)", 592 bidx, tmp_next); 593 AFFS_DATA_HEAD(prev_bh)->next = cpu_to_be32(bh->b_blocknr); 594 affs_adjust_checksum(prev_bh, bh->b_blocknr - tmp_next); 595 mark_buffer_dirty_inode(prev_bh, inode); 596 affs_brelse(prev_bh); 597 } 598 size += bsize; 599 bidx++; 600 } 601 affs_brelse(bh); 602 inode->i_size = AFFS_I(inode)->mmu_private = newsize; 603 return 0; 604 605 out: 606 inode->i_size = AFFS_I(inode)->mmu_private = newsize; 607 return PTR_ERR(bh); 608 } 609 610 static int 611 affs_readpage_ofs(struct file *file, struct page *page) 612 { 613 struct inode *inode = page->mapping->host; 614 u32 to; 615 int err; 616 617 pr_debug("%s(%u, %ld)\n", __func__, (u32)inode->i_ino, page->index); 618 to = PAGE_CACHE_SIZE; 619 if (((page->index + 1) << PAGE_CACHE_SHIFT) > inode->i_size) { 620 to = inode->i_size & ~PAGE_CACHE_MASK; 621 memset(page_address(page) + to, 0, PAGE_CACHE_SIZE - to); 622 } 623 624 err = affs_do_readpage_ofs(page, to); 625 if (!err) 626 SetPageUptodate(page); 627 unlock_page(page); 628 return err; 629 } 630 631 static int affs_write_begin_ofs(struct file *file, struct address_space *mapping, 632 loff_t pos, unsigned len, unsigned flags, 633 struct page **pagep, void **fsdata) 634 { 635 struct inode *inode = mapping->host; 636 struct page *page; 637 pgoff_t index; 638 int err = 0; 639 640 pr_debug("%s(%u, %llu, %llu)\n", __func__, (u32)inode->i_ino, 641 (unsigned long long)pos, (unsigned long long)pos + len); 642 if (pos > AFFS_I(inode)->mmu_private) { 643 /* XXX: this probably leaves a too-big i_size in case of 644 * failure. Should really be updating i_size at write_end time 645 */ 646 err = affs_extent_file_ofs(inode, pos); 647 if (err) 648 return err; 649 } 650 651 index = pos >> PAGE_CACHE_SHIFT; 652 page = grab_cache_page_write_begin(mapping, index, flags); 653 if (!page) 654 return -ENOMEM; 655 *pagep = page; 656 657 if (PageUptodate(page)) 658 return 0; 659 660 /* XXX: inefficient but safe in the face of short writes */ 661 err = affs_do_readpage_ofs(page, PAGE_CACHE_SIZE); 662 if (err) { 663 unlock_page(page); 664 page_cache_release(page); 665 } 666 return err; 667 } 668 669 static int affs_write_end_ofs(struct file *file, struct address_space *mapping, 670 loff_t pos, unsigned len, unsigned copied, 671 struct page *page, void *fsdata) 672 { 673 struct inode *inode = mapping->host; 674 struct super_block *sb = inode->i_sb; 675 struct buffer_head *bh, *prev_bh; 676 char *data; 677 u32 bidx, boff, bsize; 678 unsigned from, to; 679 u32 tmp; 680 int written; 681 682 from = pos & (PAGE_CACHE_SIZE - 1); 683 to = pos + len; 684 /* 685 * XXX: not sure if this can handle short copies (len < copied), but 686 * we don't have to, because the page should always be uptodate here, 687 * due to write_begin. 688 */ 689 690 pr_debug("%s(%u, %llu, %llu)\n", 691 __func__, (u32)inode->i_ino, (unsigned long long)pos, 692 (unsigned long long)pos + len); 693 bsize = AFFS_SB(sb)->s_data_blksize; 694 data = page_address(page); 695 696 bh = NULL; 697 written = 0; 698 tmp = (page->index << PAGE_CACHE_SHIFT) + from; 699 bidx = tmp / bsize; 700 boff = tmp % bsize; 701 if (boff) { 702 bh = affs_bread_ino(inode, bidx, 0); 703 if (IS_ERR(bh)) 704 return PTR_ERR(bh); 705 tmp = min(bsize - boff, to - from); 706 BUG_ON(boff + tmp > bsize || tmp > bsize); 707 memcpy(AFFS_DATA(bh) + boff, data + from, tmp); 708 be32_add_cpu(&AFFS_DATA_HEAD(bh)->size, tmp); 709 affs_fix_checksum(sb, bh); 710 mark_buffer_dirty_inode(bh, inode); 711 written += tmp; 712 from += tmp; 713 bidx++; 714 } else if (bidx) { 715 bh = affs_bread_ino(inode, bidx - 1, 0); 716 if (IS_ERR(bh)) 717 return PTR_ERR(bh); 718 } 719 while (from + bsize <= to) { 720 prev_bh = bh; 721 bh = affs_getemptyblk_ino(inode, bidx); 722 if (IS_ERR(bh)) 723 goto out; 724 memcpy(AFFS_DATA(bh), data + from, bsize); 725 if (buffer_new(bh)) { 726 AFFS_DATA_HEAD(bh)->ptype = cpu_to_be32(T_DATA); 727 AFFS_DATA_HEAD(bh)->key = cpu_to_be32(inode->i_ino); 728 AFFS_DATA_HEAD(bh)->sequence = cpu_to_be32(bidx); 729 AFFS_DATA_HEAD(bh)->size = cpu_to_be32(bsize); 730 AFFS_DATA_HEAD(bh)->next = 0; 731 bh->b_state &= ~(1UL << BH_New); 732 if (prev_bh) { 733 u32 tmp_next = be32_to_cpu(AFFS_DATA_HEAD(prev_bh)->next); 734 735 if (tmp_next) 736 affs_warning(sb, "commit_write_ofs", 737 "next block already set for %d (%d)", 738 bidx, tmp_next); 739 AFFS_DATA_HEAD(prev_bh)->next = cpu_to_be32(bh->b_blocknr); 740 affs_adjust_checksum(prev_bh, bh->b_blocknr - tmp_next); 741 mark_buffer_dirty_inode(prev_bh, inode); 742 } 743 } 744 affs_brelse(prev_bh); 745 affs_fix_checksum(sb, bh); 746 mark_buffer_dirty_inode(bh, inode); 747 written += bsize; 748 from += bsize; 749 bidx++; 750 } 751 if (from < to) { 752 prev_bh = bh; 753 bh = affs_bread_ino(inode, bidx, 1); 754 if (IS_ERR(bh)) 755 goto out; 756 tmp = min(bsize, to - from); 757 BUG_ON(tmp > bsize); 758 memcpy(AFFS_DATA(bh), data + from, tmp); 759 if (buffer_new(bh)) { 760 AFFS_DATA_HEAD(bh)->ptype = cpu_to_be32(T_DATA); 761 AFFS_DATA_HEAD(bh)->key = cpu_to_be32(inode->i_ino); 762 AFFS_DATA_HEAD(bh)->sequence = cpu_to_be32(bidx); 763 AFFS_DATA_HEAD(bh)->size = cpu_to_be32(tmp); 764 AFFS_DATA_HEAD(bh)->next = 0; 765 bh->b_state &= ~(1UL << BH_New); 766 if (prev_bh) { 767 u32 tmp_next = be32_to_cpu(AFFS_DATA_HEAD(prev_bh)->next); 768 769 if (tmp_next) 770 affs_warning(sb, "commit_write_ofs", 771 "next block already set for %d (%d)", 772 bidx, tmp_next); 773 AFFS_DATA_HEAD(prev_bh)->next = cpu_to_be32(bh->b_blocknr); 774 affs_adjust_checksum(prev_bh, bh->b_blocknr - tmp_next); 775 mark_buffer_dirty_inode(prev_bh, inode); 776 } 777 } else if (be32_to_cpu(AFFS_DATA_HEAD(bh)->size) < tmp) 778 AFFS_DATA_HEAD(bh)->size = cpu_to_be32(tmp); 779 affs_brelse(prev_bh); 780 affs_fix_checksum(sb, bh); 781 mark_buffer_dirty_inode(bh, inode); 782 written += tmp; 783 from += tmp; 784 bidx++; 785 } 786 SetPageUptodate(page); 787 788 done: 789 affs_brelse(bh); 790 tmp = (page->index << PAGE_CACHE_SHIFT) + from; 791 if (tmp > inode->i_size) 792 inode->i_size = AFFS_I(inode)->mmu_private = tmp; 793 794 unlock_page(page); 795 page_cache_release(page); 796 797 return written; 798 799 out: 800 bh = prev_bh; 801 if (!written) 802 written = PTR_ERR(bh); 803 goto done; 804 } 805 806 const struct address_space_operations affs_aops_ofs = { 807 .readpage = affs_readpage_ofs, 808 //.writepage = affs_writepage_ofs, 809 .write_begin = affs_write_begin_ofs, 810 .write_end = affs_write_end_ofs 811 }; 812 813 /* Free any preallocated blocks. */ 814 815 void 816 affs_free_prealloc(struct inode *inode) 817 { 818 struct super_block *sb = inode->i_sb; 819 820 pr_debug("free_prealloc(ino=%lu)\n", inode->i_ino); 821 822 while (AFFS_I(inode)->i_pa_cnt) { 823 AFFS_I(inode)->i_pa_cnt--; 824 affs_free_block(sb, ++AFFS_I(inode)->i_lastalloc); 825 } 826 } 827 828 /* Truncate (or enlarge) a file to the requested size. */ 829 830 void 831 affs_truncate(struct inode *inode) 832 { 833 struct super_block *sb = inode->i_sb; 834 u32 ext, ext_key; 835 u32 last_blk, blkcnt, blk; 836 u32 size; 837 struct buffer_head *ext_bh; 838 int i; 839 840 pr_debug("truncate(inode=%d, oldsize=%u, newsize=%u)\n", 841 (u32)inode->i_ino, (u32)AFFS_I(inode)->mmu_private, (u32)inode->i_size); 842 843 last_blk = 0; 844 ext = 0; 845 if (inode->i_size) { 846 last_blk = ((u32)inode->i_size - 1) / AFFS_SB(sb)->s_data_blksize; 847 ext = last_blk / AFFS_SB(sb)->s_hashsize; 848 } 849 850 if (inode->i_size > AFFS_I(inode)->mmu_private) { 851 struct address_space *mapping = inode->i_mapping; 852 struct page *page; 853 void *fsdata; 854 loff_t isize = inode->i_size; 855 int res; 856 857 res = mapping->a_ops->write_begin(NULL, mapping, isize, 0, 0, &page, &fsdata); 858 if (!res) 859 res = mapping->a_ops->write_end(NULL, mapping, isize, 0, 0, page, fsdata); 860 else 861 inode->i_size = AFFS_I(inode)->mmu_private; 862 mark_inode_dirty(inode); 863 return; 864 } else if (inode->i_size == AFFS_I(inode)->mmu_private) 865 return; 866 867 // lock cache 868 ext_bh = affs_get_extblock(inode, ext); 869 if (IS_ERR(ext_bh)) { 870 affs_warning(sb, "truncate", "unexpected read error for ext block %u (%d)", 871 ext, PTR_ERR(ext_bh)); 872 return; 873 } 874 if (AFFS_I(inode)->i_lc) { 875 /* clear linear cache */ 876 i = (ext + 1) >> AFFS_I(inode)->i_lc_shift; 877 if (AFFS_I(inode)->i_lc_size > i) { 878 AFFS_I(inode)->i_lc_size = i; 879 for (; i < AFFS_LC_SIZE; i++) 880 AFFS_I(inode)->i_lc[i] = 0; 881 } 882 /* clear associative cache */ 883 for (i = 0; i < AFFS_AC_SIZE; i++) 884 if (AFFS_I(inode)->i_ac[i].ext >= ext) 885 AFFS_I(inode)->i_ac[i].ext = 0; 886 } 887 ext_key = be32_to_cpu(AFFS_TAIL(sb, ext_bh)->extension); 888 889 blkcnt = AFFS_I(inode)->i_blkcnt; 890 i = 0; 891 blk = last_blk; 892 if (inode->i_size) { 893 i = last_blk % AFFS_SB(sb)->s_hashsize + 1; 894 blk++; 895 } else 896 AFFS_HEAD(ext_bh)->first_data = 0; 897 AFFS_HEAD(ext_bh)->block_count = cpu_to_be32(i); 898 size = AFFS_SB(sb)->s_hashsize; 899 if (size > blkcnt - blk + i) 900 size = blkcnt - blk + i; 901 for (; i < size; i++, blk++) { 902 affs_free_block(sb, be32_to_cpu(AFFS_BLOCK(sb, ext_bh, i))); 903 AFFS_BLOCK(sb, ext_bh, i) = 0; 904 } 905 AFFS_TAIL(sb, ext_bh)->extension = 0; 906 affs_fix_checksum(sb, ext_bh); 907 mark_buffer_dirty_inode(ext_bh, inode); 908 affs_brelse(ext_bh); 909 910 if (inode->i_size) { 911 AFFS_I(inode)->i_blkcnt = last_blk + 1; 912 AFFS_I(inode)->i_extcnt = ext + 1; 913 if (AFFS_SB(sb)->s_flags & SF_OFS) { 914 struct buffer_head *bh = affs_bread_ino(inode, last_blk, 0); 915 u32 tmp; 916 if (IS_ERR(bh)) { 917 affs_warning(sb, "truncate", "unexpected read error for last block %u (%d)", 918 ext, PTR_ERR(bh)); 919 return; 920 } 921 tmp = be32_to_cpu(AFFS_DATA_HEAD(bh)->next); 922 AFFS_DATA_HEAD(bh)->next = 0; 923 affs_adjust_checksum(bh, -tmp); 924 affs_brelse(bh); 925 } 926 } else { 927 AFFS_I(inode)->i_blkcnt = 0; 928 AFFS_I(inode)->i_extcnt = 1; 929 } 930 AFFS_I(inode)->mmu_private = inode->i_size; 931 // unlock cache 932 933 while (ext_key) { 934 ext_bh = affs_bread(sb, ext_key); 935 size = AFFS_SB(sb)->s_hashsize; 936 if (size > blkcnt - blk) 937 size = blkcnt - blk; 938 for (i = 0; i < size; i++, blk++) 939 affs_free_block(sb, be32_to_cpu(AFFS_BLOCK(sb, ext_bh, i))); 940 affs_free_block(sb, ext_key); 941 ext_key = be32_to_cpu(AFFS_TAIL(sb, ext_bh)->extension); 942 affs_brelse(ext_bh); 943 } 944 affs_free_prealloc(inode); 945 } 946 947 int affs_file_fsync(struct file *filp, loff_t start, loff_t end, int datasync) 948 { 949 struct inode *inode = filp->f_mapping->host; 950 int ret, err; 951 952 err = filemap_write_and_wait_range(inode->i_mapping, start, end); 953 if (err) 954 return err; 955 956 mutex_lock(&inode->i_mutex); 957 ret = write_inode_now(inode, 0); 958 err = sync_blockdev(inode->i_sb->s_bdev); 959 if (!ret) 960 ret = err; 961 mutex_unlock(&inode->i_mutex); 962 return ret; 963 } 964