* [android-common:android14-kiwi-6.1 180/180] fs/jfs/jfs_dtree.c:2894 jfs_readdir() warn: impossible condition '(stbl[i] > 127) => (0-127 > 127)'
@ 2026-07-11 22:31 kernel test robot
0 siblings, 0 replies; only message in thread
From: kernel test robot @ 2026-07-11 22:31 UTC (permalink / raw)
To: oe-kbuild; +Cc: lkp, Dan Carpenter
BCC: lkp@intel.com
CC: oe-kbuild-all@lists.linux.dev
TO: cros-kernel-buildreports@googlegroups.com
tree: https://android.googlesource.com/kernel/common android14-kiwi-6.1
head: 1517b793772a02ed13258dd27cd6ac22fe27c5a6
commit: ff9fc48fab0e1ea0d423c23c99b91bba178f0b05 [180/180] jfs: fix array-index-out-of-bounds in jfs_readdir
:::::: branch date: 22 hours ago
:::::: commit date: 1 year, 7 months ago
config: x86_64-randconfig-161-20260708 (https://download.01.org/0day-ci/archive/20260712/202607120604.PssO3RAp-lkp@intel.com/config)
compiler: gcc-14 (Debian 14.2.0-19) 14.2.0
smatch: v0.5.0-9185-gbcc58b9c
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Reported-by: Dan Carpenter <error27@gmail.com>
| Closes: https://lore.kernel.org/r/202607120604.PssO3RAp-lkp@intel.com/
New smatch warnings:
fs/jfs/jfs_dtree.c:2894 jfs_readdir() warn: impossible condition '(stbl[i] > 127) => (0-127 > 127)'
Old smatch warnings:
fs/jfs/jfs_dtree.c:3098 dtReadFirst() warn: impossible condition '(stbl[0] > 127) => (0-127 > 127)'
vim +2894 fs/jfs/jfs_dtree.c
^1da177e4c3f415 Linus Torvalds 2005-04-16 2690
^1da177e4c3f415 Linus Torvalds 2005-04-16 2691 /*
^1da177e4c3f415 Linus Torvalds 2005-04-16 2692 * jfs_readdir()
^1da177e4c3f415 Linus Torvalds 2005-04-16 2693 *
^1da177e4c3f415 Linus Torvalds 2005-04-16 2694 * function: read directory entries sequentially
^1da177e4c3f415 Linus Torvalds 2005-04-16 2695 * from the specified entry offset
^1da177e4c3f415 Linus Torvalds 2005-04-16 2696 *
^1da177e4c3f415 Linus Torvalds 2005-04-16 2697 * parameter:
^1da177e4c3f415 Linus Torvalds 2005-04-16 2698 *
^1da177e4c3f415 Linus Torvalds 2005-04-16 2699 * return: offset = (pn, index) of start entry
^1da177e4c3f415 Linus Torvalds 2005-04-16 2700 * of next jfs_readdir()/dtRead()
^1da177e4c3f415 Linus Torvalds 2005-04-16 2701 */
070a0ebf42e15c9 Al Viro 2013-05-17 2702 int jfs_readdir(struct file *file, struct dir_context *ctx)
^1da177e4c3f415 Linus Torvalds 2005-04-16 2703 {
070a0ebf42e15c9 Al Viro 2013-05-17 2704 struct inode *ip = file_inode(file);
^1da177e4c3f415 Linus Torvalds 2005-04-16 2705 struct nls_table *codepage = JFS_SBI(ip->i_sb)->nls_tab;
^1da177e4c3f415 Linus Torvalds 2005-04-16 2706 int rc = 0;
^1da177e4c3f415 Linus Torvalds 2005-04-16 2707 loff_t dtpos; /* legacy OS/2 style position */
^1da177e4c3f415 Linus Torvalds 2005-04-16 2708 struct dtoffset {
^1da177e4c3f415 Linus Torvalds 2005-04-16 2709 s16 pn;
^1da177e4c3f415 Linus Torvalds 2005-04-16 2710 s16 index;
^1da177e4c3f415 Linus Torvalds 2005-04-16 2711 s32 unused;
^1da177e4c3f415 Linus Torvalds 2005-04-16 2712 } *dtoffset = (struct dtoffset *) &dtpos;
^1da177e4c3f415 Linus Torvalds 2005-04-16 2713 s64 bn;
^1da177e4c3f415 Linus Torvalds 2005-04-16 2714 struct metapage *mp;
^1da177e4c3f415 Linus Torvalds 2005-04-16 2715 dtpage_t *p;
^1da177e4c3f415 Linus Torvalds 2005-04-16 2716 int index;
^1da177e4c3f415 Linus Torvalds 2005-04-16 2717 s8 *stbl;
^1da177e4c3f415 Linus Torvalds 2005-04-16 2718 struct btstack btstack;
^1da177e4c3f415 Linus Torvalds 2005-04-16 2719 int i, next;
^1da177e4c3f415 Linus Torvalds 2005-04-16 2720 struct ldtentry *d;
^1da177e4c3f415 Linus Torvalds 2005-04-16 2721 struct dtslot *t;
^1da177e4c3f415 Linus Torvalds 2005-04-16 2722 int d_namleft, len, outlen;
^1da177e4c3f415 Linus Torvalds 2005-04-16 2723 unsigned long dirent_buf;
^1da177e4c3f415 Linus Torvalds 2005-04-16 2724 char *name_ptr;
^1da177e4c3f415 Linus Torvalds 2005-04-16 2725 u32 dir_index;
^1da177e4c3f415 Linus Torvalds 2005-04-16 2726 int do_index = 0;
^1da177e4c3f415 Linus Torvalds 2005-04-16 2727 uint loop_count = 0;
^1da177e4c3f415 Linus Torvalds 2005-04-16 2728 struct jfs_dirent *jfs_dirent;
^1da177e4c3f415 Linus Torvalds 2005-04-16 2729 int jfs_dirents;
^1da177e4c3f415 Linus Torvalds 2005-04-16 2730 int overflow, fix_page, page_fixed = 0;
^1da177e4c3f415 Linus Torvalds 2005-04-16 2731 static int unique_pos = 2; /* If we can't fix broken index */
^1da177e4c3f415 Linus Torvalds 2005-04-16 2732
070a0ebf42e15c9 Al Viro 2013-05-17 2733 if (ctx->pos == DIREND)
^1da177e4c3f415 Linus Torvalds 2005-04-16 2734 return 0;
^1da177e4c3f415 Linus Torvalds 2005-04-16 2735
^1da177e4c3f415 Linus Torvalds 2005-04-16 2736 if (DO_INDEX(ip)) {
^1da177e4c3f415 Linus Torvalds 2005-04-16 2737 /*
^1da177e4c3f415 Linus Torvalds 2005-04-16 2738 * persistent index is stored in directory entries.
^1da177e4c3f415 Linus Torvalds 2005-04-16 2739 * Special cases: 0 = .
^1da177e4c3f415 Linus Torvalds 2005-04-16 2740 * 1 = ..
^1da177e4c3f415 Linus Torvalds 2005-04-16 2741 * -1 = End of directory
^1da177e4c3f415 Linus Torvalds 2005-04-16 2742 */
^1da177e4c3f415 Linus Torvalds 2005-04-16 2743 do_index = 1;
^1da177e4c3f415 Linus Torvalds 2005-04-16 2744
070a0ebf42e15c9 Al Viro 2013-05-17 2745 dir_index = (u32) ctx->pos;
^1da177e4c3f415 Linus Torvalds 2005-04-16 2746
44512449c0ab368 Dave Kleikamp 2013-08-15 2747 /*
44512449c0ab368 Dave Kleikamp 2013-08-15 2748 * NFSv4 reserves cookies 1 and 2 for . and .. so the value
44512449c0ab368 Dave Kleikamp 2013-08-15 2749 * we return to the vfs is one greater than the one we use
44512449c0ab368 Dave Kleikamp 2013-08-15 2750 * internally.
44512449c0ab368 Dave Kleikamp 2013-08-15 2751 */
44512449c0ab368 Dave Kleikamp 2013-08-15 2752 if (dir_index)
44512449c0ab368 Dave Kleikamp 2013-08-15 2753 dir_index--;
44512449c0ab368 Dave Kleikamp 2013-08-15 2754
^1da177e4c3f415 Linus Torvalds 2005-04-16 2755 if (dir_index > 1) {
^1da177e4c3f415 Linus Torvalds 2005-04-16 2756 struct dir_table_slot dirtab_slot;
^1da177e4c3f415 Linus Torvalds 2005-04-16 2757
^1da177e4c3f415 Linus Torvalds 2005-04-16 2758 if (dtEmpty(ip) ||
^1da177e4c3f415 Linus Torvalds 2005-04-16 2759 (dir_index >= JFS_IP(ip)->next_index)) {
^1da177e4c3f415 Linus Torvalds 2005-04-16 2760 /* Stale position. Directory has shrunk */
070a0ebf42e15c9 Al Viro 2013-05-17 2761 ctx->pos = DIREND;
^1da177e4c3f415 Linus Torvalds 2005-04-16 2762 return 0;
^1da177e4c3f415 Linus Torvalds 2005-04-16 2763 }
^1da177e4c3f415 Linus Torvalds 2005-04-16 2764 repeat:
^1da177e4c3f415 Linus Torvalds 2005-04-16 2765 rc = read_index(ip, dir_index, &dirtab_slot);
^1da177e4c3f415 Linus Torvalds 2005-04-16 2766 if (rc) {
070a0ebf42e15c9 Al Viro 2013-05-17 2767 ctx->pos = DIREND;
^1da177e4c3f415 Linus Torvalds 2005-04-16 2768 return rc;
^1da177e4c3f415 Linus Torvalds 2005-04-16 2769 }
^1da177e4c3f415 Linus Torvalds 2005-04-16 2770 if (dirtab_slot.flag == DIR_INDEX_FREE) {
^1da177e4c3f415 Linus Torvalds 2005-04-16 2771 if (loop_count++ > JFS_IP(ip)->next_index) {
6ed71e9819ac341 Joe Perches 2016-03-30 2772 jfs_err("jfs_readdir detected infinite loop!");
070a0ebf42e15c9 Al Viro 2013-05-17 2773 ctx->pos = DIREND;
^1da177e4c3f415 Linus Torvalds 2005-04-16 2774 return 0;
^1da177e4c3f415 Linus Torvalds 2005-04-16 2775 }
^1da177e4c3f415 Linus Torvalds 2005-04-16 2776 dir_index = le32_to_cpu(dirtab_slot.addr2);
^1da177e4c3f415 Linus Torvalds 2005-04-16 2777 if (dir_index == -1) {
070a0ebf42e15c9 Al Viro 2013-05-17 2778 ctx->pos = DIREND;
^1da177e4c3f415 Linus Torvalds 2005-04-16 2779 return 0;
^1da177e4c3f415 Linus Torvalds 2005-04-16 2780 }
^1da177e4c3f415 Linus Torvalds 2005-04-16 2781 goto repeat;
^1da177e4c3f415 Linus Torvalds 2005-04-16 2782 }
^1da177e4c3f415 Linus Torvalds 2005-04-16 2783 bn = addressDTS(&dirtab_slot);
^1da177e4c3f415 Linus Torvalds 2005-04-16 2784 index = dirtab_slot.slot;
^1da177e4c3f415 Linus Torvalds 2005-04-16 2785 DT_GETPAGE(ip, bn, mp, PSIZE, p, rc);
^1da177e4c3f415 Linus Torvalds 2005-04-16 2786 if (rc) {
070a0ebf42e15c9 Al Viro 2013-05-17 2787 ctx->pos = DIREND;
^1da177e4c3f415 Linus Torvalds 2005-04-16 2788 return 0;
^1da177e4c3f415 Linus Torvalds 2005-04-16 2789 }
^1da177e4c3f415 Linus Torvalds 2005-04-16 2790 if (p->header.flag & BT_INTERNAL) {
^1da177e4c3f415 Linus Torvalds 2005-04-16 2791 jfs_err("jfs_readdir: bad index table");
^1da177e4c3f415 Linus Torvalds 2005-04-16 2792 DT_PUTPAGE(mp);
44512449c0ab368 Dave Kleikamp 2013-08-15 2793 ctx->pos = DIREND;
^1da177e4c3f415 Linus Torvalds 2005-04-16 2794 return 0;
^1da177e4c3f415 Linus Torvalds 2005-04-16 2795 }
^1da177e4c3f415 Linus Torvalds 2005-04-16 2796 } else {
^1da177e4c3f415 Linus Torvalds 2005-04-16 2797 if (dir_index == 0) {
^1da177e4c3f415 Linus Torvalds 2005-04-16 2798 /*
^1da177e4c3f415 Linus Torvalds 2005-04-16 2799 * self "."
^1da177e4c3f415 Linus Torvalds 2005-04-16 2800 */
44512449c0ab368 Dave Kleikamp 2013-08-15 2801 ctx->pos = 1;
070a0ebf42e15c9 Al Viro 2013-05-17 2802 if (!dir_emit(ctx, ".", 1, ip->i_ino, DT_DIR))
^1da177e4c3f415 Linus Torvalds 2005-04-16 2803 return 0;
^1da177e4c3f415 Linus Torvalds 2005-04-16 2804 }
^1da177e4c3f415 Linus Torvalds 2005-04-16 2805 /*
^1da177e4c3f415 Linus Torvalds 2005-04-16 2806 * parent ".."
^1da177e4c3f415 Linus Torvalds 2005-04-16 2807 */
44512449c0ab368 Dave Kleikamp 2013-08-15 2808 ctx->pos = 2;
070a0ebf42e15c9 Al Viro 2013-05-17 2809 if (!dir_emit(ctx, "..", 2, PARENT(ip), DT_DIR))
^1da177e4c3f415 Linus Torvalds 2005-04-16 2810 return 0;
^1da177e4c3f415 Linus Torvalds 2005-04-16 2811
^1da177e4c3f415 Linus Torvalds 2005-04-16 2812 /*
^1da177e4c3f415 Linus Torvalds 2005-04-16 2813 * Find first entry of left-most leaf
^1da177e4c3f415 Linus Torvalds 2005-04-16 2814 */
^1da177e4c3f415 Linus Torvalds 2005-04-16 2815 if (dtEmpty(ip)) {
070a0ebf42e15c9 Al Viro 2013-05-17 2816 ctx->pos = DIREND;
^1da177e4c3f415 Linus Torvalds 2005-04-16 2817 return 0;
^1da177e4c3f415 Linus Torvalds 2005-04-16 2818 }
^1da177e4c3f415 Linus Torvalds 2005-04-16 2819
^1da177e4c3f415 Linus Torvalds 2005-04-16 2820 if ((rc = dtReadFirst(ip, &btstack)))
^1da177e4c3f415 Linus Torvalds 2005-04-16 2821 return rc;
^1da177e4c3f415 Linus Torvalds 2005-04-16 2822
^1da177e4c3f415 Linus Torvalds 2005-04-16 2823 DT_GETSEARCH(ip, btstack.top, bn, mp, p, index);
^1da177e4c3f415 Linus Torvalds 2005-04-16 2824 }
^1da177e4c3f415 Linus Torvalds 2005-04-16 2825 } else {
^1da177e4c3f415 Linus Torvalds 2005-04-16 2826 /*
^1da177e4c3f415 Linus Torvalds 2005-04-16 2827 * Legacy filesystem - OS/2 & Linux JFS < 0.3.6
^1da177e4c3f415 Linus Torvalds 2005-04-16 2828 *
44512449c0ab368 Dave Kleikamp 2013-08-15 2829 * pn = 0; index = 1: First entry "."
44512449c0ab368 Dave Kleikamp 2013-08-15 2830 * pn = 0; index = 2: Second entry ".."
^1da177e4c3f415 Linus Torvalds 2005-04-16 2831 * pn > 0: Real entries, pn=1 -> leftmost page
^1da177e4c3f415 Linus Torvalds 2005-04-16 2832 * pn = index = -1: No more entries
^1da177e4c3f415 Linus Torvalds 2005-04-16 2833 */
070a0ebf42e15c9 Al Viro 2013-05-17 2834 dtpos = ctx->pos;
44512449c0ab368 Dave Kleikamp 2013-08-15 2835 if (dtpos < 2) {
^1da177e4c3f415 Linus Torvalds 2005-04-16 2836 /* build "." entry */
44512449c0ab368 Dave Kleikamp 2013-08-15 2837 ctx->pos = 1;
070a0ebf42e15c9 Al Viro 2013-05-17 2838 if (!dir_emit(ctx, ".", 1, ip->i_ino, DT_DIR))
^1da177e4c3f415 Linus Torvalds 2005-04-16 2839 return 0;
44512449c0ab368 Dave Kleikamp 2013-08-15 2840 dtoffset->index = 2;
070a0ebf42e15c9 Al Viro 2013-05-17 2841 ctx->pos = dtpos;
^1da177e4c3f415 Linus Torvalds 2005-04-16 2842 }
^1da177e4c3f415 Linus Torvalds 2005-04-16 2843
^1da177e4c3f415 Linus Torvalds 2005-04-16 2844 if (dtoffset->pn == 0) {
44512449c0ab368 Dave Kleikamp 2013-08-15 2845 if (dtoffset->index == 2) {
^1da177e4c3f415 Linus Torvalds 2005-04-16 2846 /* build ".." entry */
070a0ebf42e15c9 Al Viro 2013-05-17 2847 if (!dir_emit(ctx, "..", 2, PARENT(ip), DT_DIR))
^1da177e4c3f415 Linus Torvalds 2005-04-16 2848 return 0;
^1da177e4c3f415 Linus Torvalds 2005-04-16 2849 } else {
6ed71e9819ac341 Joe Perches 2016-03-30 2850 jfs_err("jfs_readdir called with invalid offset!");
^1da177e4c3f415 Linus Torvalds 2005-04-16 2851 }
^1da177e4c3f415 Linus Torvalds 2005-04-16 2852 dtoffset->pn = 1;
^1da177e4c3f415 Linus Torvalds 2005-04-16 2853 dtoffset->index = 0;
070a0ebf42e15c9 Al Viro 2013-05-17 2854 ctx->pos = dtpos;
^1da177e4c3f415 Linus Torvalds 2005-04-16 2855 }
^1da177e4c3f415 Linus Torvalds 2005-04-16 2856
^1da177e4c3f415 Linus Torvalds 2005-04-16 2857 if (dtEmpty(ip)) {
070a0ebf42e15c9 Al Viro 2013-05-17 2858 ctx->pos = DIREND;
^1da177e4c3f415 Linus Torvalds 2005-04-16 2859 return 0;
^1da177e4c3f415 Linus Torvalds 2005-04-16 2860 }
^1da177e4c3f415 Linus Torvalds 2005-04-16 2861
070a0ebf42e15c9 Al Viro 2013-05-17 2862 if ((rc = dtReadNext(ip, &ctx->pos, &btstack))) {
6ed71e9819ac341 Joe Perches 2016-03-30 2863 jfs_err("jfs_readdir: unexpected rc = %d from dtReadNext",
6ed71e9819ac341 Joe Perches 2016-03-30 2864 rc);
070a0ebf42e15c9 Al Viro 2013-05-17 2865 ctx->pos = DIREND;
^1da177e4c3f415 Linus Torvalds 2005-04-16 2866 return 0;
^1da177e4c3f415 Linus Torvalds 2005-04-16 2867 }
^1da177e4c3f415 Linus Torvalds 2005-04-16 2868 /* get start leaf page and index */
^1da177e4c3f415 Linus Torvalds 2005-04-16 2869 DT_GETSEARCH(ip, btstack.top, bn, mp, p, index);
^1da177e4c3f415 Linus Torvalds 2005-04-16 2870
^1da177e4c3f415 Linus Torvalds 2005-04-16 2871 /* offset beyond directory eof ? */
^1da177e4c3f415 Linus Torvalds 2005-04-16 2872 if (bn < 0) {
070a0ebf42e15c9 Al Viro 2013-05-17 2873 ctx->pos = DIREND;
^1da177e4c3f415 Linus Torvalds 2005-04-16 2874 return 0;
^1da177e4c3f415 Linus Torvalds 2005-04-16 2875 }
^1da177e4c3f415 Linus Torvalds 2005-04-16 2876 }
^1da177e4c3f415 Linus Torvalds 2005-04-16 2877
^1da177e4c3f415 Linus Torvalds 2005-04-16 2878 dirent_buf = __get_free_page(GFP_KERNEL);
^1da177e4c3f415 Linus Torvalds 2005-04-16 2879 if (dirent_buf == 0) {
^1da177e4c3f415 Linus Torvalds 2005-04-16 2880 DT_PUTPAGE(mp);
^1da177e4c3f415 Linus Torvalds 2005-04-16 2881 jfs_warn("jfs_readdir: __get_free_page failed!");
070a0ebf42e15c9 Al Viro 2013-05-17 2882 ctx->pos = DIREND;
^1da177e4c3f415 Linus Torvalds 2005-04-16 2883 return -ENOMEM;
^1da177e4c3f415 Linus Torvalds 2005-04-16 2884 }
^1da177e4c3f415 Linus Torvalds 2005-04-16 2885
^1da177e4c3f415 Linus Torvalds 2005-04-16 2886 while (1) {
^1da177e4c3f415 Linus Torvalds 2005-04-16 2887 jfs_dirent = (struct jfs_dirent *) dirent_buf;
^1da177e4c3f415 Linus Torvalds 2005-04-16 2888 jfs_dirents = 0;
^1da177e4c3f415 Linus Torvalds 2005-04-16 2889 overflow = fix_page = 0;
^1da177e4c3f415 Linus Torvalds 2005-04-16 2890
^1da177e4c3f415 Linus Torvalds 2005-04-16 2891 stbl = DT_GETSTBL(p);
^1da177e4c3f415 Linus Torvalds 2005-04-16 2892
^1da177e4c3f415 Linus Torvalds 2005-04-16 2893 for (i = index; i < p->header.nextindex; i++) {
ff9fc48fab0e1ea Ghanshyam Agrawal 2024-10-01 @2894 if (stbl[i] < 0 || stbl[i] > 127) {
ff9fc48fab0e1ea Ghanshyam Agrawal 2024-10-01 2895 jfs_err("JFS: Invalid stbl[%d] = %d for inode %ld, block = %lld",
ff9fc48fab0e1ea Ghanshyam Agrawal 2024-10-01 2896 i, stbl[i], (long)ip->i_ino, (long long)bn);
ff9fc48fab0e1ea Ghanshyam Agrawal 2024-10-01 2897 free_page(dirent_buf);
ff9fc48fab0e1ea Ghanshyam Agrawal 2024-10-01 2898 DT_PUTPAGE(mp);
ff9fc48fab0e1ea Ghanshyam Agrawal 2024-10-01 2899 return -EIO;
ff9fc48fab0e1ea Ghanshyam Agrawal 2024-10-01 2900 }
ff9fc48fab0e1ea Ghanshyam Agrawal 2024-10-01 2901
^1da177e4c3f415 Linus Torvalds 2005-04-16 2902 d = (struct ldtentry *) & p->slot[stbl[i]];
^1da177e4c3f415 Linus Torvalds 2005-04-16 2903
^1da177e4c3f415 Linus Torvalds 2005-04-16 2904 if (((long) jfs_dirent + d->namlen + 1) >
dc5798d9a7b6565 Dave Kleikamp 2005-05-02 2905 (dirent_buf + PAGE_SIZE)) {
^1da177e4c3f415 Linus Torvalds 2005-04-16 2906 /* DBCS codepages could overrun dirent_buf */
^1da177e4c3f415 Linus Torvalds 2005-04-16 2907 index = i;
^1da177e4c3f415 Linus Torvalds 2005-04-16 2908 overflow = 1;
^1da177e4c3f415 Linus Torvalds 2005-04-16 2909 break;
^1da177e4c3f415 Linus Torvalds 2005-04-16 2910 }
^1da177e4c3f415 Linus Torvalds 2005-04-16 2911
^1da177e4c3f415 Linus Torvalds 2005-04-16 2912 d_namleft = d->namlen;
^1da177e4c3f415 Linus Torvalds 2005-04-16 2913 name_ptr = jfs_dirent->name;
^1da177e4c3f415 Linus Torvalds 2005-04-16 2914 jfs_dirent->ino = le32_to_cpu(d->inumber);
^1da177e4c3f415 Linus Torvalds 2005-04-16 2915
^1da177e4c3f415 Linus Torvalds 2005-04-16 2916 if (do_index) {
^1da177e4c3f415 Linus Torvalds 2005-04-16 2917 len = min(d_namleft, DTLHDRDATALEN);
^1da177e4c3f415 Linus Torvalds 2005-04-16 2918 jfs_dirent->position = le32_to_cpu(d->index);
^1da177e4c3f415 Linus Torvalds 2005-04-16 2919 /*
^1da177e4c3f415 Linus Torvalds 2005-04-16 2920 * d->index should always be valid, but it
^1da177e4c3f415 Linus Torvalds 2005-04-16 2921 * isn't. fsck.jfs doesn't create the
^1da177e4c3f415 Linus Torvalds 2005-04-16 2922 * directory index for the lost+found
^1da177e4c3f415 Linus Torvalds 2005-04-16 2923 * directory. Rather than let it go,
^1da177e4c3f415 Linus Torvalds 2005-04-16 2924 * we can try to fix it.
^1da177e4c3f415 Linus Torvalds 2005-04-16 2925 */
^1da177e4c3f415 Linus Torvalds 2005-04-16 2926 if ((jfs_dirent->position < 2) ||
^1da177e4c3f415 Linus Torvalds 2005-04-16 2927 (jfs_dirent->position >=
^1da177e4c3f415 Linus Torvalds 2005-04-16 2928 JFS_IP(ip)->next_index)) {
^1da177e4c3f415 Linus Torvalds 2005-04-16 2929 if (!page_fixed && !isReadOnly(ip)) {
^1da177e4c3f415 Linus Torvalds 2005-04-16 2930 fix_page = 1;
^1da177e4c3f415 Linus Torvalds 2005-04-16 2931 /*
^1da177e4c3f415 Linus Torvalds 2005-04-16 2932 * setting overflow and setting
^1da177e4c3f415 Linus Torvalds 2005-04-16 2933 * index to i will cause the
^1da177e4c3f415 Linus Torvalds 2005-04-16 2934 * same page to be processed
^1da177e4c3f415 Linus Torvalds 2005-04-16 2935 * again starting here
^1da177e4c3f415 Linus Torvalds 2005-04-16 2936 */
^1da177e4c3f415 Linus Torvalds 2005-04-16 2937 overflow = 1;
^1da177e4c3f415 Linus Torvalds 2005-04-16 2938 index = i;
^1da177e4c3f415 Linus Torvalds 2005-04-16 2939 break;
^1da177e4c3f415 Linus Torvalds 2005-04-16 2940 }
^1da177e4c3f415 Linus Torvalds 2005-04-16 2941 jfs_dirent->position = unique_pos++;
^1da177e4c3f415 Linus Torvalds 2005-04-16 2942 }
44512449c0ab368 Dave Kleikamp 2013-08-15 2943 /*
44512449c0ab368 Dave Kleikamp 2013-08-15 2944 * We add 1 to the index because we may
44512449c0ab368 Dave Kleikamp 2013-08-15 2945 * use a value of 2 internally, and NFSv4
44512449c0ab368 Dave Kleikamp 2013-08-15 2946 * doesn't like that.
44512449c0ab368 Dave Kleikamp 2013-08-15 2947 */
44512449c0ab368 Dave Kleikamp 2013-08-15 2948 jfs_dirent->position++;
^1da177e4c3f415 Linus Torvalds 2005-04-16 2949 } else {
^1da177e4c3f415 Linus Torvalds 2005-04-16 2950 jfs_dirent->position = dtpos;
^1da177e4c3f415 Linus Torvalds 2005-04-16 2951 len = min(d_namleft, DTLHDRDATALEN_LEGACY);
^1da177e4c3f415 Linus Torvalds 2005-04-16 2952 }
^1da177e4c3f415 Linus Torvalds 2005-04-16 2953
^1da177e4c3f415 Linus Torvalds 2005-04-16 2954 /* copy the name of head/only segment */
^1da177e4c3f415 Linus Torvalds 2005-04-16 2955 outlen = jfs_strfromUCS_le(name_ptr, d->name, len,
^1da177e4c3f415 Linus Torvalds 2005-04-16 2956 codepage);
^1da177e4c3f415 Linus Torvalds 2005-04-16 2957 jfs_dirent->name_len = outlen;
^1da177e4c3f415 Linus Torvalds 2005-04-16 2958
^1da177e4c3f415 Linus Torvalds 2005-04-16 2959 /* copy name in the additional segment(s) */
^1da177e4c3f415 Linus Torvalds 2005-04-16 2960 next = d->next;
^1da177e4c3f415 Linus Torvalds 2005-04-16 2961 while (next >= 0) {
^1da177e4c3f415 Linus Torvalds 2005-04-16 2962 t = (struct dtslot *) & p->slot[next];
^1da177e4c3f415 Linus Torvalds 2005-04-16 2963 name_ptr += outlen;
^1da177e4c3f415 Linus Torvalds 2005-04-16 2964 d_namleft -= len;
^1da177e4c3f415 Linus Torvalds 2005-04-16 2965 /* Sanity Check */
^1da177e4c3f415 Linus Torvalds 2005-04-16 2966 if (d_namleft == 0) {
^1da177e4c3f415 Linus Torvalds 2005-04-16 2967 jfs_error(ip->i_sb,
eb8630d7d2fd135 Joe Perches 2013-06-04 2968 "JFS:Dtree error: ino = %ld, bn=%lld, index = %d\n",
^1da177e4c3f415 Linus Torvalds 2005-04-16 2969 (long)ip->i_ino,
^1da177e4c3f415 Linus Torvalds 2005-04-16 2970 (long long)bn,
^1da177e4c3f415 Linus Torvalds 2005-04-16 2971 i);
^1da177e4c3f415 Linus Torvalds 2005-04-16 2972 goto skip_one;
^1da177e4c3f415 Linus Torvalds 2005-04-16 2973 }
^1da177e4c3f415 Linus Torvalds 2005-04-16 2974 len = min(d_namleft, DTSLOTDATALEN);
^1da177e4c3f415 Linus Torvalds 2005-04-16 2975 outlen = jfs_strfromUCS_le(name_ptr, t->name,
^1da177e4c3f415 Linus Torvalds 2005-04-16 2976 len, codepage);
^1da177e4c3f415 Linus Torvalds 2005-04-16 2977 jfs_dirent->name_len += outlen;
^1da177e4c3f415 Linus Torvalds 2005-04-16 2978
^1da177e4c3f415 Linus Torvalds 2005-04-16 2979 next = t->next;
^1da177e4c3f415 Linus Torvalds 2005-04-16 2980 }
^1da177e4c3f415 Linus Torvalds 2005-04-16 2981
^1da177e4c3f415 Linus Torvalds 2005-04-16 2982 jfs_dirents++;
^1da177e4c3f415 Linus Torvalds 2005-04-16 2983 jfs_dirent = next_jfs_dirent(jfs_dirent);
^1da177e4c3f415 Linus Torvalds 2005-04-16 2984 skip_one:
^1da177e4c3f415 Linus Torvalds 2005-04-16 2985 if (!do_index)
^1da177e4c3f415 Linus Torvalds 2005-04-16 2986 dtoffset->index++;
^1da177e4c3f415 Linus Torvalds 2005-04-16 2987 }
^1da177e4c3f415 Linus Torvalds 2005-04-16 2988
^1da177e4c3f415 Linus Torvalds 2005-04-16 2989 if (!overflow) {
^1da177e4c3f415 Linus Torvalds 2005-04-16 2990 /* Point to next leaf page */
^1da177e4c3f415 Linus Torvalds 2005-04-16 2991 if (p->header.flag & BT_ROOT)
^1da177e4c3f415 Linus Torvalds 2005-04-16 2992 bn = 0;
^1da177e4c3f415 Linus Torvalds 2005-04-16 2993 else {
^1da177e4c3f415 Linus Torvalds 2005-04-16 2994 bn = le64_to_cpu(p->header.next);
^1da177e4c3f415 Linus Torvalds 2005-04-16 2995 index = 0;
^1da177e4c3f415 Linus Torvalds 2005-04-16 2996 /* update offset (pn:index) for new page */
^1da177e4c3f415 Linus Torvalds 2005-04-16 2997 if (!do_index) {
^1da177e4c3f415 Linus Torvalds 2005-04-16 2998 dtoffset->pn++;
^1da177e4c3f415 Linus Torvalds 2005-04-16 2999 dtoffset->index = 0;
^1da177e4c3f415 Linus Torvalds 2005-04-16 3000 }
^1da177e4c3f415 Linus Torvalds 2005-04-16 3001 }
^1da177e4c3f415 Linus Torvalds 2005-04-16 3002 page_fixed = 0;
^1da177e4c3f415 Linus Torvalds 2005-04-16 3003 }
^1da177e4c3f415 Linus Torvalds 2005-04-16 3004
^1da177e4c3f415 Linus Torvalds 2005-04-16 3005 /* unpin previous leaf page */
^1da177e4c3f415 Linus Torvalds 2005-04-16 3006 DT_PUTPAGE(mp);
^1da177e4c3f415 Linus Torvalds 2005-04-16 3007
^1da177e4c3f415 Linus Torvalds 2005-04-16 3008 jfs_dirent = (struct jfs_dirent *) dirent_buf;
^1da177e4c3f415 Linus Torvalds 2005-04-16 3009 while (jfs_dirents--) {
070a0ebf42e15c9 Al Viro 2013-05-17 3010 ctx->pos = jfs_dirent->position;
070a0ebf42e15c9 Al Viro 2013-05-17 3011 if (!dir_emit(ctx, jfs_dirent->name,
070a0ebf42e15c9 Al Viro 2013-05-17 3012 jfs_dirent->name_len,
^1da177e4c3f415 Linus Torvalds 2005-04-16 3013 jfs_dirent->ino, DT_UNKNOWN))
^1da177e4c3f415 Linus Torvalds 2005-04-16 3014 goto out;
^1da177e4c3f415 Linus Torvalds 2005-04-16 3015 jfs_dirent = next_jfs_dirent(jfs_dirent);
^1da177e4c3f415 Linus Torvalds 2005-04-16 3016 }
^1da177e4c3f415 Linus Torvalds 2005-04-16 3017
^1da177e4c3f415 Linus Torvalds 2005-04-16 3018 if (fix_page) {
^1da177e4c3f415 Linus Torvalds 2005-04-16 3019 add_missing_indices(ip, bn);
^1da177e4c3f415 Linus Torvalds 2005-04-16 3020 page_fixed = 1;
^1da177e4c3f415 Linus Torvalds 2005-04-16 3021 }
^1da177e4c3f415 Linus Torvalds 2005-04-16 3022
^1da177e4c3f415 Linus Torvalds 2005-04-16 3023 if (!overflow && (bn == 0)) {
070a0ebf42e15c9 Al Viro 2013-05-17 3024 ctx->pos = DIREND;
^1da177e4c3f415 Linus Torvalds 2005-04-16 3025 break;
^1da177e4c3f415 Linus Torvalds 2005-04-16 3026 }
^1da177e4c3f415 Linus Torvalds 2005-04-16 3027
^1da177e4c3f415 Linus Torvalds 2005-04-16 3028 DT_GETPAGE(ip, bn, mp, PSIZE, p, rc);
^1da177e4c3f415 Linus Torvalds 2005-04-16 3029 if (rc) {
^1da177e4c3f415 Linus Torvalds 2005-04-16 3030 free_page(dirent_buf);
^1da177e4c3f415 Linus Torvalds 2005-04-16 3031 return rc;
^1da177e4c3f415 Linus Torvalds 2005-04-16 3032 }
^1da177e4c3f415 Linus Torvalds 2005-04-16 3033 }
^1da177e4c3f415 Linus Torvalds 2005-04-16 3034
^1da177e4c3f415 Linus Torvalds 2005-04-16 3035 out:
^1da177e4c3f415 Linus Torvalds 2005-04-16 3036 free_page(dirent_buf);
^1da177e4c3f415 Linus Torvalds 2005-04-16 3037
^1da177e4c3f415 Linus Torvalds 2005-04-16 3038 return rc;
^1da177e4c3f415 Linus Torvalds 2005-04-16 3039 }
^1da177e4c3f415 Linus Torvalds 2005-04-16 3040
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2026-07-11 22:31 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-07-11 22:31 [android-common:android14-kiwi-6.1 180/180] fs/jfs/jfs_dtree.c:2894 jfs_readdir() warn: impossible condition '(stbl[i] > 127) => (0-127 > 127)' kernel test robot
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.