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 = do_sync_read, 31 .aio_read = generic_file_aio_read, 32 .write = do_sync_write, 33 .aio_write = generic_file_aio_write, 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("AFFS: 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("AFFS: 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("AFFS: get_block(%u, %lu)\n", (u32)inode->i_ino, (unsigned long)block); 328 329 BUG_ON(block > (sector_t)0x7fffffffUL); 330 331 if (block >= AFFS_I(inode)->i_blkcnt) { 332 if (block > AFFS_I(inode)->i_blkcnt || !create) 333 goto err_big; 334 } else 335 create = 0; 336 337 //lock cache 338 affs_lock_ext(inode); 339 340 ext = (u32)block / AFFS_SB(sb)->s_hashsize; 341 block -= ext * AFFS_SB(sb)->s_hashsize; 342 ext_bh = affs_get_extblock(inode, ext); 343 if (IS_ERR(ext_bh)) 344 goto err_ext; 345 map_bh(bh_result, sb, (sector_t)be32_to_cpu(AFFS_BLOCK(sb, ext_bh, block))); 346 347 if (create) { 348 u32 blocknr = affs_alloc_block(inode, ext_bh->b_blocknr); 349 if (!blocknr) 350 goto err_alloc; 351 set_buffer_new(bh_result); 352 AFFS_I(inode)->mmu_private += AFFS_SB(sb)->s_data_blksize; 353 AFFS_I(inode)->i_blkcnt++; 354 355 /* store new block */ 356 if (bh_result->b_blocknr) 357 affs_warning(sb, "get_block", "block already set (%x)", bh_result->b_blocknr); 358 AFFS_BLOCK(sb, ext_bh, block) = cpu_to_be32(blocknr); 359 AFFS_HEAD(ext_bh)->block_count = cpu_to_be32(block + 1); 360 affs_adjust_checksum(ext_bh, blocknr - bh_result->b_blocknr + 1); 361 bh_result->b_blocknr = blocknr; 362 363 if (!block) { 364 /* insert first block into header block */ 365 u32 tmp = be32_to_cpu(AFFS_HEAD(ext_bh)->first_data); 366 if (tmp) 367 affs_warning(sb, "get_block", "first block already set (%d)", tmp); 368 AFFS_HEAD(ext_bh)->first_data = cpu_to_be32(blocknr); 369 affs_adjust_checksum(ext_bh, blocknr - tmp); 370 } 371 } 372 373 affs_brelse(ext_bh); 374 //unlock cache 375 affs_unlock_ext(inode); 376 return 0; 377 378 err_big: 379 affs_error(inode->i_sb,"get_block","strange block request %d", block); 380 return -EIO; 381 err_ext: 382 // unlock cache 383 affs_unlock_ext(inode); 384 return PTR_ERR(ext_bh); 385 err_alloc: 386 brelse(ext_bh); 387 clear_buffer_mapped(bh_result); 388 bh_result->b_bdev = NULL; 389 // unlock cache 390 affs_unlock_ext(inode); 391 return -ENOSPC; 392 } 393 394 static int affs_writepage(struct page *page, struct writeback_control *wbc) 395 { 396 return block_write_full_page(page, affs_get_block, wbc); 397 } 398 399 static int affs_readpage(struct file *file, struct page *page) 400 { 401 return block_read_full_page(page, affs_get_block); 402 } 403 404 static void affs_write_failed(struct address_space *mapping, loff_t to) 405 { 406 struct inode *inode = mapping->host; 407 408 if (to > inode->i_size) { 409 truncate_pagecache(inode, inode->i_size); 410 affs_truncate(inode); 411 } 412 } 413 414 static int affs_write_begin(struct file *file, struct address_space *mapping, 415 loff_t pos, unsigned len, unsigned flags, 416 struct page **pagep, void **fsdata) 417 { 418 int ret; 419 420 *pagep = NULL; 421 ret = cont_write_begin(file, mapping, pos, len, flags, pagep, fsdata, 422 affs_get_block, 423 &AFFS_I(mapping->host)->mmu_private); 424 if (unlikely(ret)) 425 affs_write_failed(mapping, pos + len); 426 427 return ret; 428 } 429 430 static sector_t _affs_bmap(struct address_space *mapping, sector_t block) 431 { 432 return generic_block_bmap(mapping,block,affs_get_block); 433 } 434 435 const struct address_space_operations affs_aops = { 436 .readpage = affs_readpage, 437 .writepage = affs_writepage, 438 .write_begin = affs_write_begin, 439 .write_end = generic_write_end, 440 .bmap = _affs_bmap 441 }; 442 443 static inline struct buffer_head * 444 affs_bread_ino(struct inode *inode, int block, int create) 445 { 446 struct buffer_head *bh, tmp_bh; 447 int err; 448 449 tmp_bh.b_state = 0; 450 err = affs_get_block(inode, block, &tmp_bh, create); 451 if (!err) { 452 bh = affs_bread(inode->i_sb, tmp_bh.b_blocknr); 453 if (bh) { 454 bh->b_state |= tmp_bh.b_state; 455 return bh; 456 } 457 err = -EIO; 458 } 459 return ERR_PTR(err); 460 } 461 462 static inline struct buffer_head * 463 affs_getzeroblk_ino(struct inode *inode, int block) 464 { 465 struct buffer_head *bh, tmp_bh; 466 int err; 467 468 tmp_bh.b_state = 0; 469 err = affs_get_block(inode, block, &tmp_bh, 1); 470 if (!err) { 471 bh = affs_getzeroblk(inode->i_sb, tmp_bh.b_blocknr); 472 if (bh) { 473 bh->b_state |= tmp_bh.b_state; 474 return bh; 475 } 476 err = -EIO; 477 } 478 return ERR_PTR(err); 479 } 480 481 static inline struct buffer_head * 482 affs_getemptyblk_ino(struct inode *inode, int block) 483 { 484 struct buffer_head *bh, tmp_bh; 485 int err; 486 487 tmp_bh.b_state = 0; 488 err = affs_get_block(inode, block, &tmp_bh, 1); 489 if (!err) { 490 bh = affs_getemptyblk(inode->i_sb, tmp_bh.b_blocknr); 491 if (bh) { 492 bh->b_state |= tmp_bh.b_state; 493 return bh; 494 } 495 err = -EIO; 496 } 497 return ERR_PTR(err); 498 } 499 500 static int 501 affs_do_readpage_ofs(struct file *file, struct page *page, unsigned from, unsigned to) 502 { 503 struct inode *inode = page->mapping->host; 504 struct super_block *sb = inode->i_sb; 505 struct buffer_head *bh; 506 char *data; 507 u32 bidx, boff, bsize; 508 u32 tmp; 509 510 pr_debug("AFFS: read_page(%u, %ld, %d, %d)\n", (u32)inode->i_ino, page->index, from, to); 511 BUG_ON(from > to || to > PAGE_CACHE_SIZE); 512 kmap(page); 513 data = page_address(page); 514 bsize = AFFS_SB(sb)->s_data_blksize; 515 tmp = (page->index << PAGE_CACHE_SHIFT) + from; 516 bidx = tmp / bsize; 517 boff = tmp % bsize; 518 519 while (from < to) { 520 bh = affs_bread_ino(inode, bidx, 0); 521 if (IS_ERR(bh)) 522 return PTR_ERR(bh); 523 tmp = min(bsize - boff, to - from); 524 BUG_ON(from + tmp > to || tmp > bsize); 525 memcpy(data + from, AFFS_DATA(bh) + boff, tmp); 526 affs_brelse(bh); 527 bidx++; 528 from += tmp; 529 boff = 0; 530 } 531 flush_dcache_page(page); 532 kunmap(page); 533 return 0; 534 } 535 536 static int 537 affs_extent_file_ofs(struct inode *inode, u32 newsize) 538 { 539 struct super_block *sb = inode->i_sb; 540 struct buffer_head *bh, *prev_bh; 541 u32 bidx, boff; 542 u32 size, bsize; 543 u32 tmp; 544 545 pr_debug("AFFS: extent_file(%u, %d)\n", (u32)inode->i_ino, newsize); 546 bsize = AFFS_SB(sb)->s_data_blksize; 547 bh = NULL; 548 size = AFFS_I(inode)->mmu_private; 549 bidx = size / bsize; 550 boff = size % bsize; 551 if (boff) { 552 bh = affs_bread_ino(inode, bidx, 0); 553 if (IS_ERR(bh)) 554 return PTR_ERR(bh); 555 tmp = min(bsize - boff, newsize - size); 556 BUG_ON(boff + tmp > bsize || tmp > bsize); 557 memset(AFFS_DATA(bh) + boff, 0, tmp); 558 be32_add_cpu(&AFFS_DATA_HEAD(bh)->size, tmp); 559 affs_fix_checksum(sb, bh); 560 mark_buffer_dirty_inode(bh, inode); 561 size += tmp; 562 bidx++; 563 } else if (bidx) { 564 bh = affs_bread_ino(inode, bidx - 1, 0); 565 if (IS_ERR(bh)) 566 return PTR_ERR(bh); 567 } 568 569 while (size < newsize) { 570 prev_bh = bh; 571 bh = affs_getzeroblk_ino(inode, bidx); 572 if (IS_ERR(bh)) 573 goto out; 574 tmp = min(bsize, newsize - size); 575 BUG_ON(tmp > bsize); 576 AFFS_DATA_HEAD(bh)->ptype = cpu_to_be32(T_DATA); 577 AFFS_DATA_HEAD(bh)->key = cpu_to_be32(inode->i_ino); 578 AFFS_DATA_HEAD(bh)->sequence = cpu_to_be32(bidx); 579 AFFS_DATA_HEAD(bh)->size = cpu_to_be32(tmp); 580 affs_fix_checksum(sb, bh); 581 bh->b_state &= ~(1UL << BH_New); 582 mark_buffer_dirty_inode(bh, inode); 583 if (prev_bh) { 584 u32 tmp = be32_to_cpu(AFFS_DATA_HEAD(prev_bh)->next); 585 if (tmp) 586 affs_warning(sb, "extent_file_ofs", "next block already set for %d (%d)", bidx, tmp); 587 AFFS_DATA_HEAD(prev_bh)->next = cpu_to_be32(bh->b_blocknr); 588 affs_adjust_checksum(prev_bh, bh->b_blocknr - tmp); 589 mark_buffer_dirty_inode(prev_bh, inode); 590 affs_brelse(prev_bh); 591 } 592 size += bsize; 593 bidx++; 594 } 595 affs_brelse(bh); 596 inode->i_size = AFFS_I(inode)->mmu_private = newsize; 597 return 0; 598 599 out: 600 inode->i_size = AFFS_I(inode)->mmu_private = newsize; 601 return PTR_ERR(bh); 602 } 603 604 static int 605 affs_readpage_ofs(struct file *file, struct page *page) 606 { 607 struct inode *inode = page->mapping->host; 608 u32 to; 609 int err; 610 611 pr_debug("AFFS: read_page(%u, %ld)\n", (u32)inode->i_ino, page->index); 612 to = PAGE_CACHE_SIZE; 613 if (((page->index + 1) << PAGE_CACHE_SHIFT) > inode->i_size) { 614 to = inode->i_size & ~PAGE_CACHE_MASK; 615 memset(page_address(page) + to, 0, PAGE_CACHE_SIZE - to); 616 } 617 618 err = affs_do_readpage_ofs(file, page, 0, to); 619 if (!err) 620 SetPageUptodate(page); 621 unlock_page(page); 622 return err; 623 } 624 625 static int affs_write_begin_ofs(struct file *file, struct address_space *mapping, 626 loff_t pos, unsigned len, unsigned flags, 627 struct page **pagep, void **fsdata) 628 { 629 struct inode *inode = mapping->host; 630 struct page *page; 631 pgoff_t index; 632 int err = 0; 633 634 pr_debug("AFFS: write_begin(%u, %llu, %llu)\n", (u32)inode->i_ino, (unsigned long long)pos, (unsigned long long)pos + len); 635 if (pos > AFFS_I(inode)->mmu_private) { 636 /* XXX: this probably leaves a too-big i_size in case of 637 * failure. Should really be updating i_size at write_end time 638 */ 639 err = affs_extent_file_ofs(inode, pos); 640 if (err) 641 return err; 642 } 643 644 index = pos >> PAGE_CACHE_SHIFT; 645 page = grab_cache_page_write_begin(mapping, index, flags); 646 if (!page) 647 return -ENOMEM; 648 *pagep = page; 649 650 if (PageUptodate(page)) 651 return 0; 652 653 /* XXX: inefficient but safe in the face of short writes */ 654 err = affs_do_readpage_ofs(file, page, 0, PAGE_CACHE_SIZE); 655 if (err) { 656 unlock_page(page); 657 page_cache_release(page); 658 } 659 return err; 660 } 661 662 static int affs_write_end_ofs(struct file *file, struct address_space *mapping, 663 loff_t pos, unsigned len, unsigned copied, 664 struct page *page, void *fsdata) 665 { 666 struct inode *inode = mapping->host; 667 struct super_block *sb = inode->i_sb; 668 struct buffer_head *bh, *prev_bh; 669 char *data; 670 u32 bidx, boff, bsize; 671 unsigned from, to; 672 u32 tmp; 673 int written; 674 675 from = pos & (PAGE_CACHE_SIZE - 1); 676 to = pos + len; 677 /* 678 * XXX: not sure if this can handle short copies (len < copied), but 679 * we don't have to, because the page should always be uptodate here, 680 * due to write_begin. 681 */ 682 683 pr_debug("AFFS: write_begin(%u, %llu, %llu)\n", (u32)inode->i_ino, (unsigned long long)pos, (unsigned long long)pos + len); 684 bsize = AFFS_SB(sb)->s_data_blksize; 685 data = page_address(page); 686 687 bh = NULL; 688 written = 0; 689 tmp = (page->index << PAGE_CACHE_SHIFT) + from; 690 bidx = tmp / bsize; 691 boff = tmp % bsize; 692 if (boff) { 693 bh = affs_bread_ino(inode, bidx, 0); 694 if (IS_ERR(bh)) 695 return PTR_ERR(bh); 696 tmp = min(bsize - boff, to - from); 697 BUG_ON(boff + tmp > bsize || tmp > bsize); 698 memcpy(AFFS_DATA(bh) + boff, data + from, tmp); 699 be32_add_cpu(&AFFS_DATA_HEAD(bh)->size, tmp); 700 affs_fix_checksum(sb, bh); 701 mark_buffer_dirty_inode(bh, inode); 702 written += tmp; 703 from += tmp; 704 bidx++; 705 } else if (bidx) { 706 bh = affs_bread_ino(inode, bidx - 1, 0); 707 if (IS_ERR(bh)) 708 return PTR_ERR(bh); 709 } 710 while (from + bsize <= to) { 711 prev_bh = bh; 712 bh = affs_getemptyblk_ino(inode, bidx); 713 if (IS_ERR(bh)) 714 goto out; 715 memcpy(AFFS_DATA(bh), data + from, bsize); 716 if (buffer_new(bh)) { 717 AFFS_DATA_HEAD(bh)->ptype = cpu_to_be32(T_DATA); 718 AFFS_DATA_HEAD(bh)->key = cpu_to_be32(inode->i_ino); 719 AFFS_DATA_HEAD(bh)->sequence = cpu_to_be32(bidx); 720 AFFS_DATA_HEAD(bh)->size = cpu_to_be32(bsize); 721 AFFS_DATA_HEAD(bh)->next = 0; 722 bh->b_state &= ~(1UL << BH_New); 723 if (prev_bh) { 724 u32 tmp = be32_to_cpu(AFFS_DATA_HEAD(prev_bh)->next); 725 if (tmp) 726 affs_warning(sb, "commit_write_ofs", "next block already set for %d (%d)", bidx, tmp); 727 AFFS_DATA_HEAD(prev_bh)->next = cpu_to_be32(bh->b_blocknr); 728 affs_adjust_checksum(prev_bh, bh->b_blocknr - tmp); 729 mark_buffer_dirty_inode(prev_bh, inode); 730 } 731 } 732 affs_brelse(prev_bh); 733 affs_fix_checksum(sb, bh); 734 mark_buffer_dirty_inode(bh, inode); 735 written += bsize; 736 from += bsize; 737 bidx++; 738 } 739 if (from < to) { 740 prev_bh = bh; 741 bh = affs_bread_ino(inode, bidx, 1); 742 if (IS_ERR(bh)) 743 goto out; 744 tmp = min(bsize, to - from); 745 BUG_ON(tmp > bsize); 746 memcpy(AFFS_DATA(bh), data + from, tmp); 747 if (buffer_new(bh)) { 748 AFFS_DATA_HEAD(bh)->ptype = cpu_to_be32(T_DATA); 749 AFFS_DATA_HEAD(bh)->key = cpu_to_be32(inode->i_ino); 750 AFFS_DATA_HEAD(bh)->sequence = cpu_to_be32(bidx); 751 AFFS_DATA_HEAD(bh)->size = cpu_to_be32(tmp); 752 AFFS_DATA_HEAD(bh)->next = 0; 753 bh->b_state &= ~(1UL << BH_New); 754 if (prev_bh) { 755 u32 tmp = be32_to_cpu(AFFS_DATA_HEAD(prev_bh)->next); 756 if (tmp) 757 affs_warning(sb, "commit_write_ofs", "next block already set for %d (%d)", bidx, tmp); 758 AFFS_DATA_HEAD(prev_bh)->next = cpu_to_be32(bh->b_blocknr); 759 affs_adjust_checksum(prev_bh, bh->b_blocknr - tmp); 760 mark_buffer_dirty_inode(prev_bh, inode); 761 } 762 } else if (be32_to_cpu(AFFS_DATA_HEAD(bh)->size) < tmp) 763 AFFS_DATA_HEAD(bh)->size = cpu_to_be32(tmp); 764 affs_brelse(prev_bh); 765 affs_fix_checksum(sb, bh); 766 mark_buffer_dirty_inode(bh, inode); 767 written += tmp; 768 from += tmp; 769 bidx++; 770 } 771 SetPageUptodate(page); 772 773 done: 774 affs_brelse(bh); 775 tmp = (page->index << PAGE_CACHE_SHIFT) + from; 776 if (tmp > inode->i_size) 777 inode->i_size = AFFS_I(inode)->mmu_private = tmp; 778 779 unlock_page(page); 780 page_cache_release(page); 781 782 return written; 783 784 out: 785 bh = prev_bh; 786 if (!written) 787 written = PTR_ERR(bh); 788 goto done; 789 } 790 791 const struct address_space_operations affs_aops_ofs = { 792 .readpage = affs_readpage_ofs, 793 //.writepage = affs_writepage_ofs, 794 .write_begin = affs_write_begin_ofs, 795 .write_end = affs_write_end_ofs 796 }; 797 798 /* Free any preallocated blocks. */ 799 800 void 801 affs_free_prealloc(struct inode *inode) 802 { 803 struct super_block *sb = inode->i_sb; 804 805 pr_debug("AFFS: free_prealloc(ino=%lu)\n", inode->i_ino); 806 807 while (AFFS_I(inode)->i_pa_cnt) { 808 AFFS_I(inode)->i_pa_cnt--; 809 affs_free_block(sb, ++AFFS_I(inode)->i_lastalloc); 810 } 811 } 812 813 /* Truncate (or enlarge) a file to the requested size. */ 814 815 void 816 affs_truncate(struct inode *inode) 817 { 818 struct super_block *sb = inode->i_sb; 819 u32 ext, ext_key; 820 u32 last_blk, blkcnt, blk; 821 u32 size; 822 struct buffer_head *ext_bh; 823 int i; 824 825 pr_debug("AFFS: truncate(inode=%d, oldsize=%u, newsize=%u)\n", 826 (u32)inode->i_ino, (u32)AFFS_I(inode)->mmu_private, (u32)inode->i_size); 827 828 last_blk = 0; 829 ext = 0; 830 if (inode->i_size) { 831 last_blk = ((u32)inode->i_size - 1) / AFFS_SB(sb)->s_data_blksize; 832 ext = last_blk / AFFS_SB(sb)->s_hashsize; 833 } 834 835 if (inode->i_size > AFFS_I(inode)->mmu_private) { 836 struct address_space *mapping = inode->i_mapping; 837 struct page *page; 838 void *fsdata; 839 loff_t size = inode->i_size; 840 int res; 841 842 res = mapping->a_ops->write_begin(NULL, mapping, size, 0, 0, &page, &fsdata); 843 if (!res) 844 res = mapping->a_ops->write_end(NULL, mapping, size, 0, 0, page, fsdata); 845 else 846 inode->i_size = AFFS_I(inode)->mmu_private; 847 mark_inode_dirty(inode); 848 return; 849 } else if (inode->i_size == AFFS_I(inode)->mmu_private) 850 return; 851 852 // lock cache 853 ext_bh = affs_get_extblock(inode, ext); 854 if (IS_ERR(ext_bh)) { 855 affs_warning(sb, "truncate", "unexpected read error for ext block %u (%d)", 856 ext, PTR_ERR(ext_bh)); 857 return; 858 } 859 if (AFFS_I(inode)->i_lc) { 860 /* clear linear cache */ 861 i = (ext + 1) >> AFFS_I(inode)->i_lc_shift; 862 if (AFFS_I(inode)->i_lc_size > i) { 863 AFFS_I(inode)->i_lc_size = i; 864 for (; i < AFFS_LC_SIZE; i++) 865 AFFS_I(inode)->i_lc[i] = 0; 866 } 867 /* clear associative cache */ 868 for (i = 0; i < AFFS_AC_SIZE; i++) 869 if (AFFS_I(inode)->i_ac[i].ext >= ext) 870 AFFS_I(inode)->i_ac[i].ext = 0; 871 } 872 ext_key = be32_to_cpu(AFFS_TAIL(sb, ext_bh)->extension); 873 874 blkcnt = AFFS_I(inode)->i_blkcnt; 875 i = 0; 876 blk = last_blk; 877 if (inode->i_size) { 878 i = last_blk % AFFS_SB(sb)->s_hashsize + 1; 879 blk++; 880 } else 881 AFFS_HEAD(ext_bh)->first_data = 0; 882 AFFS_HEAD(ext_bh)->block_count = cpu_to_be32(i); 883 size = AFFS_SB(sb)->s_hashsize; 884 if (size > blkcnt - blk + i) 885 size = blkcnt - blk + i; 886 for (; i < size; i++, blk++) { 887 affs_free_block(sb, be32_to_cpu(AFFS_BLOCK(sb, ext_bh, i))); 888 AFFS_BLOCK(sb, ext_bh, i) = 0; 889 } 890 AFFS_TAIL(sb, ext_bh)->extension = 0; 891 affs_fix_checksum(sb, ext_bh); 892 mark_buffer_dirty_inode(ext_bh, inode); 893 affs_brelse(ext_bh); 894 895 if (inode->i_size) { 896 AFFS_I(inode)->i_blkcnt = last_blk + 1; 897 AFFS_I(inode)->i_extcnt = ext + 1; 898 if (AFFS_SB(sb)->s_flags & SF_OFS) { 899 struct buffer_head *bh = affs_bread_ino(inode, last_blk, 0); 900 u32 tmp; 901 if (IS_ERR(bh)) { 902 affs_warning(sb, "truncate", "unexpected read error for last block %u (%d)", 903 ext, PTR_ERR(bh)); 904 return; 905 } 906 tmp = be32_to_cpu(AFFS_DATA_HEAD(bh)->next); 907 AFFS_DATA_HEAD(bh)->next = 0; 908 affs_adjust_checksum(bh, -tmp); 909 affs_brelse(bh); 910 } 911 } else { 912 AFFS_I(inode)->i_blkcnt = 0; 913 AFFS_I(inode)->i_extcnt = 1; 914 } 915 AFFS_I(inode)->mmu_private = inode->i_size; 916 // unlock cache 917 918 while (ext_key) { 919 ext_bh = affs_bread(sb, ext_key); 920 size = AFFS_SB(sb)->s_hashsize; 921 if (size > blkcnt - blk) 922 size = blkcnt - blk; 923 for (i = 0; i < size; i++, blk++) 924 affs_free_block(sb, be32_to_cpu(AFFS_BLOCK(sb, ext_bh, i))); 925 affs_free_block(sb, ext_key); 926 ext_key = be32_to_cpu(AFFS_TAIL(sb, ext_bh)->extension); 927 affs_brelse(ext_bh); 928 } 929 affs_free_prealloc(inode); 930 } 931 932 int affs_file_fsync(struct file *filp, loff_t start, loff_t end, int datasync) 933 { 934 struct inode *inode = filp->f_mapping->host; 935 int ret, err; 936 937 err = filemap_write_and_wait_range(inode->i_mapping, start, end); 938 if (err) 939 return err; 940 941 mutex_lock(&inode->i_mutex); 942 ret = write_inode_now(inode, 0); 943 err = sync_blockdev(inode->i_sb->s_bdev); 944 if (!ret) 945 ret = err; 946 mutex_unlock(&inode->i_mutex); 947 return ret; 948 } 949