All of lore.kernel.org
 help / color / mirror / Atom feed
* [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.