dir.c (28860B)
1// SPDX-License-Identifier: GPL-2.0-or-later 2/* 3 * Copyright (C) 2012-2013 Samsung Electronics Co., Ltd. 4 */ 5 6#include <linux/slab.h> 7#include <linux/compat.h> 8#include <linux/bio.h> 9#include <linux/buffer_head.h> 10 11#include "exfat_raw.h" 12#include "exfat_fs.h" 13 14static int exfat_extract_uni_name(struct exfat_dentry *ep, 15 unsigned short *uniname) 16{ 17 int i, len = 0; 18 19 for (i = 0; i < EXFAT_FILE_NAME_LEN; i++) { 20 *uniname = le16_to_cpu(ep->dentry.name.unicode_0_14[i]); 21 if (*uniname == 0x0) 22 return len; 23 uniname++; 24 len++; 25 } 26 27 *uniname = 0x0; 28 return len; 29 30} 31 32static void exfat_get_uniname_from_ext_entry(struct super_block *sb, 33 struct exfat_chain *p_dir, int entry, unsigned short *uniname) 34{ 35 int i; 36 struct exfat_entry_set_cache *es; 37 38 es = exfat_get_dentry_set(sb, p_dir, entry, ES_ALL_ENTRIES); 39 if (!es) 40 return; 41 42 /* 43 * First entry : file entry 44 * Second entry : stream-extension entry 45 * Third entry : first file-name entry 46 * So, the index of first file-name dentry should start from 2. 47 */ 48 for (i = 2; i < es->num_entries; i++) { 49 struct exfat_dentry *ep = exfat_get_dentry_cached(es, i); 50 51 /* end of name entry */ 52 if (exfat_get_entry_type(ep) != TYPE_EXTEND) 53 break; 54 55 exfat_extract_uni_name(ep, uniname); 56 uniname += EXFAT_FILE_NAME_LEN; 57 } 58 59 exfat_free_dentry_set(es, false); 60} 61 62/* read a directory entry from the opened directory */ 63static int exfat_readdir(struct inode *inode, loff_t *cpos, struct exfat_dir_entry *dir_entry) 64{ 65 int i, dentries_per_clu, dentries_per_clu_bits = 0, num_ext; 66 unsigned int type, clu_offset, max_dentries; 67 struct exfat_chain dir, clu; 68 struct exfat_uni_name uni_name; 69 struct exfat_dentry *ep; 70 struct super_block *sb = inode->i_sb; 71 struct exfat_sb_info *sbi = EXFAT_SB(sb); 72 struct exfat_inode_info *ei = EXFAT_I(inode); 73 unsigned int dentry = EXFAT_B_TO_DEN(*cpos) & 0xFFFFFFFF; 74 struct buffer_head *bh; 75 76 /* check if the given file ID is opened */ 77 if (ei->type != TYPE_DIR) 78 return -EPERM; 79 80 if (ei->entry == -1) 81 exfat_chain_set(&dir, sbi->root_dir, 0, ALLOC_FAT_CHAIN); 82 else 83 exfat_chain_set(&dir, ei->start_clu, 84 EXFAT_B_TO_CLU(i_size_read(inode), sbi), ei->flags); 85 86 dentries_per_clu = sbi->dentries_per_clu; 87 dentries_per_clu_bits = ilog2(dentries_per_clu); 88 max_dentries = (unsigned int)min_t(u64, MAX_EXFAT_DENTRIES, 89 (u64)sbi->num_clusters << dentries_per_clu_bits); 90 91 clu_offset = dentry >> dentries_per_clu_bits; 92 exfat_chain_dup(&clu, &dir); 93 94 if (clu.flags == ALLOC_NO_FAT_CHAIN) { 95 clu.dir += clu_offset; 96 clu.size -= clu_offset; 97 } else { 98 /* hint_information */ 99 if (clu_offset > 0 && ei->hint_bmap.off != EXFAT_EOF_CLUSTER && 100 ei->hint_bmap.off > 0 && clu_offset >= ei->hint_bmap.off) { 101 clu_offset -= ei->hint_bmap.off; 102 clu.dir = ei->hint_bmap.clu; 103 } 104 105 while (clu_offset > 0) { 106 if (exfat_get_next_cluster(sb, &(clu.dir))) 107 return -EIO; 108 109 clu_offset--; 110 } 111 } 112 113 while (clu.dir != EXFAT_EOF_CLUSTER && dentry < max_dentries) { 114 i = dentry & (dentries_per_clu - 1); 115 116 for ( ; i < dentries_per_clu; i++, dentry++) { 117 ep = exfat_get_dentry(sb, &clu, i, &bh); 118 if (!ep) 119 return -EIO; 120 121 type = exfat_get_entry_type(ep); 122 if (type == TYPE_UNUSED) { 123 brelse(bh); 124 break; 125 } 126 127 if (type != TYPE_FILE && type != TYPE_DIR) { 128 brelse(bh); 129 continue; 130 } 131 132 num_ext = ep->dentry.file.num_ext; 133 dir_entry->attr = le16_to_cpu(ep->dentry.file.attr); 134 exfat_get_entry_time(sbi, &dir_entry->crtime, 135 ep->dentry.file.create_tz, 136 ep->dentry.file.create_time, 137 ep->dentry.file.create_date, 138 ep->dentry.file.create_time_cs); 139 exfat_get_entry_time(sbi, &dir_entry->mtime, 140 ep->dentry.file.modify_tz, 141 ep->dentry.file.modify_time, 142 ep->dentry.file.modify_date, 143 ep->dentry.file.modify_time_cs); 144 exfat_get_entry_time(sbi, &dir_entry->atime, 145 ep->dentry.file.access_tz, 146 ep->dentry.file.access_time, 147 ep->dentry.file.access_date, 148 0); 149 150 *uni_name.name = 0x0; 151 exfat_get_uniname_from_ext_entry(sb, &clu, i, 152 uni_name.name); 153 exfat_utf16_to_nls(sb, &uni_name, 154 dir_entry->namebuf.lfn, 155 dir_entry->namebuf.lfnbuf_len); 156 brelse(bh); 157 158 ep = exfat_get_dentry(sb, &clu, i + 1, &bh); 159 if (!ep) 160 return -EIO; 161 dir_entry->size = 162 le64_to_cpu(ep->dentry.stream.valid_size); 163 dir_entry->entry = dentry; 164 brelse(bh); 165 166 ei->hint_bmap.off = dentry >> dentries_per_clu_bits; 167 ei->hint_bmap.clu = clu.dir; 168 169 *cpos = EXFAT_DEN_TO_B(dentry + 1 + num_ext); 170 return 0; 171 } 172 173 if (clu.flags == ALLOC_NO_FAT_CHAIN) { 174 if (--clu.size > 0) 175 clu.dir++; 176 else 177 clu.dir = EXFAT_EOF_CLUSTER; 178 } else { 179 if (exfat_get_next_cluster(sb, &(clu.dir))) 180 return -EIO; 181 } 182 } 183 184 dir_entry->namebuf.lfn[0] = '\0'; 185 *cpos = EXFAT_DEN_TO_B(dentry); 186 return 0; 187} 188 189static void exfat_init_namebuf(struct exfat_dentry_namebuf *nb) 190{ 191 nb->lfn = NULL; 192 nb->lfnbuf_len = 0; 193} 194 195static int exfat_alloc_namebuf(struct exfat_dentry_namebuf *nb) 196{ 197 nb->lfn = __getname(); 198 if (!nb->lfn) 199 return -ENOMEM; 200 nb->lfnbuf_len = MAX_VFSNAME_BUF_SIZE; 201 return 0; 202} 203 204static void exfat_free_namebuf(struct exfat_dentry_namebuf *nb) 205{ 206 if (!nb->lfn) 207 return; 208 209 __putname(nb->lfn); 210 exfat_init_namebuf(nb); 211} 212 213/* skip iterating emit_dots when dir is empty */ 214#define ITER_POS_FILLED_DOTS (2) 215static int exfat_iterate(struct file *filp, struct dir_context *ctx) 216{ 217 struct inode *inode = filp->f_path.dentry->d_inode; 218 struct super_block *sb = inode->i_sb; 219 struct inode *tmp; 220 struct exfat_dir_entry de; 221 struct exfat_dentry_namebuf *nb = &(de.namebuf); 222 struct exfat_inode_info *ei = EXFAT_I(inode); 223 unsigned long inum; 224 loff_t cpos, i_pos; 225 int err = 0, fake_offset = 0; 226 227 exfat_init_namebuf(nb); 228 mutex_lock(&EXFAT_SB(sb)->s_lock); 229 230 cpos = ctx->pos; 231 if (!dir_emit_dots(filp, ctx)) 232 goto unlock; 233 234 if (ctx->pos == ITER_POS_FILLED_DOTS) { 235 cpos = 0; 236 fake_offset = 1; 237 } 238 239 if (cpos & (DENTRY_SIZE - 1)) { 240 err = -ENOENT; 241 goto unlock; 242 } 243 244 /* name buffer should be allocated before use */ 245 err = exfat_alloc_namebuf(nb); 246 if (err) 247 goto unlock; 248get_new: 249 if (ei->flags == ALLOC_NO_FAT_CHAIN && cpos >= i_size_read(inode)) 250 goto end_of_dir; 251 252 err = exfat_readdir(inode, &cpos, &de); 253 if (err) { 254 /* 255 * At least we tried to read a sector. Move cpos to next sector 256 * position (should be aligned). 257 */ 258 if (err == -EIO) { 259 cpos += 1 << (sb->s_blocksize_bits); 260 cpos &= ~(sb->s_blocksize - 1); 261 } 262 263 err = -EIO; 264 goto end_of_dir; 265 } 266 267 if (!nb->lfn[0]) 268 goto end_of_dir; 269 270 i_pos = ((loff_t)ei->start_clu << 32) | (de.entry & 0xffffffff); 271 tmp = exfat_iget(sb, i_pos); 272 if (tmp) { 273 inum = tmp->i_ino; 274 iput(tmp); 275 } else { 276 inum = iunique(sb, EXFAT_ROOT_INO); 277 } 278 279 /* 280 * Before calling dir_emit(), sb_lock should be released. 281 * Because page fault can occur in dir_emit() when the size 282 * of buffer given from user is larger than one page size. 283 */ 284 mutex_unlock(&EXFAT_SB(sb)->s_lock); 285 if (!dir_emit(ctx, nb->lfn, strlen(nb->lfn), inum, 286 (de.attr & ATTR_SUBDIR) ? DT_DIR : DT_REG)) 287 goto out_unlocked; 288 mutex_lock(&EXFAT_SB(sb)->s_lock); 289 ctx->pos = cpos; 290 goto get_new; 291 292end_of_dir: 293 if (!cpos && fake_offset) 294 cpos = ITER_POS_FILLED_DOTS; 295 ctx->pos = cpos; 296unlock: 297 mutex_unlock(&EXFAT_SB(sb)->s_lock); 298out_unlocked: 299 /* 300 * To improve performance, free namebuf after unlock sb_lock. 301 * If namebuf is not allocated, this function do nothing 302 */ 303 exfat_free_namebuf(nb); 304 return err; 305} 306 307const struct file_operations exfat_dir_operations = { 308 .llseek = generic_file_llseek, 309 .read = generic_read_dir, 310 .iterate = exfat_iterate, 311 .unlocked_ioctl = exfat_ioctl, 312#ifdef CONFIG_COMPAT 313 .compat_ioctl = exfat_compat_ioctl, 314#endif 315 .fsync = exfat_file_fsync, 316}; 317 318int exfat_alloc_new_dir(struct inode *inode, struct exfat_chain *clu) 319{ 320 int ret; 321 322 exfat_chain_set(clu, EXFAT_EOF_CLUSTER, 0, ALLOC_NO_FAT_CHAIN); 323 324 ret = exfat_alloc_cluster(inode, 1, clu, IS_DIRSYNC(inode)); 325 if (ret) 326 return ret; 327 328 return exfat_zeroed_cluster(inode, clu->dir); 329} 330 331int exfat_calc_num_entries(struct exfat_uni_name *p_uniname) 332{ 333 int len; 334 335 len = p_uniname->name_len; 336 if (len == 0) 337 return -EINVAL; 338 339 /* 1 file entry + 1 stream entry + name entries */ 340 return ((len - 1) / EXFAT_FILE_NAME_LEN + 3); 341} 342 343unsigned int exfat_get_entry_type(struct exfat_dentry *ep) 344{ 345 if (ep->type == EXFAT_UNUSED) 346 return TYPE_UNUSED; 347 if (IS_EXFAT_DELETED(ep->type)) 348 return TYPE_DELETED; 349 if (ep->type == EXFAT_INVAL) 350 return TYPE_INVALID; 351 if (IS_EXFAT_CRITICAL_PRI(ep->type)) { 352 if (ep->type == EXFAT_BITMAP) 353 return TYPE_BITMAP; 354 if (ep->type == EXFAT_UPCASE) 355 return TYPE_UPCASE; 356 if (ep->type == EXFAT_VOLUME) 357 return TYPE_VOLUME; 358 if (ep->type == EXFAT_FILE) { 359 if (le16_to_cpu(ep->dentry.file.attr) & ATTR_SUBDIR) 360 return TYPE_DIR; 361 return TYPE_FILE; 362 } 363 return TYPE_CRITICAL_PRI; 364 } 365 if (IS_EXFAT_BENIGN_PRI(ep->type)) { 366 if (ep->type == EXFAT_GUID) 367 return TYPE_GUID; 368 if (ep->type == EXFAT_PADDING) 369 return TYPE_PADDING; 370 if (ep->type == EXFAT_ACLTAB) 371 return TYPE_ACLTAB; 372 return TYPE_BENIGN_PRI; 373 } 374 if (IS_EXFAT_CRITICAL_SEC(ep->type)) { 375 if (ep->type == EXFAT_STREAM) 376 return TYPE_STREAM; 377 if (ep->type == EXFAT_NAME) 378 return TYPE_EXTEND; 379 if (ep->type == EXFAT_ACL) 380 return TYPE_ACL; 381 return TYPE_CRITICAL_SEC; 382 } 383 return TYPE_BENIGN_SEC; 384} 385 386static void exfat_set_entry_type(struct exfat_dentry *ep, unsigned int type) 387{ 388 if (type == TYPE_UNUSED) { 389 ep->type = EXFAT_UNUSED; 390 } else if (type == TYPE_DELETED) { 391 ep->type &= EXFAT_DELETE; 392 } else if (type == TYPE_STREAM) { 393 ep->type = EXFAT_STREAM; 394 } else if (type == TYPE_EXTEND) { 395 ep->type = EXFAT_NAME; 396 } else if (type == TYPE_BITMAP) { 397 ep->type = EXFAT_BITMAP; 398 } else if (type == TYPE_UPCASE) { 399 ep->type = EXFAT_UPCASE; 400 } else if (type == TYPE_VOLUME) { 401 ep->type = EXFAT_VOLUME; 402 } else if (type == TYPE_DIR) { 403 ep->type = EXFAT_FILE; 404 ep->dentry.file.attr = cpu_to_le16(ATTR_SUBDIR); 405 } else if (type == TYPE_FILE) { 406 ep->type = EXFAT_FILE; 407 ep->dentry.file.attr = cpu_to_le16(ATTR_ARCHIVE); 408 } 409} 410 411static void exfat_init_stream_entry(struct exfat_dentry *ep, 412 unsigned char flags, unsigned int start_clu, 413 unsigned long long size) 414{ 415 exfat_set_entry_type(ep, TYPE_STREAM); 416 ep->dentry.stream.flags = flags; 417 ep->dentry.stream.start_clu = cpu_to_le32(start_clu); 418 ep->dentry.stream.valid_size = cpu_to_le64(size); 419 ep->dentry.stream.size = cpu_to_le64(size); 420} 421 422static void exfat_init_name_entry(struct exfat_dentry *ep, 423 unsigned short *uniname) 424{ 425 int i; 426 427 exfat_set_entry_type(ep, TYPE_EXTEND); 428 ep->dentry.name.flags = 0x0; 429 430 for (i = 0; i < EXFAT_FILE_NAME_LEN; i++) { 431 if (*uniname != 0x0) { 432 ep->dentry.name.unicode_0_14[i] = cpu_to_le16(*uniname); 433 uniname++; 434 } else { 435 ep->dentry.name.unicode_0_14[i] = 0x0; 436 } 437 } 438} 439 440int exfat_init_dir_entry(struct inode *inode, struct exfat_chain *p_dir, 441 int entry, unsigned int type, unsigned int start_clu, 442 unsigned long long size) 443{ 444 struct super_block *sb = inode->i_sb; 445 struct exfat_sb_info *sbi = EXFAT_SB(sb); 446 struct timespec64 ts = current_time(inode); 447 struct exfat_dentry *ep; 448 struct buffer_head *bh; 449 450 /* 451 * We cannot use exfat_get_dentry_set here because file ep is not 452 * initialized yet. 453 */ 454 ep = exfat_get_dentry(sb, p_dir, entry, &bh); 455 if (!ep) 456 return -EIO; 457 458 exfat_set_entry_type(ep, type); 459 exfat_set_entry_time(sbi, &ts, 460 &ep->dentry.file.create_tz, 461 &ep->dentry.file.create_time, 462 &ep->dentry.file.create_date, 463 &ep->dentry.file.create_time_cs); 464 exfat_set_entry_time(sbi, &ts, 465 &ep->dentry.file.modify_tz, 466 &ep->dentry.file.modify_time, 467 &ep->dentry.file.modify_date, 468 &ep->dentry.file.modify_time_cs); 469 exfat_set_entry_time(sbi, &ts, 470 &ep->dentry.file.access_tz, 471 &ep->dentry.file.access_time, 472 &ep->dentry.file.access_date, 473 NULL); 474 475 exfat_update_bh(bh, IS_DIRSYNC(inode)); 476 brelse(bh); 477 478 ep = exfat_get_dentry(sb, p_dir, entry + 1, &bh); 479 if (!ep) 480 return -EIO; 481 482 exfat_init_stream_entry(ep, 483 (type == TYPE_FILE) ? ALLOC_FAT_CHAIN : ALLOC_NO_FAT_CHAIN, 484 start_clu, size); 485 exfat_update_bh(bh, IS_DIRSYNC(inode)); 486 brelse(bh); 487 488 return 0; 489} 490 491int exfat_update_dir_chksum(struct inode *inode, struct exfat_chain *p_dir, 492 int entry) 493{ 494 struct super_block *sb = inode->i_sb; 495 int ret = 0; 496 int i, num_entries; 497 u16 chksum; 498 struct exfat_dentry *ep, *fep; 499 struct buffer_head *fbh, *bh; 500 501 fep = exfat_get_dentry(sb, p_dir, entry, &fbh); 502 if (!fep) 503 return -EIO; 504 505 num_entries = fep->dentry.file.num_ext + 1; 506 chksum = exfat_calc_chksum16(fep, DENTRY_SIZE, 0, CS_DIR_ENTRY); 507 508 for (i = 1; i < num_entries; i++) { 509 ep = exfat_get_dentry(sb, p_dir, entry + i, &bh); 510 if (!ep) { 511 ret = -EIO; 512 goto release_fbh; 513 } 514 chksum = exfat_calc_chksum16(ep, DENTRY_SIZE, chksum, 515 CS_DEFAULT); 516 brelse(bh); 517 } 518 519 fep->dentry.file.checksum = cpu_to_le16(chksum); 520 exfat_update_bh(fbh, IS_DIRSYNC(inode)); 521release_fbh: 522 brelse(fbh); 523 return ret; 524} 525 526int exfat_init_ext_entry(struct inode *inode, struct exfat_chain *p_dir, 527 int entry, int num_entries, struct exfat_uni_name *p_uniname) 528{ 529 struct super_block *sb = inode->i_sb; 530 int i; 531 unsigned short *uniname = p_uniname->name; 532 struct exfat_dentry *ep; 533 struct buffer_head *bh; 534 int sync = IS_DIRSYNC(inode); 535 536 ep = exfat_get_dentry(sb, p_dir, entry, &bh); 537 if (!ep) 538 return -EIO; 539 540 ep->dentry.file.num_ext = (unsigned char)(num_entries - 1); 541 exfat_update_bh(bh, sync); 542 brelse(bh); 543 544 ep = exfat_get_dentry(sb, p_dir, entry + 1, &bh); 545 if (!ep) 546 return -EIO; 547 548 ep->dentry.stream.name_len = p_uniname->name_len; 549 ep->dentry.stream.name_hash = cpu_to_le16(p_uniname->name_hash); 550 exfat_update_bh(bh, sync); 551 brelse(bh); 552 553 for (i = EXFAT_FIRST_CLUSTER; i < num_entries; i++) { 554 ep = exfat_get_dentry(sb, p_dir, entry + i, &bh); 555 if (!ep) 556 return -EIO; 557 558 exfat_init_name_entry(ep, uniname); 559 exfat_update_bh(bh, sync); 560 brelse(bh); 561 uniname += EXFAT_FILE_NAME_LEN; 562 } 563 564 exfat_update_dir_chksum(inode, p_dir, entry); 565 return 0; 566} 567 568int exfat_remove_entries(struct inode *inode, struct exfat_chain *p_dir, 569 int entry, int order, int num_entries) 570{ 571 struct super_block *sb = inode->i_sb; 572 int i; 573 struct exfat_dentry *ep; 574 struct buffer_head *bh; 575 576 for (i = order; i < num_entries; i++) { 577 ep = exfat_get_dentry(sb, p_dir, entry + i, &bh); 578 if (!ep) 579 return -EIO; 580 581 exfat_set_entry_type(ep, TYPE_DELETED); 582 exfat_update_bh(bh, IS_DIRSYNC(inode)); 583 brelse(bh); 584 } 585 586 return 0; 587} 588 589void exfat_update_dir_chksum_with_entry_set(struct exfat_entry_set_cache *es) 590{ 591 int chksum_type = CS_DIR_ENTRY, i; 592 unsigned short chksum = 0; 593 struct exfat_dentry *ep; 594 595 for (i = 0; i < es->num_entries; i++) { 596 ep = exfat_get_dentry_cached(es, i); 597 chksum = exfat_calc_chksum16(ep, DENTRY_SIZE, chksum, 598 chksum_type); 599 chksum_type = CS_DEFAULT; 600 } 601 ep = exfat_get_dentry_cached(es, 0); 602 ep->dentry.file.checksum = cpu_to_le16(chksum); 603 es->modified = true; 604} 605 606int exfat_free_dentry_set(struct exfat_entry_set_cache *es, int sync) 607{ 608 int i, err = 0; 609 610 if (es->modified) 611 err = exfat_update_bhs(es->bh, es->num_bh, sync); 612 613 for (i = 0; i < es->num_bh; i++) 614 if (err) 615 bforget(es->bh[i]); 616 else 617 brelse(es->bh[i]); 618 kfree(es); 619 return err; 620} 621 622static int exfat_walk_fat_chain(struct super_block *sb, 623 struct exfat_chain *p_dir, unsigned int byte_offset, 624 unsigned int *clu) 625{ 626 struct exfat_sb_info *sbi = EXFAT_SB(sb); 627 unsigned int clu_offset; 628 unsigned int cur_clu; 629 630 clu_offset = EXFAT_B_TO_CLU(byte_offset, sbi); 631 cur_clu = p_dir->dir; 632 633 if (p_dir->flags == ALLOC_NO_FAT_CHAIN) { 634 cur_clu += clu_offset; 635 } else { 636 while (clu_offset > 0) { 637 if (exfat_get_next_cluster(sb, &cur_clu)) 638 return -EIO; 639 if (cur_clu == EXFAT_EOF_CLUSTER) { 640 exfat_fs_error(sb, 641 "invalid dentry access beyond EOF (clu : %u, eidx : %d)", 642 p_dir->dir, 643 EXFAT_B_TO_DEN(byte_offset)); 644 return -EIO; 645 } 646 clu_offset--; 647 } 648 } 649 650 *clu = cur_clu; 651 return 0; 652} 653 654static int exfat_find_location(struct super_block *sb, struct exfat_chain *p_dir, 655 int entry, sector_t *sector, int *offset) 656{ 657 int ret; 658 unsigned int off, clu = 0; 659 struct exfat_sb_info *sbi = EXFAT_SB(sb); 660 661 off = EXFAT_DEN_TO_B(entry); 662 663 ret = exfat_walk_fat_chain(sb, p_dir, off, &clu); 664 if (ret) 665 return ret; 666 667 /* byte offset in cluster */ 668 off = EXFAT_CLU_OFFSET(off, sbi); 669 670 /* byte offset in sector */ 671 *offset = EXFAT_BLK_OFFSET(off, sb); 672 673 /* sector offset in cluster */ 674 *sector = EXFAT_B_TO_BLK(off, sb); 675 *sector += exfat_cluster_to_sector(sbi, clu); 676 return 0; 677} 678 679#define EXFAT_MAX_RA_SIZE (128*1024) 680static int exfat_dir_readahead(struct super_block *sb, sector_t sec) 681{ 682 struct exfat_sb_info *sbi = EXFAT_SB(sb); 683 struct buffer_head *bh; 684 unsigned int max_ra_count = EXFAT_MAX_RA_SIZE >> sb->s_blocksize_bits; 685 unsigned int page_ra_count = PAGE_SIZE >> sb->s_blocksize_bits; 686 unsigned int adj_ra_count = max(sbi->sect_per_clus, page_ra_count); 687 unsigned int ra_count = min(adj_ra_count, max_ra_count); 688 689 /* Read-ahead is not required */ 690 if (sbi->sect_per_clus == 1) 691 return 0; 692 693 if (sec < sbi->data_start_sector) { 694 exfat_err(sb, "requested sector is invalid(sect:%llu, root:%llu)", 695 (unsigned long long)sec, sbi->data_start_sector); 696 return -EIO; 697 } 698 699 /* Not sector aligned with ra_count, resize ra_count to page size */ 700 if ((sec - sbi->data_start_sector) & (ra_count - 1)) 701 ra_count = page_ra_count; 702 703 bh = sb_find_get_block(sb, sec); 704 if (!bh || !buffer_uptodate(bh)) { 705 unsigned int i; 706 707 for (i = 0; i < ra_count; i++) 708 sb_breadahead(sb, (sector_t)(sec + i)); 709 } 710 brelse(bh); 711 return 0; 712} 713 714struct exfat_dentry *exfat_get_dentry(struct super_block *sb, 715 struct exfat_chain *p_dir, int entry, struct buffer_head **bh) 716{ 717 unsigned int dentries_per_page = EXFAT_B_TO_DEN(PAGE_SIZE); 718 int off; 719 sector_t sec; 720 721 if (p_dir->dir == DIR_DELETED) { 722 exfat_err(sb, "abnormal access to deleted dentry"); 723 return NULL; 724 } 725 726 if (exfat_find_location(sb, p_dir, entry, &sec, &off)) 727 return NULL; 728 729 if (p_dir->dir != EXFAT_FREE_CLUSTER && 730 !(entry & (dentries_per_page - 1))) 731 exfat_dir_readahead(sb, sec); 732 733 *bh = sb_bread(sb, sec); 734 if (!*bh) 735 return NULL; 736 737 return (struct exfat_dentry *)((*bh)->b_data + off); 738} 739 740enum exfat_validate_dentry_mode { 741 ES_MODE_STARTED, 742 ES_MODE_GET_FILE_ENTRY, 743 ES_MODE_GET_STRM_ENTRY, 744 ES_MODE_GET_NAME_ENTRY, 745 ES_MODE_GET_CRITICAL_SEC_ENTRY, 746}; 747 748static bool exfat_validate_entry(unsigned int type, 749 enum exfat_validate_dentry_mode *mode) 750{ 751 if (type == TYPE_UNUSED || type == TYPE_DELETED) 752 return false; 753 754 switch (*mode) { 755 case ES_MODE_STARTED: 756 if (type != TYPE_FILE && type != TYPE_DIR) 757 return false; 758 *mode = ES_MODE_GET_FILE_ENTRY; 759 return true; 760 case ES_MODE_GET_FILE_ENTRY: 761 if (type != TYPE_STREAM) 762 return false; 763 *mode = ES_MODE_GET_STRM_ENTRY; 764 return true; 765 case ES_MODE_GET_STRM_ENTRY: 766 if (type != TYPE_EXTEND) 767 return false; 768 *mode = ES_MODE_GET_NAME_ENTRY; 769 return true; 770 case ES_MODE_GET_NAME_ENTRY: 771 if (type == TYPE_STREAM) 772 return false; 773 if (type != TYPE_EXTEND) { 774 if (!(type & TYPE_CRITICAL_SEC)) 775 return false; 776 *mode = ES_MODE_GET_CRITICAL_SEC_ENTRY; 777 } 778 return true; 779 case ES_MODE_GET_CRITICAL_SEC_ENTRY: 780 if (type == TYPE_EXTEND || type == TYPE_STREAM) 781 return false; 782 if ((type & TYPE_CRITICAL_SEC) != TYPE_CRITICAL_SEC) 783 return false; 784 return true; 785 default: 786 WARN_ON_ONCE(1); 787 return false; 788 } 789} 790 791struct exfat_dentry *exfat_get_dentry_cached( 792 struct exfat_entry_set_cache *es, int num) 793{ 794 int off = es->start_off + num * DENTRY_SIZE; 795 struct buffer_head *bh = es->bh[EXFAT_B_TO_BLK(off, es->sb)]; 796 char *p = bh->b_data + EXFAT_BLK_OFFSET(off, es->sb); 797 798 return (struct exfat_dentry *)p; 799} 800 801/* 802 * Returns a set of dentries for a file or dir. 803 * 804 * Note It provides a direct pointer to bh->data via exfat_get_dentry_cached(). 805 * User should call exfat_get_dentry_set() after setting 'modified' to apply 806 * changes made in this entry set to the real device. 807 * 808 * in: 809 * sb+p_dir+entry: indicates a file/dir 810 * type: specifies how many dentries should be included. 811 * return: 812 * pointer of entry set on success, 813 * NULL on failure. 814 */ 815struct exfat_entry_set_cache *exfat_get_dentry_set(struct super_block *sb, 816 struct exfat_chain *p_dir, int entry, unsigned int type) 817{ 818 int ret, i, num_bh; 819 unsigned int off, byte_offset, clu = 0; 820 sector_t sec; 821 struct exfat_sb_info *sbi = EXFAT_SB(sb); 822 struct exfat_entry_set_cache *es; 823 struct exfat_dentry *ep; 824 int num_entries; 825 enum exfat_validate_dentry_mode mode = ES_MODE_STARTED; 826 struct buffer_head *bh; 827 828 if (p_dir->dir == DIR_DELETED) { 829 exfat_err(sb, "access to deleted dentry"); 830 return NULL; 831 } 832 833 byte_offset = EXFAT_DEN_TO_B(entry); 834 ret = exfat_walk_fat_chain(sb, p_dir, byte_offset, &clu); 835 if (ret) 836 return NULL; 837 838 es = kzalloc(sizeof(*es), GFP_KERNEL); 839 if (!es) 840 return NULL; 841 es->sb = sb; 842 es->modified = false; 843 844 /* byte offset in cluster */ 845 byte_offset = EXFAT_CLU_OFFSET(byte_offset, sbi); 846 847 /* byte offset in sector */ 848 off = EXFAT_BLK_OFFSET(byte_offset, sb); 849 es->start_off = off; 850 851 /* sector offset in cluster */ 852 sec = EXFAT_B_TO_BLK(byte_offset, sb); 853 sec += exfat_cluster_to_sector(sbi, clu); 854 855 bh = sb_bread(sb, sec); 856 if (!bh) 857 goto free_es; 858 es->bh[es->num_bh++] = bh; 859 860 ep = exfat_get_dentry_cached(es, 0); 861 if (!exfat_validate_entry(exfat_get_entry_type(ep), &mode)) 862 goto free_es; 863 864 num_entries = type == ES_ALL_ENTRIES ? 865 ep->dentry.file.num_ext + 1 : type; 866 es->num_entries = num_entries; 867 868 num_bh = EXFAT_B_TO_BLK_ROUND_UP(off + num_entries * DENTRY_SIZE, sb); 869 for (i = 1; i < num_bh; i++) { 870 /* get the next sector */ 871 if (exfat_is_last_sector_in_cluster(sbi, sec)) { 872 if (p_dir->flags == ALLOC_NO_FAT_CHAIN) 873 clu++; 874 else if (exfat_get_next_cluster(sb, &clu)) 875 goto free_es; 876 sec = exfat_cluster_to_sector(sbi, clu); 877 } else { 878 sec++; 879 } 880 881 bh = sb_bread(sb, sec); 882 if (!bh) 883 goto free_es; 884 es->bh[es->num_bh++] = bh; 885 } 886 887 /* validate cached dentries */ 888 for (i = 1; i < num_entries; i++) { 889 ep = exfat_get_dentry_cached(es, i); 890 if (!exfat_validate_entry(exfat_get_entry_type(ep), &mode)) 891 goto free_es; 892 } 893 return es; 894 895free_es: 896 exfat_free_dentry_set(es, false); 897 return NULL; 898} 899 900enum { 901 DIRENT_STEP_FILE, 902 DIRENT_STEP_STRM, 903 DIRENT_STEP_NAME, 904 DIRENT_STEP_SECD, 905}; 906 907/* 908 * @ei: inode info of parent directory 909 * @p_dir: directory structure of parent directory 910 * @num_entries:entry size of p_uniname 911 * @hint_opt: If p_uniname is found, filled with optimized dir/entry 912 * for traversing cluster chain. 913 * @return: 914 * >= 0: file directory entry position where the name exists 915 * -ENOENT: entry with the name does not exist 916 * -EIO: I/O error 917 */ 918int exfat_find_dir_entry(struct super_block *sb, struct exfat_inode_info *ei, 919 struct exfat_chain *p_dir, struct exfat_uni_name *p_uniname, 920 int num_entries, unsigned int type, struct exfat_hint *hint_opt) 921{ 922 int i, rewind = 0, dentry = 0, end_eidx = 0, num_ext = 0, len; 923 int order, step, name_len = 0; 924 int dentries_per_clu, num_empty = 0; 925 unsigned int entry_type; 926 unsigned short *uniname = NULL; 927 struct exfat_chain clu; 928 struct exfat_hint *hint_stat = &ei->hint_stat; 929 struct exfat_hint_femp candi_empty; 930 struct exfat_sb_info *sbi = EXFAT_SB(sb); 931 932 dentries_per_clu = sbi->dentries_per_clu; 933 934 exfat_chain_dup(&clu, p_dir); 935 936 if (hint_stat->eidx) { 937 clu.dir = hint_stat->clu; 938 dentry = hint_stat->eidx; 939 end_eidx = dentry; 940 } 941 942 candi_empty.eidx = EXFAT_HINT_NONE; 943rewind: 944 order = 0; 945 step = DIRENT_STEP_FILE; 946 while (clu.dir != EXFAT_EOF_CLUSTER) { 947 i = dentry & (dentries_per_clu - 1); 948 for (; i < dentries_per_clu; i++, dentry++) { 949 struct exfat_dentry *ep; 950 struct buffer_head *bh; 951 952 if (rewind && dentry == end_eidx) 953 goto not_found; 954 955 ep = exfat_get_dentry(sb, &clu, i, &bh); 956 if (!ep) 957 return -EIO; 958 959 entry_type = exfat_get_entry_type(ep); 960 961 if (entry_type == TYPE_UNUSED || 962 entry_type == TYPE_DELETED) { 963 step = DIRENT_STEP_FILE; 964 965 num_empty++; 966 if (candi_empty.eidx == EXFAT_HINT_NONE && 967 num_empty == 1) { 968 exfat_chain_set(&candi_empty.cur, 969 clu.dir, clu.size, clu.flags); 970 } 971 972 if (candi_empty.eidx == EXFAT_HINT_NONE && 973 num_empty >= num_entries) { 974 candi_empty.eidx = 975 dentry - (num_empty - 1); 976 WARN_ON(candi_empty.eidx < 0); 977 candi_empty.count = num_empty; 978 979 if (ei->hint_femp.eidx == 980 EXFAT_HINT_NONE || 981 candi_empty.eidx <= 982 ei->hint_femp.eidx) 983 ei->hint_femp = candi_empty; 984 } 985 986 brelse(bh); 987 if (entry_type == TYPE_UNUSED) 988 goto not_found; 989 continue; 990 } 991 992 num_empty = 0; 993 candi_empty.eidx = EXFAT_HINT_NONE; 994 995 if (entry_type == TYPE_FILE || entry_type == TYPE_DIR) { 996 step = DIRENT_STEP_FILE; 997 hint_opt->clu = clu.dir; 998 hint_opt->eidx = i; 999 if (type == TYPE_ALL || type == entry_type) { 1000 num_ext = ep->dentry.file.num_ext; 1001 step = DIRENT_STEP_STRM; 1002 } 1003 brelse(bh); 1004 continue; 1005 } 1006 1007 if (entry_type == TYPE_STREAM) { 1008 u16 name_hash; 1009 1010 if (step != DIRENT_STEP_STRM) { 1011 step = DIRENT_STEP_FILE; 1012 brelse(bh); 1013 continue; 1014 } 1015 step = DIRENT_STEP_FILE; 1016 name_hash = le16_to_cpu( 1017 ep->dentry.stream.name_hash); 1018 if (p_uniname->name_hash == name_hash && 1019 p_uniname->name_len == 1020 ep->dentry.stream.name_len) { 1021 step = DIRENT_STEP_NAME; 1022 order = 1; 1023 name_len = 0; 1024 } 1025 brelse(bh); 1026 continue; 1027 } 1028 1029 brelse(bh); 1030 if (entry_type == TYPE_EXTEND) { 1031 unsigned short entry_uniname[16], unichar; 1032 1033 if (step != DIRENT_STEP_NAME) { 1034 step = DIRENT_STEP_FILE; 1035 continue; 1036 } 1037 1038 if (++order == 2) 1039 uniname = p_uniname->name; 1040 else 1041 uniname += EXFAT_FILE_NAME_LEN; 1042 1043 len = exfat_extract_uni_name(ep, entry_uniname); 1044 name_len += len; 1045 1046 unichar = *(uniname+len); 1047 *(uniname+len) = 0x0; 1048 1049 if (exfat_uniname_ncmp(sb, uniname, 1050 entry_uniname, len)) { 1051 step = DIRENT_STEP_FILE; 1052 } else if (p_uniname->name_len == name_len) { 1053 if (order == num_ext) 1054 goto found; 1055 step = DIRENT_STEP_SECD; 1056 } 1057 1058 *(uniname+len) = unichar; 1059 continue; 1060 } 1061 1062 if (entry_type & 1063 (TYPE_CRITICAL_SEC | TYPE_BENIGN_SEC)) { 1064 if (step == DIRENT_STEP_SECD) { 1065 if (++order == num_ext) 1066 goto found; 1067 continue; 1068 } 1069 } 1070 step = DIRENT_STEP_FILE; 1071 } 1072 1073 if (clu.flags == ALLOC_NO_FAT_CHAIN) { 1074 if (--clu.size > 0) 1075 clu.dir++; 1076 else 1077 clu.dir = EXFAT_EOF_CLUSTER; 1078 } else { 1079 if (exfat_get_next_cluster(sb, &clu.dir)) 1080 return -EIO; 1081 } 1082 } 1083 1084not_found: 1085 /* 1086 * We started at not 0 index,so we should try to find target 1087 * from 0 index to the index we started at. 1088 */ 1089 if (!rewind && end_eidx) { 1090 rewind = 1; 1091 dentry = 0; 1092 clu.dir = p_dir->dir; 1093 /* reset empty hint */ 1094 num_empty = 0; 1095 candi_empty.eidx = EXFAT_HINT_NONE; 1096 goto rewind; 1097 } 1098 1099 /* initialized hint_stat */ 1100 hint_stat->clu = p_dir->dir; 1101 hint_stat->eidx = 0; 1102 return -ENOENT; 1103 1104found: 1105 /* next dentry we'll find is out of this cluster */ 1106 if (!((dentry + 1) & (dentries_per_clu - 1))) { 1107 int ret = 0; 1108 1109 if (clu.flags == ALLOC_NO_FAT_CHAIN) { 1110 if (--clu.size > 0) 1111 clu.dir++; 1112 else 1113 clu.dir = EXFAT_EOF_CLUSTER; 1114 } else { 1115 ret = exfat_get_next_cluster(sb, &clu.dir); 1116 } 1117 1118 if (ret || clu.dir == EXFAT_EOF_CLUSTER) { 1119 /* just initialized hint_stat */ 1120 hint_stat->clu = p_dir->dir; 1121 hint_stat->eidx = 0; 1122 return (dentry - num_ext); 1123 } 1124 } 1125 1126 hint_stat->clu = clu.dir; 1127 hint_stat->eidx = dentry + 1; 1128 return dentry - num_ext; 1129} 1130 1131int exfat_count_ext_entries(struct super_block *sb, struct exfat_chain *p_dir, 1132 int entry, struct exfat_dentry *ep) 1133{ 1134 int i, count = 0; 1135 unsigned int type; 1136 struct exfat_dentry *ext_ep; 1137 struct buffer_head *bh; 1138 1139 for (i = 0, entry++; i < ep->dentry.file.num_ext; i++, entry++) { 1140 ext_ep = exfat_get_dentry(sb, p_dir, entry, &bh); 1141 if (!ext_ep) 1142 return -EIO; 1143 1144 type = exfat_get_entry_type(ext_ep); 1145 brelse(bh); 1146 if (type == TYPE_EXTEND || type == TYPE_STREAM) 1147 count++; 1148 else 1149 break; 1150 } 1151 return count; 1152} 1153 1154int exfat_count_dir_entries(struct super_block *sb, struct exfat_chain *p_dir) 1155{ 1156 int i, count = 0; 1157 int dentries_per_clu; 1158 unsigned int entry_type; 1159 struct exfat_chain clu; 1160 struct exfat_dentry *ep; 1161 struct exfat_sb_info *sbi = EXFAT_SB(sb); 1162 struct buffer_head *bh; 1163 1164 dentries_per_clu = sbi->dentries_per_clu; 1165 1166 exfat_chain_dup(&clu, p_dir); 1167 1168 while (clu.dir != EXFAT_EOF_CLUSTER) { 1169 for (i = 0; i < dentries_per_clu; i++) { 1170 ep = exfat_get_dentry(sb, &clu, i, &bh); 1171 if (!ep) 1172 return -EIO; 1173 entry_type = exfat_get_entry_type(ep); 1174 brelse(bh); 1175 1176 if (entry_type == TYPE_UNUSED) 1177 return count; 1178 if (entry_type != TYPE_DIR) 1179 continue; 1180 count++; 1181 } 1182 1183 if (clu.flags == ALLOC_NO_FAT_CHAIN) { 1184 if (--clu.size > 0) 1185 clu.dir++; 1186 else 1187 clu.dir = EXFAT_EOF_CLUSTER; 1188 } else { 1189 if (exfat_get_next_cluster(sb, &(clu.dir))) 1190 return -EIO; 1191 } 1192 } 1193 1194 return count; 1195}