diff options
Diffstat (limited to 'fs/bfs/dir.c')
| -rw-r--r-- | fs/bfs/dir.c | 47 | 
1 files changed, 20 insertions, 27 deletions
diff --git a/fs/bfs/dir.c b/fs/bfs/dir.c index 685ecff3ab3..a399e6d9dc7 100644 --- a/fs/bfs/dir.c +++ b/fs/bfs/dir.c @@ -26,66 +26,59 @@ static struct buffer_head *bfs_find_entry(struct inode *dir,  				const unsigned char *name, int namelen,  				struct bfs_dirent **res_dir); -static int bfs_readdir(struct file *f, void *dirent, filldir_t filldir) +static int bfs_readdir(struct file *f, struct dir_context *ctx)  { -	struct inode *dir = f->f_path.dentry->d_inode; +	struct inode *dir = file_inode(f);  	struct buffer_head *bh;  	struct bfs_dirent *de; -	struct bfs_sb_info *info = BFS_SB(dir->i_sb);  	unsigned int offset;  	int block; -	mutex_lock(&info->bfs_lock); - -	if (f->f_pos & (BFS_DIRENT_SIZE - 1)) { +	if (ctx->pos & (BFS_DIRENT_SIZE - 1)) {  		printf("Bad f_pos=%08lx for %s:%08lx\n", -					(unsigned long)f->f_pos, +					(unsigned long)ctx->pos,  					dir->i_sb->s_id, dir->i_ino); -		mutex_unlock(&info->bfs_lock); -		return -EBADF; +		return -EINVAL;  	} -	while (f->f_pos < dir->i_size) { -		offset = f->f_pos & (BFS_BSIZE - 1); -		block = BFS_I(dir)->i_sblock + (f->f_pos >> BFS_BSIZE_BITS); +	while (ctx->pos < dir->i_size) { +		offset = ctx->pos & (BFS_BSIZE - 1); +		block = BFS_I(dir)->i_sblock + (ctx->pos >> BFS_BSIZE_BITS);  		bh = sb_bread(dir->i_sb, block);  		if (!bh) { -			f->f_pos += BFS_BSIZE - offset; +			ctx->pos += BFS_BSIZE - offset;  			continue;  		}  		do {  			de = (struct bfs_dirent *)(bh->b_data + offset);  			if (de->ino) {  				int size = strnlen(de->name, BFS_NAMELEN); -				if (filldir(dirent, de->name, size, f->f_pos, +				if (!dir_emit(ctx, de->name, size,  						le16_to_cpu(de->ino), -						DT_UNKNOWN) < 0) { +						DT_UNKNOWN)) {  					brelse(bh); -					mutex_unlock(&info->bfs_lock);  					return 0;  				}  			}  			offset += BFS_DIRENT_SIZE; -			f->f_pos += BFS_DIRENT_SIZE; -		} while ((offset < BFS_BSIZE) && (f->f_pos < dir->i_size)); +			ctx->pos += BFS_DIRENT_SIZE; +		} while ((offset < BFS_BSIZE) && (ctx->pos < dir->i_size));  		brelse(bh);  	} - -	mutex_unlock(&info->bfs_lock); -	return 0;	 +	return 0;  }  const struct file_operations bfs_dir_operations = {  	.read		= generic_read_dir, -	.readdir	= bfs_readdir, +	.iterate	= bfs_readdir,  	.fsync		= generic_file_fsync,  	.llseek		= generic_file_llseek,  };  extern void dump_imap(const char *, struct super_block *); -static int bfs_create(struct inode *dir, struct dentry *dentry, int mode, -						struct nameidata *nd) +static int bfs_create(struct inode *dir, struct dentry *dentry, umode_t mode, +						bool excl)  {  	int err;  	struct inode *inode; @@ -97,7 +90,7 @@ static int bfs_create(struct inode *dir, struct dentry *dentry, int mode,  	if (!inode)  		return -ENOSPC;  	mutex_lock(&info->bfs_lock); -	ino = find_first_zero_bit(info->si_imap, info->si_lasti); +	ino = find_first_zero_bit(info->si_imap, info->si_lasti + 1);  	if (ino > info->si_lasti) {  		mutex_unlock(&info->bfs_lock);  		iput(inode); @@ -133,7 +126,7 @@ static int bfs_create(struct inode *dir, struct dentry *dentry, int mode,  }  static struct dentry *bfs_lookup(struct inode *dir, struct dentry *dentry, -						struct nameidata *nd) +						unsigned int flags)  {  	struct inode *inode = NULL;  	struct buffer_head *bh; @@ -199,7 +192,7 @@ static int bfs_unlink(struct inode *dir, struct dentry *dentry)  		printf("unlinking non-existent file %s:%lu (nlink=%d)\n",  					inode->i_sb->s_id, inode->i_ino,  					inode->i_nlink); -		inode->i_nlink = 1; +		set_nlink(inode, 1);  	}  	de->ino = 0;  	mark_buffer_dirty_inode(bh, dir);  | 
