linux/fs/exfat/dir.c
<<
>>
Prefs
   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}
1196