Commit 81b9f66e authored by Al Viro's avatar Al Viro

[readdir] convert bfs

... and get rid of that ridiculous mutex in bfs_readdir()
Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent f0c3b509
...@@ -26,58 +26,51 @@ static struct buffer_head *bfs_find_entry(struct inode *dir, ...@@ -26,58 +26,51 @@ static struct buffer_head *bfs_find_entry(struct inode *dir,
const unsigned char *name, int namelen, const unsigned char *name, int namelen,
struct bfs_dirent **res_dir); 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 = file_inode(f); struct inode *dir = file_inode(f);
struct buffer_head *bh; struct buffer_head *bh;
struct bfs_dirent *de; struct bfs_dirent *de;
struct bfs_sb_info *info = BFS_SB(dir->i_sb);
unsigned int offset; unsigned int offset;
int block; int block;
mutex_lock(&info->bfs_lock); if (ctx->pos & (BFS_DIRENT_SIZE - 1)) {
if (f->f_pos & (BFS_DIRENT_SIZE - 1)) {
printf("Bad f_pos=%08lx for %s:%08lx\n", 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); dir->i_sb->s_id, dir->i_ino);
mutex_unlock(&info->bfs_lock); return -EINVAL;
return -EBADF;
} }
while (f->f_pos < dir->i_size) { while (ctx->pos < dir->i_size) {
offset = f->f_pos & (BFS_BSIZE - 1); offset = ctx->pos & (BFS_BSIZE - 1);
block = BFS_I(dir)->i_sblock + (f->f_pos >> BFS_BSIZE_BITS); block = BFS_I(dir)->i_sblock + (ctx->pos >> BFS_BSIZE_BITS);
bh = sb_bread(dir->i_sb, block); bh = sb_bread(dir->i_sb, block);
if (!bh) { if (!bh) {
f->f_pos += BFS_BSIZE - offset; ctx->pos += BFS_BSIZE - offset;
continue; continue;
} }
do { do {
de = (struct bfs_dirent *)(bh->b_data + offset); de = (struct bfs_dirent *)(bh->b_data + offset);
if (de->ino) { if (de->ino) {
int size = strnlen(de->name, BFS_NAMELEN); 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), le16_to_cpu(de->ino),
DT_UNKNOWN) < 0) { DT_UNKNOWN)) {
brelse(bh); brelse(bh);
mutex_unlock(&info->bfs_lock);
return 0; return 0;
} }
} }
offset += BFS_DIRENT_SIZE; offset += BFS_DIRENT_SIZE;
f->f_pos += BFS_DIRENT_SIZE; ctx->pos += BFS_DIRENT_SIZE;
} while ((offset < BFS_BSIZE) && (f->f_pos < dir->i_size)); } while ((offset < BFS_BSIZE) && (ctx->pos < dir->i_size));
brelse(bh); brelse(bh);
} }
mutex_unlock(&info->bfs_lock);
return 0; return 0;
} }
const struct file_operations bfs_dir_operations = { const struct file_operations bfs_dir_operations = {
.read = generic_read_dir, .read = generic_read_dir,
.readdir = bfs_readdir, .iterate = bfs_readdir,
.fsync = generic_file_fsync, .fsync = generic_file_fsync,
.llseek = generic_file_llseek, .llseek = generic_file_llseek,
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment