diff options
Diffstat (limited to 'fs/jfs/jfs_dtree.c')
| -rw-r--r-- | fs/jfs/jfs_dtree.c | 100 | 
1 files changed, 47 insertions, 53 deletions
| diff --git a/fs/jfs/jfs_dtree.c b/fs/jfs/jfs_dtree.c index 0ddbeceafc62..8743ba9c6742 100644 --- a/fs/jfs/jfs_dtree.c +++ b/fs/jfs/jfs_dtree.c @@ -124,21 +124,21 @@ struct dtsplit {  #define DT_PAGE(IP, MP) BT_PAGE(IP, MP, dtpage_t, i_dtroot)  /* get page buffer for specified block address */ -#define DT_GETPAGE(IP, BN, MP, SIZE, P, RC)\ -{\ -	BT_GETPAGE(IP, BN, MP, dtpage_t, SIZE, P, RC, i_dtroot)\ -	if (!(RC))\ -	{\ -		if (((P)->header.nextindex > (((BN)==0)?DTROOTMAXSLOT:(P)->header.maxslot)) ||\ -		    ((BN) && ((P)->header.maxslot > DTPAGEMAXSLOT)))\ -		{\ -			BT_PUTPAGE(MP);\ -			jfs_error((IP)->i_sb, "DT_GETPAGE: dtree page corrupt");\ -			MP = NULL;\ -			RC = -EIO;\ -		}\ -	}\ -} +#define DT_GETPAGE(IP, BN, MP, SIZE, P, RC)				\ +do {									\ +	BT_GETPAGE(IP, BN, MP, dtpage_t, SIZE, P, RC, i_dtroot);	\ +	if (!(RC)) {							\ +		if (((P)->header.nextindex >				\ +		     (((BN) == 0) ? DTROOTMAXSLOT : (P)->header.maxslot)) || \ +		    ((BN) && ((P)->header.maxslot > DTPAGEMAXSLOT))) {	\ +			BT_PUTPAGE(MP);					\ +			jfs_error((IP)->i_sb,				\ +				  "DT_GETPAGE: dtree page corrupt\n");	\ +			MP = NULL;					\ +			RC = -EIO;					\ +		}							\ +	}								\ +} while (0)  /* for consistency */  #define DT_PUTPAGE(MP) BT_PUTPAGE(MP) @@ -776,7 +776,7 @@ int dtSearch(struct inode *ip, struct component_name * key, ino_t * data,  			/* Something's corrupted, mark filesystem dirty so  			 * chkdsk will fix it.  			 */ -			jfs_error(sb, "stack overrun in dtSearch!"); +			jfs_error(sb, "stack overrun!\n");  			BT_STACK_DUMP(btstack);  			rc = -EIO;  			goto out; @@ -3002,9 +3002,9 @@ static inline struct jfs_dirent *next_jfs_dirent(struct jfs_dirent *dirent)   * return: offset = (pn, index) of start entry   *	of next jfs_readdir()/dtRead()   */ -int jfs_readdir(struct file *filp, void *dirent, filldir_t filldir) +int jfs_readdir(struct file *file, struct dir_context *ctx)  { -	struct inode *ip = file_inode(filp); +	struct inode *ip = file_inode(file);  	struct nls_table *codepage = JFS_SBI(ip->i_sb)->nls_tab;  	int rc = 0;  	loff_t dtpos;	/* legacy OS/2 style position */ @@ -3033,7 +3033,7 @@ int jfs_readdir(struct file *filp, void *dirent, filldir_t filldir)  	int overflow, fix_page, page_fixed = 0;  	static int unique_pos = 2;	/* If we can't fix broken index */ -	if (filp->f_pos == DIREND) +	if (ctx->pos == DIREND)  		return 0;  	if (DO_INDEX(ip)) { @@ -3045,7 +3045,7 @@ int jfs_readdir(struct file *filp, void *dirent, filldir_t filldir)  		 */  		do_index = 1; -		dir_index = (u32) filp->f_pos; +		dir_index = (u32) ctx->pos;  		if (dir_index > 1) {  			struct dir_table_slot dirtab_slot; @@ -3053,25 +3053,25 @@ int jfs_readdir(struct file *filp, void *dirent, filldir_t filldir)  			if (dtEmpty(ip) ||  			    (dir_index >= JFS_IP(ip)->next_index)) {  				/* Stale position.  Directory has shrunk */ -				filp->f_pos = DIREND; +				ctx->pos = DIREND;  				return 0;  			}  		      repeat:  			rc = read_index(ip, dir_index, &dirtab_slot);  			if (rc) { -				filp->f_pos = DIREND; +				ctx->pos = DIREND;  				return rc;  			}  			if (dirtab_slot.flag == DIR_INDEX_FREE) {  				if (loop_count++ > JFS_IP(ip)->next_index) {  					jfs_err("jfs_readdir detected "  						   "infinite loop!"); -					filp->f_pos = DIREND; +					ctx->pos = DIREND;  					return 0;  				}  				dir_index = le32_to_cpu(dirtab_slot.addr2);  				if (dir_index == -1) { -					filp->f_pos = DIREND; +					ctx->pos = DIREND;  					return 0;  				}  				goto repeat; @@ -3080,13 +3080,13 @@ int jfs_readdir(struct file *filp, void *dirent, filldir_t filldir)  			index = dirtab_slot.slot;  			DT_GETPAGE(ip, bn, mp, PSIZE, p, rc);  			if (rc) { -				filp->f_pos = DIREND; +				ctx->pos = DIREND;  				return 0;  			}  			if (p->header.flag & BT_INTERNAL) {  				jfs_err("jfs_readdir: bad index table");  				DT_PUTPAGE(mp); -				filp->f_pos = -1; +				ctx->pos = -1;  				return 0;  			}  		} else { @@ -3094,23 +3094,22 @@ int jfs_readdir(struct file *filp, void *dirent, filldir_t filldir)  				/*  				 * self "."  				 */ -				filp->f_pos = 0; -				if (filldir(dirent, ".", 1, 0, ip->i_ino, -					    DT_DIR)) +				ctx->pos = 0; +				if (!dir_emit(ctx, ".", 1, ip->i_ino, DT_DIR))  					return 0;  			}  			/*  			 * parent ".."  			 */ -			filp->f_pos = 1; -			if (filldir(dirent, "..", 2, 1, PARENT(ip), DT_DIR)) +			ctx->pos = 1; +			if (!dir_emit(ctx, "..", 2, PARENT(ip), DT_DIR))  				return 0;  			/*  			 * Find first entry of left-most leaf  			 */  			if (dtEmpty(ip)) { -				filp->f_pos = DIREND; +				ctx->pos = DIREND;  				return 0;  			} @@ -3128,23 +3127,19 @@ int jfs_readdir(struct file *filp, void *dirent, filldir_t filldir)  		 * pn > 0:		Real entries, pn=1 -> leftmost page  		 * pn = index = -1:	No more entries  		 */ -		dtpos = filp->f_pos; +		dtpos = ctx->pos;  		if (dtpos == 0) {  			/* build "." entry */ - -			if (filldir(dirent, ".", 1, filp->f_pos, ip->i_ino, -				    DT_DIR)) +			if (!dir_emit(ctx, ".", 1, ip->i_ino, DT_DIR))  				return 0;  			dtoffset->index = 1; -			filp->f_pos = dtpos; +			ctx->pos = dtpos;  		}  		if (dtoffset->pn == 0) {  			if (dtoffset->index == 1) {  				/* build ".." entry */ - -				if (filldir(dirent, "..", 2, filp->f_pos, -					    PARENT(ip), DT_DIR)) +				if (!dir_emit(ctx, "..", 2, PARENT(ip), DT_DIR))  					return 0;  			} else {  				jfs_err("jfs_readdir called with " @@ -3152,18 +3147,18 @@ int jfs_readdir(struct file *filp, void *dirent, filldir_t filldir)  			}  			dtoffset->pn = 1;  			dtoffset->index = 0; -			filp->f_pos = dtpos; +			ctx->pos = dtpos;  		}  		if (dtEmpty(ip)) { -			filp->f_pos = DIREND; +			ctx->pos = DIREND;  			return 0;  		} -		if ((rc = dtReadNext(ip, &filp->f_pos, &btstack))) { +		if ((rc = dtReadNext(ip, &ctx->pos, &btstack))) {  			jfs_err("jfs_readdir: unexpected rc = %d "  				"from dtReadNext", rc); -			filp->f_pos = DIREND; +			ctx->pos = DIREND;  			return 0;  		}  		/* get start leaf page and index */ @@ -3171,7 +3166,7 @@ int jfs_readdir(struct file *filp, void *dirent, filldir_t filldir)  		/* offset beyond directory eof ? */  		if (bn < 0) { -			filp->f_pos = DIREND; +			ctx->pos = DIREND;  			return 0;  		}  	} @@ -3180,7 +3175,7 @@ int jfs_readdir(struct file *filp, void *dirent, filldir_t filldir)  	if (dirent_buf == 0) {  		DT_PUTPAGE(mp);  		jfs_warn("jfs_readdir: __get_free_page failed!"); -		filp->f_pos = DIREND; +		ctx->pos = DIREND;  		return -ENOMEM;  	} @@ -3252,8 +3247,7 @@ int jfs_readdir(struct file *filp, void *dirent, filldir_t filldir)  				/* Sanity Check */  				if (d_namleft == 0) {  					jfs_error(ip->i_sb, -						  "JFS:Dtree error: ino = " -						  "%ld, bn=%Ld, index = %d", +						  "JFS:Dtree error: ino = %ld, bn=%lld, index = %d\n",  						  (long)ip->i_ino,  						  (long long)bn,  						  i); @@ -3295,9 +3289,9 @@ skip_one:  		jfs_dirent = (struct jfs_dirent *) dirent_buf;  		while (jfs_dirents--) { -			filp->f_pos = jfs_dirent->position; -			if (filldir(dirent, jfs_dirent->name, -				    jfs_dirent->name_len, filp->f_pos, +			ctx->pos = jfs_dirent->position; +			if (!dir_emit(ctx, jfs_dirent->name, +				    jfs_dirent->name_len,  				    jfs_dirent->ino, DT_UNKNOWN))  				goto out;  			jfs_dirent = next_jfs_dirent(jfs_dirent); @@ -3309,7 +3303,7 @@ skip_one:  		}  		if (!overflow && (bn == 0)) { -			filp->f_pos = DIREND; +			ctx->pos = DIREND;  			break;  		} @@ -3373,7 +3367,7 @@ static int dtReadFirst(struct inode *ip, struct btstack * btstack)  		 */  		if (BT_STACK_FULL(btstack)) {  			DT_PUTPAGE(mp); -			jfs_error(ip->i_sb, "dtReadFirst: btstack overrun"); +			jfs_error(ip->i_sb, "btstack overrun\n");  			BT_STACK_DUMP(btstack);  			return -EIO;  		} |