All of lore.kernel.org
 help / color / mirror / Atom feed
From: kernel test robot <lkp@intel.com>
To: oe-kbuild@lists.linux.dev
Cc: lkp@intel.com, Dan Carpenter <error27@gmail.com>
Subject: [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)'
Date: Sun, 12 Jul 2026 06:31:16 +0800	[thread overview]
Message-ID: <202607120604.PssO3RAp-lkp@intel.com> (raw)

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

                 reply	other threads:[~2026-07-11 22:31 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=202607120604.PssO3RAp-lkp@intel.com \
    --to=lkp@intel.com \
    --cc=error27@gmail.com \
    --cc=oe-kbuild@lists.linux.dev \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.