Loading fs/bfs/dir.c +14 −21 Original line number Diff line number Diff line Loading @@ -26,58 +26,51 @@ 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 = 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; } 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, }; Loading Loading
fs/bfs/dir.c +14 −21 Original line number Diff line number Diff line Loading @@ -26,58 +26,51 @@ 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 = 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; } 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, }; Loading