diff options
| author | Al Viro <viro@zeniv.linux.org.uk> | 2013-05-17 17:00:34 -0400 | 
|---|---|---|
| committer | Al Viro <viro@zeniv.linux.org.uk> | 2013-06-29 12:56:42 +0400 | 
| commit | 070a0ebf42e15c9c595fc2ceac06100d60ced8f0 (patch) | |
| tree | 7197f65bcd4fc85b543f95961425ec70c8438528 /fs/jfs | |
| parent | 77acfa29e10cc859cc165963093a83f754598b03 (diff) | |
| download | linux-070a0ebf42e15c9c595fc2ceac06100d60ced8f0.tar.bz2 | |
[readdir] convert jfs
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs/jfs')
| -rw-r--r-- | fs/jfs/jfs_dtree.c | 63 | ||||
| -rw-r--r-- | fs/jfs/jfs_dtree.h | 2 | ||||
| -rw-r--r-- | fs/jfs/namei.c | 2 | 
3 files changed, 31 insertions, 36 deletions
| diff --git a/fs/jfs/jfs_dtree.c b/fs/jfs/jfs_dtree.c index 0ddbeceafc62..9f4ed13d9f15 100644 --- a/fs/jfs/jfs_dtree.c +++ b/fs/jfs/jfs_dtree.c @@ -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;  	} @@ -3295,9 +3290,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 +3304,7 @@ skip_one:  		}  		if (!overflow && (bn == 0)) { -			filp->f_pos = DIREND; +			ctx->pos = DIREND;  			break;  		} diff --git a/fs/jfs/jfs_dtree.h b/fs/jfs/jfs_dtree.h index 2545bb317235..fd4169e6e698 100644 --- a/fs/jfs/jfs_dtree.h +++ b/fs/jfs/jfs_dtree.h @@ -265,5 +265,5 @@ extern int dtDelete(tid_t tid, struct inode *ip, struct component_name * key,  extern int dtModify(tid_t tid, struct inode *ip, struct component_name * key,  		    ino_t * orig_ino, ino_t new_ino, int flag); -extern int jfs_readdir(struct file *filp, void *dirent, filldir_t filldir); +extern int jfs_readdir(struct file *file, struct dir_context *ctx);  #endif				/* !_H_JFS_DTREE */ diff --git a/fs/jfs/namei.c b/fs/jfs/namei.c index 3b91a7ad6086..89186b7b9002 100644 --- a/fs/jfs/namei.c +++ b/fs/jfs/namei.c @@ -1529,7 +1529,7 @@ const struct inode_operations jfs_dir_inode_operations = {  const struct file_operations jfs_dir_operations = {  	.read		= generic_read_dir, -	.readdir	= jfs_readdir, +	.iterate	= jfs_readdir,  	.fsync		= jfs_fsync,  	.unlocked_ioctl = jfs_ioctl,  #ifdef CONFIG_COMPAT |