Building the Linux kernel with Clang and LLVM
 help / color / mirror / Atom feed
* [kleikamp-shaggy:jfs-next 1/5] fs/jfs/jfs_dtree.c:2906:31: warning: result of comparison of constant 128 with expression of type 's8' (aka 'signed char') is always false
@ 2025-09-18 10:25 kernel test robot
  2025-09-18 14:06 ` Dave Kleikamp
  0 siblings, 1 reply; 2+ messages in thread
From: kernel test robot @ 2025-09-18 10:25 UTC (permalink / raw)
  To: Zheng Yu; +Cc: llvm, oe-kbuild-all, Dave Kleikamp

tree:   https://github.com/kleikamp/linux-shaggy jfs-next
head:   c87ed72ff7cfd52843fef97be14567e2d377f584
commit: 79e48b88ffd89a4446f407680ab4e7e5679a04e8 [1/5] jfs: replace hardcoded magic number with DTPAGEMAXSLOT constant
config: arm-randconfig-001-20250918 (https://download.01.org/0day-ci/archive/20250918/202509181832.frk03WjF-lkp@intel.com/config)
compiler: clang version 22.0.0git (https://github.com/llvm/llvm-project 7c861bcedf61607b6c087380ac711eb7ff918ca6)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250918/202509181832.frk03WjF-lkp@intel.com/reproduce)

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>
| Closes: https://lore.kernel.org/oe-kbuild-all/202509181832.frk03WjF-lkp@intel.com/

All warnings (new ones prefixed by >>):

>> fs/jfs/jfs_dtree.c:2906:31: warning: result of comparison of constant 128 with expression of type 's8' (aka 'signed char') is always false [-Wtautological-constant-out-of-range-compare]
    2906 |                         if (stbl[i] < 0 || stbl[i] > DTPAGEMAXSLOT) {
         |                                            ~~~~~~~ ^ ~~~~~~~~~~~~~
   fs/jfs/jfs_dtree.c:3111:30: warning: result of comparison of constant 128 with expression of type 's8' (aka 'signed char') is always false [-Wtautological-constant-out-of-range-compare]
    3111 |                 if (stbl[0] < 0 || stbl[0] > DTPAGEMAXSLOT) {
         |                                    ~~~~~~~ ^ ~~~~~~~~~~~~~
   2 warnings generated.


vim +2906 fs/jfs/jfs_dtree.c

  2702	
  2703	/*
  2704	 *	jfs_readdir()
  2705	 *
  2706	 * function: read directory entries sequentially
  2707	 *	from the specified entry offset
  2708	 *
  2709	 * parameter:
  2710	 *
  2711	 * return: offset = (pn, index) of start entry
  2712	 *	of next jfs_readdir()/dtRead()
  2713	 */
  2714	int jfs_readdir(struct file *file, struct dir_context *ctx)
  2715	{
  2716		struct inode *ip = file_inode(file);
  2717		struct nls_table *codepage = JFS_SBI(ip->i_sb)->nls_tab;
  2718		int rc = 0;
  2719		loff_t dtpos;	/* legacy OS/2 style position */
  2720		struct dtoffset {
  2721			s16 pn;
  2722			s16 index;
  2723			s32 unused;
  2724		} *dtoffset = (struct dtoffset *) &dtpos;
  2725		s64 bn;
  2726		struct metapage *mp;
  2727		dtpage_t *p;
  2728		int index;
  2729		s8 *stbl;
  2730		struct btstack btstack;
  2731		int i, next;
  2732		struct ldtentry *d;
  2733		struct dtslot *t;
  2734		int d_namleft, len, outlen;
  2735		unsigned long dirent_buf;
  2736		char *name_ptr;
  2737		u32 dir_index;
  2738		int do_index = 0;
  2739		uint loop_count = 0;
  2740		struct jfs_dirent *jfs_dirent;
  2741		int jfs_dirents;
  2742		int overflow, fix_page, page_fixed = 0;
  2743		static int unique_pos = 2;	/* If we can't fix broken index */
  2744	
  2745		if (ctx->pos == DIREND)
  2746			return 0;
  2747	
  2748		if (DO_INDEX(ip)) {
  2749			/*
  2750			 * persistent index is stored in directory entries.
  2751			 * Special cases:	 0 = .
  2752			 *			 1 = ..
  2753			 *			-1 = End of directory
  2754			 */
  2755			do_index = 1;
  2756	
  2757			dir_index = (u32) ctx->pos;
  2758	
  2759			/*
  2760			 * NFSv4 reserves cookies 1 and 2 for . and .. so the value
  2761			 * we return to the vfs is one greater than the one we use
  2762			 * internally.
  2763			 */
  2764			if (dir_index)
  2765				dir_index--;
  2766	
  2767			if (dir_index > 1) {
  2768				struct dir_table_slot dirtab_slot;
  2769	
  2770				if (dtEmpty(ip) ||
  2771				    (dir_index >= JFS_IP(ip)->next_index)) {
  2772					/* Stale position.  Directory has shrunk */
  2773					ctx->pos = DIREND;
  2774					return 0;
  2775				}
  2776			      repeat:
  2777				rc = read_index(ip, dir_index, &dirtab_slot);
  2778				if (rc) {
  2779					ctx->pos = DIREND;
  2780					return rc;
  2781				}
  2782				if (dirtab_slot.flag == DIR_INDEX_FREE) {
  2783					if (loop_count++ > JFS_IP(ip)->next_index) {
  2784						jfs_err("jfs_readdir detected infinite loop!");
  2785						ctx->pos = DIREND;
  2786						return 0;
  2787					}
  2788					dir_index = le32_to_cpu(dirtab_slot.addr2);
  2789					if (dir_index == -1) {
  2790						ctx->pos = DIREND;
  2791						return 0;
  2792					}
  2793					goto repeat;
  2794				}
  2795				bn = addressDTS(&dirtab_slot);
  2796				index = dirtab_slot.slot;
  2797				DT_GETPAGE(ip, bn, mp, PSIZE, p, rc);
  2798				if (rc) {
  2799					ctx->pos = DIREND;
  2800					return 0;
  2801				}
  2802				if (p->header.flag & BT_INTERNAL) {
  2803					jfs_err("jfs_readdir: bad index table");
  2804					DT_PUTPAGE(mp);
  2805					ctx->pos = DIREND;
  2806					return 0;
  2807				}
  2808			} else {
  2809				if (dir_index == 0) {
  2810					/*
  2811					 * self "."
  2812					 */
  2813					ctx->pos = 1;
  2814					if (!dir_emit(ctx, ".", 1, ip->i_ino, DT_DIR))
  2815						return 0;
  2816				}
  2817				/*
  2818				 * parent ".."
  2819				 */
  2820				ctx->pos = 2;
  2821				if (!dir_emit(ctx, "..", 2, PARENT(ip), DT_DIR))
  2822					return 0;
  2823	
  2824				/*
  2825				 * Find first entry of left-most leaf
  2826				 */
  2827				if (dtEmpty(ip)) {
  2828					ctx->pos = DIREND;
  2829					return 0;
  2830				}
  2831	
  2832				if ((rc = dtReadFirst(ip, &btstack)))
  2833					return rc;
  2834	
  2835				DT_GETSEARCH(ip, btstack.top, bn, mp, p, index);
  2836			}
  2837		} else {
  2838			/*
  2839			 * Legacy filesystem - OS/2 & Linux JFS < 0.3.6
  2840			 *
  2841			 * pn = 0; index = 1:	First entry "."
  2842			 * pn = 0; index = 2:	Second entry ".."
  2843			 * pn > 0:		Real entries, pn=1 -> leftmost page
  2844			 * pn = index = -1:	No more entries
  2845			 */
  2846			dtpos = ctx->pos;
  2847			if (dtpos < 2) {
  2848				/* build "." entry */
  2849				ctx->pos = 1;
  2850				if (!dir_emit(ctx, ".", 1, ip->i_ino, DT_DIR))
  2851					return 0;
  2852				dtoffset->index = 2;
  2853				ctx->pos = dtpos;
  2854			}
  2855	
  2856			if (dtoffset->pn == 0) {
  2857				if (dtoffset->index == 2) {
  2858					/* build ".." entry */
  2859					if (!dir_emit(ctx, "..", 2, PARENT(ip), DT_DIR))
  2860						return 0;
  2861				} else {
  2862					jfs_err("jfs_readdir called with invalid offset!");
  2863				}
  2864				dtoffset->pn = 1;
  2865				dtoffset->index = 0;
  2866				ctx->pos = dtpos;
  2867			}
  2868	
  2869			if (dtEmpty(ip)) {
  2870				ctx->pos = DIREND;
  2871				return 0;
  2872			}
  2873	
  2874			if ((rc = dtReadNext(ip, &ctx->pos, &btstack))) {
  2875				jfs_err("jfs_readdir: unexpected rc = %d from dtReadNext",
  2876					rc);
  2877				ctx->pos = DIREND;
  2878				return 0;
  2879			}
  2880			/* get start leaf page and index */
  2881			DT_GETSEARCH(ip, btstack.top, bn, mp, p, index);
  2882	
  2883			/* offset beyond directory eof ? */
  2884			if (bn < 0) {
  2885				ctx->pos = DIREND;
  2886				return 0;
  2887			}
  2888		}
  2889	
  2890		dirent_buf = __get_free_page(GFP_KERNEL);
  2891		if (dirent_buf == 0) {
  2892			DT_PUTPAGE(mp);
  2893			jfs_warn("jfs_readdir: __get_free_page failed!");
  2894			ctx->pos = DIREND;
  2895			return -ENOMEM;
  2896		}
  2897	
  2898		while (1) {
  2899			jfs_dirent = (struct jfs_dirent *) dirent_buf;
  2900			jfs_dirents = 0;
  2901			overflow = fix_page = 0;
  2902	
  2903			stbl = DT_GETSTBL(p);
  2904	
  2905			for (i = index; i < p->header.nextindex; i++) {
> 2906				if (stbl[i] < 0 || stbl[i] > DTPAGEMAXSLOT) {
  2907					jfs_err("JFS: Invalid stbl[%d] = %d for inode %ld, block = %lld",
  2908						i, stbl[i], (long)ip->i_ino, (long long)bn);
  2909					free_page(dirent_buf);
  2910					DT_PUTPAGE(mp);
  2911					return -EIO;
  2912				}
  2913	
  2914				d = (struct ldtentry *) & p->slot[stbl[i]];
  2915	
  2916				if (((long) jfs_dirent + d->namlen + 1) >
  2917				    (dirent_buf + PAGE_SIZE)) {
  2918					/* DBCS codepages could overrun dirent_buf */
  2919					index = i;
  2920					overflow = 1;
  2921					break;
  2922				}
  2923	
  2924				d_namleft = d->namlen;
  2925				name_ptr = jfs_dirent->name;
  2926				jfs_dirent->ino = le32_to_cpu(d->inumber);
  2927	
  2928				if (do_index) {
  2929					len = min(d_namleft, DTLHDRDATALEN);
  2930					jfs_dirent->position = le32_to_cpu(d->index);
  2931					/*
  2932					 * d->index should always be valid, but it
  2933					 * isn't.  fsck.jfs doesn't create the
  2934					 * directory index for the lost+found
  2935					 * directory.  Rather than let it go,
  2936					 * we can try to fix it.
  2937					 */
  2938					if ((jfs_dirent->position < 2) ||
  2939					    (jfs_dirent->position >=
  2940					     JFS_IP(ip)->next_index)) {
  2941						if (!page_fixed && !isReadOnly(ip)) {
  2942							fix_page = 1;
  2943							/*
  2944							 * setting overflow and setting
  2945							 * index to i will cause the
  2946							 * same page to be processed
  2947							 * again starting here
  2948							 */
  2949							overflow = 1;
  2950							index = i;
  2951							break;
  2952						}
  2953						jfs_dirent->position = unique_pos++;
  2954					}
  2955					/*
  2956					 * We add 1 to the index because we may
  2957					 * use a value of 2 internally, and NFSv4
  2958					 * doesn't like that.
  2959					 */
  2960					jfs_dirent->position++;
  2961				} else {
  2962					jfs_dirent->position = dtpos;
  2963					len = min(d_namleft, DTLHDRDATALEN_LEGACY);
  2964				}
  2965	
  2966				/* copy the name of head/only segment */
  2967				outlen = jfs_strfromUCS_le(name_ptr, d->name, len,
  2968							   codepage);
  2969				jfs_dirent->name_len = outlen;
  2970	
  2971				/* copy name in the additional segment(s) */
  2972				next = d->next;
  2973				while (next >= 0) {
  2974					t = (struct dtslot *) & p->slot[next];
  2975					name_ptr += outlen;
  2976					d_namleft -= len;
  2977					/* Sanity Check */
  2978					if (d_namleft == 0) {
  2979						jfs_error(ip->i_sb,
  2980							  "JFS:Dtree error: ino = %ld, bn=%lld, index = %d\n",
  2981							  (long)ip->i_ino,
  2982							  (long long)bn,
  2983							  i);
  2984						goto skip_one;
  2985					}
  2986					len = min(d_namleft, DTSLOTDATALEN);
  2987					outlen = jfs_strfromUCS_le(name_ptr, t->name,
  2988								   len, codepage);
  2989					jfs_dirent->name_len += outlen;
  2990	
  2991					next = t->next;
  2992				}
  2993	
  2994				jfs_dirents++;
  2995				jfs_dirent = next_jfs_dirent(jfs_dirent);
  2996	skip_one:
  2997				if (!do_index)
  2998					dtoffset->index++;
  2999			}
  3000	
  3001			if (!overflow) {
  3002				/* Point to next leaf page */
  3003				if (p->header.flag & BT_ROOT)
  3004					bn = 0;
  3005				else {
  3006					bn = le64_to_cpu(p->header.next);
  3007					index = 0;
  3008					/* update offset (pn:index) for new page */
  3009					if (!do_index) {
  3010						dtoffset->pn++;
  3011						dtoffset->index = 0;
  3012					}
  3013				}
  3014				page_fixed = 0;
  3015			}
  3016	
  3017			/* unpin previous leaf page */
  3018			DT_PUTPAGE(mp);
  3019	
  3020			jfs_dirent = (struct jfs_dirent *) dirent_buf;
  3021			while (jfs_dirents--) {
  3022				ctx->pos = jfs_dirent->position;
  3023				if (!dir_emit(ctx, jfs_dirent->name,
  3024					    jfs_dirent->name_len,
  3025					    jfs_dirent->ino, DT_UNKNOWN))
  3026					goto out;
  3027				jfs_dirent = next_jfs_dirent(jfs_dirent);
  3028			}
  3029	
  3030			if (fix_page) {
  3031				if ((rc = add_missing_indices(ip, bn)))
  3032					goto out;
  3033				page_fixed = 1;
  3034			}
  3035	
  3036			if (!overflow && (bn == 0)) {
  3037				ctx->pos = DIREND;
  3038				break;
  3039			}
  3040	
  3041			DT_GETPAGE(ip, bn, mp, PSIZE, p, rc);
  3042			if (rc) {
  3043				free_page(dirent_buf);
  3044				return rc;
  3045			}
  3046		}
  3047	
  3048	      out:
  3049		free_page(dirent_buf);
  3050	
  3051		return rc;
  3052	}
  3053	

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki

^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [kleikamp-shaggy:jfs-next 1/5] fs/jfs/jfs_dtree.c:2906:31: warning: result of comparison of constant 128 with expression of type 's8' (aka 'signed char') is always false
  2025-09-18 10:25 [kleikamp-shaggy:jfs-next 1/5] fs/jfs/jfs_dtree.c:2906:31: warning: result of comparison of constant 128 with expression of type 's8' (aka 'signed char') is always false kernel test robot
@ 2025-09-18 14:06 ` Dave Kleikamp
  0 siblings, 0 replies; 2+ messages in thread
From: Dave Kleikamp @ 2025-09-18 14:06 UTC (permalink / raw)
  To: kernel test robot, Zheng Yu; +Cc: llvm, oe-kbuild-all

On 9/18/25 5:25AM, kernel test robot wrote:
> tree:   https://github.com/kleikamp/linux-shaggy jfs-next
> head:   c87ed72ff7cfd52843fef97be14567e2d377f584
> commit: 79e48b88ffd89a4446f407680ab4e7e5679a04e8 [1/5] jfs: replace hardcoded magic number with DTPAGEMAXSLOT constant
> config: arm-randconfig-001-20250918 (https://download.01.org/0day-ci/archive/20250918/202509181832.frk03WjF-lkp@intel.com/config)
> compiler: clang version 22.0.0git (https://github.com/llvm/llvm-project 7c861bcedf61607b6c087380ac711eb7ff918ca6)
> reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250918/202509181832.frk03WjF-lkp@intel.com/reproduce)
> 
> 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>
> | Closes: https://lore.kernel.org/oe-kbuild-all/202509181832.frk03WjF-lkp@intel.com/

Zheng,

This is my bad. I had trouble applying your patch, so I made the changes 
manually and used > instead of >=. I'll fix the patch and re-push it.

Shaggy

> 
> All warnings (new ones prefixed by >>):
> 
>>> fs/jfs/jfs_dtree.c:2906:31: warning: result of comparison of constant 128 with expression of type 's8' (aka 'signed char') is always false [-Wtautological-constant-out-of-range-compare]
>      2906 |                         if (stbl[i] < 0 || stbl[i] > DTPAGEMAXSLOT) {
>           |                                            ~~~~~~~ ^ ~~~~~~~~~~~~~
>     fs/jfs/jfs_dtree.c:3111:30: warning: result of comparison of constant 128 with expression of type 's8' (aka 'signed char') is always false [-Wtautological-constant-out-of-range-compare]
>      3111 |                 if (stbl[0] < 0 || stbl[0] > DTPAGEMAXSLOT) {
>           |                                    ~~~~~~~ ^ ~~~~~~~~~~~~~
>     2 warnings generated.
> 
> 
> vim +2906 fs/jfs/jfs_dtree.c
> 
>    2702	
>    2703	/*
>    2704	 *	jfs_readdir()
>    2705	 *
>    2706	 * function: read directory entries sequentially
>    2707	 *	from the specified entry offset
>    2708	 *
>    2709	 * parameter:
>    2710	 *
>    2711	 * return: offset = (pn, index) of start entry
>    2712	 *	of next jfs_readdir()/dtRead()
>    2713	 */
>    2714	int jfs_readdir(struct file *file, struct dir_context *ctx)
>    2715	{
>    2716		struct inode *ip = file_inode(file);
>    2717		struct nls_table *codepage = JFS_SBI(ip->i_sb)->nls_tab;
>    2718		int rc = 0;
>    2719		loff_t dtpos;	/* legacy OS/2 style position */
>    2720		struct dtoffset {
>    2721			s16 pn;
>    2722			s16 index;
>    2723			s32 unused;
>    2724		} *dtoffset = (struct dtoffset *) &dtpos;
>    2725		s64 bn;
>    2726		struct metapage *mp;
>    2727		dtpage_t *p;
>    2728		int index;
>    2729		s8 *stbl;
>    2730		struct btstack btstack;
>    2731		int i, next;
>    2732		struct ldtentry *d;
>    2733		struct dtslot *t;
>    2734		int d_namleft, len, outlen;
>    2735		unsigned long dirent_buf;
>    2736		char *name_ptr;
>    2737		u32 dir_index;
>    2738		int do_index = 0;
>    2739		uint loop_count = 0;
>    2740		struct jfs_dirent *jfs_dirent;
>    2741		int jfs_dirents;
>    2742		int overflow, fix_page, page_fixed = 0;
>    2743		static int unique_pos = 2;	/* If we can't fix broken index */
>    2744	
>    2745		if (ctx->pos == DIREND)
>    2746			return 0;
>    2747	
>    2748		if (DO_INDEX(ip)) {
>    2749			/*
>    2750			 * persistent index is stored in directory entries.
>    2751			 * Special cases:	 0 = .
>    2752			 *			 1 = ..
>    2753			 *			-1 = End of directory
>    2754			 */
>    2755			do_index = 1;
>    2756	
>    2757			dir_index = (u32) ctx->pos;
>    2758	
>    2759			/*
>    2760			 * NFSv4 reserves cookies 1 and 2 for . and .. so the value
>    2761			 * we return to the vfs is one greater than the one we use
>    2762			 * internally.
>    2763			 */
>    2764			if (dir_index)
>    2765				dir_index--;
>    2766	
>    2767			if (dir_index > 1) {
>    2768				struct dir_table_slot dirtab_slot;
>    2769	
>    2770				if (dtEmpty(ip) ||
>    2771				    (dir_index >= JFS_IP(ip)->next_index)) {
>    2772					/* Stale position.  Directory has shrunk */
>    2773					ctx->pos = DIREND;
>    2774					return 0;
>    2775				}
>    2776			      repeat:
>    2777				rc = read_index(ip, dir_index, &dirtab_slot);
>    2778				if (rc) {
>    2779					ctx->pos = DIREND;
>    2780					return rc;
>    2781				}
>    2782				if (dirtab_slot.flag == DIR_INDEX_FREE) {
>    2783					if (loop_count++ > JFS_IP(ip)->next_index) {
>    2784						jfs_err("jfs_readdir detected infinite loop!");
>    2785						ctx->pos = DIREND;
>    2786						return 0;
>    2787					}
>    2788					dir_index = le32_to_cpu(dirtab_slot.addr2);
>    2789					if (dir_index == -1) {
>    2790						ctx->pos = DIREND;
>    2791						return 0;
>    2792					}
>    2793					goto repeat;
>    2794				}
>    2795				bn = addressDTS(&dirtab_slot);
>    2796				index = dirtab_slot.slot;
>    2797				DT_GETPAGE(ip, bn, mp, PSIZE, p, rc);
>    2798				if (rc) {
>    2799					ctx->pos = DIREND;
>    2800					return 0;
>    2801				}
>    2802				if (p->header.flag & BT_INTERNAL) {
>    2803					jfs_err("jfs_readdir: bad index table");
>    2804					DT_PUTPAGE(mp);
>    2805					ctx->pos = DIREND;
>    2806					return 0;
>    2807				}
>    2808			} else {
>    2809				if (dir_index == 0) {
>    2810					/*
>    2811					 * self "."
>    2812					 */
>    2813					ctx->pos = 1;
>    2814					if (!dir_emit(ctx, ".", 1, ip->i_ino, DT_DIR))
>    2815						return 0;
>    2816				}
>    2817				/*
>    2818				 * parent ".."
>    2819				 */
>    2820				ctx->pos = 2;
>    2821				if (!dir_emit(ctx, "..", 2, PARENT(ip), DT_DIR))
>    2822					return 0;
>    2823	
>    2824				/*
>    2825				 * Find first entry of left-most leaf
>    2826				 */
>    2827				if (dtEmpty(ip)) {
>    2828					ctx->pos = DIREND;
>    2829					return 0;
>    2830				}
>    2831	
>    2832				if ((rc = dtReadFirst(ip, &btstack)))
>    2833					return rc;
>    2834	
>    2835				DT_GETSEARCH(ip, btstack.top, bn, mp, p, index);
>    2836			}
>    2837		} else {
>    2838			/*
>    2839			 * Legacy filesystem - OS/2 & Linux JFS < 0.3.6
>    2840			 *
>    2841			 * pn = 0; index = 1:	First entry "."
>    2842			 * pn = 0; index = 2:	Second entry ".."
>    2843			 * pn > 0:		Real entries, pn=1 -> leftmost page
>    2844			 * pn = index = -1:	No more entries
>    2845			 */
>    2846			dtpos = ctx->pos;
>    2847			if (dtpos < 2) {
>    2848				/* build "." entry */
>    2849				ctx->pos = 1;
>    2850				if (!dir_emit(ctx, ".", 1, ip->i_ino, DT_DIR))
>    2851					return 0;
>    2852				dtoffset->index = 2;
>    2853				ctx->pos = dtpos;
>    2854			}
>    2855	
>    2856			if (dtoffset->pn == 0) {
>    2857				if (dtoffset->index == 2) {
>    2858					/* build ".." entry */
>    2859					if (!dir_emit(ctx, "..", 2, PARENT(ip), DT_DIR))
>    2860						return 0;
>    2861				} else {
>    2862					jfs_err("jfs_readdir called with invalid offset!");
>    2863				}
>    2864				dtoffset->pn = 1;
>    2865				dtoffset->index = 0;
>    2866				ctx->pos = dtpos;
>    2867			}
>    2868	
>    2869			if (dtEmpty(ip)) {
>    2870				ctx->pos = DIREND;
>    2871				return 0;
>    2872			}
>    2873	
>    2874			if ((rc = dtReadNext(ip, &ctx->pos, &btstack))) {
>    2875				jfs_err("jfs_readdir: unexpected rc = %d from dtReadNext",
>    2876					rc);
>    2877				ctx->pos = DIREND;
>    2878				return 0;
>    2879			}
>    2880			/* get start leaf page and index */
>    2881			DT_GETSEARCH(ip, btstack.top, bn, mp, p, index);
>    2882	
>    2883			/* offset beyond directory eof ? */
>    2884			if (bn < 0) {
>    2885				ctx->pos = DIREND;
>    2886				return 0;
>    2887			}
>    2888		}
>    2889	
>    2890		dirent_buf = __get_free_page(GFP_KERNEL);
>    2891		if (dirent_buf == 0) {
>    2892			DT_PUTPAGE(mp);
>    2893			jfs_warn("jfs_readdir: __get_free_page failed!");
>    2894			ctx->pos = DIREND;
>    2895			return -ENOMEM;
>    2896		}
>    2897	
>    2898		while (1) {
>    2899			jfs_dirent = (struct jfs_dirent *) dirent_buf;
>    2900			jfs_dirents = 0;
>    2901			overflow = fix_page = 0;
>    2902	
>    2903			stbl = DT_GETSTBL(p);
>    2904	
>    2905			for (i = index; i < p->header.nextindex; i++) {
>> 2906				if (stbl[i] < 0 || stbl[i] > DTPAGEMAXSLOT) {
>    2907					jfs_err("JFS: Invalid stbl[%d] = %d for inode %ld, block = %lld",
>    2908						i, stbl[i], (long)ip->i_ino, (long long)bn);
>    2909					free_page(dirent_buf);
>    2910					DT_PUTPAGE(mp);
>    2911					return -EIO;
>    2912				}
>    2913	
>    2914				d = (struct ldtentry *) & p->slot[stbl[i]];
>    2915	
>    2916				if (((long) jfs_dirent + d->namlen + 1) >
>    2917				    (dirent_buf + PAGE_SIZE)) {
>    2918					/* DBCS codepages could overrun dirent_buf */
>    2919					index = i;
>    2920					overflow = 1;
>    2921					break;
>    2922				}
>    2923	
>    2924				d_namleft = d->namlen;
>    2925				name_ptr = jfs_dirent->name;
>    2926				jfs_dirent->ino = le32_to_cpu(d->inumber);
>    2927	
>    2928				if (do_index) {
>    2929					len = min(d_namleft, DTLHDRDATALEN);
>    2930					jfs_dirent->position = le32_to_cpu(d->index);
>    2931					/*
>    2932					 * d->index should always be valid, but it
>    2933					 * isn't.  fsck.jfs doesn't create the
>    2934					 * directory index for the lost+found
>    2935					 * directory.  Rather than let it go,
>    2936					 * we can try to fix it.
>    2937					 */
>    2938					if ((jfs_dirent->position < 2) ||
>    2939					    (jfs_dirent->position >=
>    2940					     JFS_IP(ip)->next_index)) {
>    2941						if (!page_fixed && !isReadOnly(ip)) {
>    2942							fix_page = 1;
>    2943							/*
>    2944							 * setting overflow and setting
>    2945							 * index to i will cause the
>    2946							 * same page to be processed
>    2947							 * again starting here
>    2948							 */
>    2949							overflow = 1;
>    2950							index = i;
>    2951							break;
>    2952						}
>    2953						jfs_dirent->position = unique_pos++;
>    2954					}
>    2955					/*
>    2956					 * We add 1 to the index because we may
>    2957					 * use a value of 2 internally, and NFSv4
>    2958					 * doesn't like that.
>    2959					 */
>    2960					jfs_dirent->position++;
>    2961				} else {
>    2962					jfs_dirent->position = dtpos;
>    2963					len = min(d_namleft, DTLHDRDATALEN_LEGACY);
>    2964				}
>    2965	
>    2966				/* copy the name of head/only segment */
>    2967				outlen = jfs_strfromUCS_le(name_ptr, d->name, len,
>    2968							   codepage);
>    2969				jfs_dirent->name_len = outlen;
>    2970	
>    2971				/* copy name in the additional segment(s) */
>    2972				next = d->next;
>    2973				while (next >= 0) {
>    2974					t = (struct dtslot *) & p->slot[next];
>    2975					name_ptr += outlen;
>    2976					d_namleft -= len;
>    2977					/* Sanity Check */
>    2978					if (d_namleft == 0) {
>    2979						jfs_error(ip->i_sb,
>    2980							  "JFS:Dtree error: ino = %ld, bn=%lld, index = %d\n",
>    2981							  (long)ip->i_ino,
>    2982							  (long long)bn,
>    2983							  i);
>    2984						goto skip_one;
>    2985					}
>    2986					len = min(d_namleft, DTSLOTDATALEN);
>    2987					outlen = jfs_strfromUCS_le(name_ptr, t->name,
>    2988								   len, codepage);
>    2989					jfs_dirent->name_len += outlen;
>    2990	
>    2991					next = t->next;
>    2992				}
>    2993	
>    2994				jfs_dirents++;
>    2995				jfs_dirent = next_jfs_dirent(jfs_dirent);
>    2996	skip_one:
>    2997				if (!do_index)
>    2998					dtoffset->index++;
>    2999			}
>    3000	
>    3001			if (!overflow) {
>    3002				/* Point to next leaf page */
>    3003				if (p->header.flag & BT_ROOT)
>    3004					bn = 0;
>    3005				else {
>    3006					bn = le64_to_cpu(p->header.next);
>    3007					index = 0;
>    3008					/* update offset (pn:index) for new page */
>    3009					if (!do_index) {
>    3010						dtoffset->pn++;
>    3011						dtoffset->index = 0;
>    3012					}
>    3013				}
>    3014				page_fixed = 0;
>    3015			}
>    3016	
>    3017			/* unpin previous leaf page */
>    3018			DT_PUTPAGE(mp);
>    3019	
>    3020			jfs_dirent = (struct jfs_dirent *) dirent_buf;
>    3021			while (jfs_dirents--) {
>    3022				ctx->pos = jfs_dirent->position;
>    3023				if (!dir_emit(ctx, jfs_dirent->name,
>    3024					    jfs_dirent->name_len,
>    3025					    jfs_dirent->ino, DT_UNKNOWN))
>    3026					goto out;
>    3027				jfs_dirent = next_jfs_dirent(jfs_dirent);
>    3028			}
>    3029	
>    3030			if (fix_page) {
>    3031				if ((rc = add_missing_indices(ip, bn)))
>    3032					goto out;
>    3033				page_fixed = 1;
>    3034			}
>    3035	
>    3036			if (!overflow && (bn == 0)) {
>    3037				ctx->pos = DIREND;
>    3038				break;
>    3039			}
>    3040	
>    3041			DT_GETPAGE(ip, bn, mp, PSIZE, p, rc);
>    3042			if (rc) {
>    3043				free_page(dirent_buf);
>    3044				return rc;
>    3045			}
>    3046		}
>    3047	
>    3048	      out:
>    3049		free_page(dirent_buf);
>    3050	
>    3051		return rc;
>    3052	}
>    3053	
> 


^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2025-09-18 14:06 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-09-18 10:25 [kleikamp-shaggy:jfs-next 1/5] fs/jfs/jfs_dtree.c:2906:31: warning: result of comparison of constant 128 with expression of type 's8' (aka 'signed char') is always false kernel test robot
2025-09-18 14:06 ` Dave Kleikamp

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox