diff options
Diffstat (limited to 'fs/minix')
| -rw-r--r-- | fs/minix/dir.c | 42 | ||||
| -rw-r--r-- | fs/minix/namei.c | 13 | 
2 files changed, 32 insertions, 23 deletions
| diff --git a/fs/minix/dir.c b/fs/minix/dir.c index a9ed6f36e6ea..dfaf6fa9b7b5 100644 --- a/fs/minix/dir.c +++ b/fs/minix/dir.c @@ -16,12 +16,12 @@  typedef struct minix_dir_entry minix_dirent;  typedef struct minix3_dir_entry minix3_dirent; -static int minix_readdir(struct file *, void *, filldir_t); +static int minix_readdir(struct file *, struct dir_context *);  const struct file_operations minix_dir_operations = {  	.llseek		= generic_file_llseek,  	.read		= generic_read_dir, -	.readdir	= minix_readdir, +	.iterate	= minix_readdir,  	.fsync		= generic_file_fsync,  }; @@ -82,22 +82,23 @@ static inline void *minix_next_entry(void *de, struct minix_sb_info *sbi)  	return (void*)((char*)de + sbi->s_dirsize);  } -static int minix_readdir(struct file * filp, void * dirent, filldir_t filldir) +static int minix_readdir(struct file *file, struct dir_context *ctx)  { -	unsigned long pos = filp->f_pos; -	struct inode *inode = file_inode(filp); +	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);  	struct minix_sb_info *sbi = minix_sb(sb);  	unsigned chunk_size = sbi->s_dirsize; -	char *name; -	__u32 inumber; +	unsigned long npages = dir_pages(inode); +	unsigned long pos = ctx->pos; +	unsigned offset; +	unsigned long n; -	pos = (pos + chunk_size-1) & ~(chunk_size-1); +	ctx->pos = pos = ALIGN(pos, chunk_size);  	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 *p, *kaddr, *limit; @@ -109,6 +110,8 @@ static int minix_readdir(struct file * filp, void * dirent, filldir_t filldir)  		p = kaddr+offset;  		limit = kaddr + minix_last_byte(inode, n) - chunk_size;  		for ( ; p <= limit; p = minix_next_entry(p, sbi)) { +			const char *name; +			__u32 inumber;  			if (sbi->s_version == MINIX_V3) {  				minix3_dirent *de3 = (minix3_dirent *)p;  				name = de3->name; @@ -119,24 +122,17 @@ static int minix_readdir(struct file * filp, void * dirent, filldir_t filldir)  				inumber = de->inode;  			}  			if (inumber) { -				int over; -  				unsigned l = strnlen(name, sbi->s_namelen); -				offset = p - kaddr; -				over = filldir(dirent, name, l, -					(n << PAGE_CACHE_SHIFT) | offset, -					inumber, DT_UNKNOWN); -				if (over) { +				if (!dir_emit(ctx, name, l, +					      inumber, DT_UNKNOWN)) {  					dir_put_page(page); -					goto done; +					return 0;  				}  			} +			ctx->pos += chunk_size;  		}  		dir_put_page(page);  	} - -done: -	filp->f_pos = (n << PAGE_CACHE_SHIFT) | offset;  	return 0;  } diff --git a/fs/minix/namei.c b/fs/minix/namei.c index 0db73d9dd668..cd950e2331b6 100644 --- a/fs/minix/namei.c +++ b/fs/minix/namei.c @@ -54,6 +54,18 @@ static int minix_mknod(struct inode * dir, struct dentry *dentry, umode_t mode,  	return error;  } +static int minix_tmpfile(struct inode *dir, struct dentry *dentry, umode_t mode) +{ +	int error; +	struct inode *inode = minix_new_inode(dir, mode, &error); +	if (inode) { +		minix_set_inode(inode, 0); +		mark_inode_dirty(inode); +		d_tmpfile(dentry, inode); +	} +	return error; +} +  static int minix_create(struct inode *dir, struct dentry *dentry, umode_t mode,  		bool excl)  { @@ -254,4 +266,5 @@ const struct inode_operations minix_dir_inode_operations = {  	.mknod		= minix_mknod,  	.rename		= minix_rename,  	.getattr	= minix_getattr, +	.tmpfile	= minix_tmpfile,  }; |