diff options
Diffstat (limited to 'fs/sysv/dir.c')
| -rw-r--r-- | fs/sysv/dir.c | 37 | 
1 files changed, 16 insertions, 21 deletions
diff --git a/fs/sysv/dir.c b/fs/sysv/dir.c index a77c4215762..d42291d0821 100644 --- a/fs/sysv/dir.c +++ b/fs/sysv/dir.c @@ -18,12 +18,12 @@  #include <linux/swap.h>  #include "sysv.h" -static int sysv_readdir(struct file *, void *, filldir_t); +static int sysv_readdir(struct file *, struct dir_context *);  const struct file_operations sysv_dir_operations = {  	.llseek		= generic_file_llseek,  	.read		= generic_read_dir, -	.readdir	= sysv_readdir, +	.iterate	= sysv_readdir,  	.fsync		= generic_file_fsync,  }; @@ -65,18 +65,21 @@ static struct page * dir_get_page(struct inode *dir, unsigned long n)  	return page;  } -static int sysv_readdir(struct file * filp, void * dirent, filldir_t filldir) +static int sysv_readdir(struct file *file, struct dir_context *ctx)  { -	unsigned long pos = filp->f_pos; -	struct inode *inode = filp->f_path.dentry->d_inode; +	unsigned long pos = ctx->pos; +	struct inode *inode = file_inode(file);  	struct super_block *sb = inode->i_sb; -	unsigned offset = pos & ~PAGE_CACHE_MASK; -	unsigned long n = pos >> PAGE_CACHE_SHIFT;  	unsigned long npages = dir_pages(inode); +	unsigned offset; +	unsigned long n; -	pos = (pos + SYSV_DIRSIZE-1) & ~(SYSV_DIRSIZE-1); +	ctx->pos = pos = (pos + SYSV_DIRSIZE-1) & ~(SYSV_DIRSIZE-1);  	if (pos >= inode->i_size) -		goto done; +		return 0; + +	offset = pos & ~PAGE_CACHE_MASK; +	n = pos >> PAGE_CACHE_SHIFT;  	for ( ; n < npages; n++, offset = 0) {  		char *kaddr, *limit; @@ -88,29 +91,21 @@ static int sysv_readdir(struct file * filp, void * dirent, filldir_t filldir)  		kaddr = (char *)page_address(page);  		de = (struct sysv_dir_entry *)(kaddr+offset);  		limit = kaddr + PAGE_CACHE_SIZE - SYSV_DIRSIZE; -		for ( ;(char*)de <= limit; de++) { +		for ( ;(char*)de <= limit; de++, ctx->pos += sizeof(*de)) {  			char *name = de->name; -			int over;  			if (!de->inode)  				continue; -			offset = (char *)de - kaddr; - -			over = filldir(dirent, name, strnlen(name,SYSV_NAMELEN), -					((loff_t)n<<PAGE_CACHE_SHIFT) | offset, +			if (!dir_emit(ctx, name, strnlen(name,SYSV_NAMELEN),  					fs16_to_cpu(SYSV_SB(sb), de->inode), -					DT_UNKNOWN); -			if (over) { +					DT_UNKNOWN)) {  				dir_put_page(page); -				goto done; +				return 0;  			}  		}  		dir_put_page(page);  	} - -done: -	filp->f_pos = ((loff_t)n << PAGE_CACHE_SHIFT) | offset;  	return 0;  }  | 
