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