--- linux/fs/minix/file_dev.c 2018/04/24 18:03:51 1.1.1.1 +++ linux/fs/minix/file_dev.c 2018/04/24 18:06:03 1.1.1.3 @@ -6,6 +6,8 @@ #include #include +#include +#include #include #include @@ -15,6 +17,49 @@ #define MIN(a,b) (((a)<(b))?(a):(b)) #define MAX(a,b) (((a)>(b))?(a):(b)) +int minix_readdir(struct inode * inode, struct file * filp, struct dirent * dirent) +{ + unsigned int block,offset,i; + char c; + struct buffer_head * bh; + struct minix_dir_entry * de; + + if (!S_ISDIR(inode->i_mode)) + return -EBADF; + if (filp->f_pos & 15) + return -EBADF; + while (filp->f_pos < inode->i_size) { + offset = filp->f_pos & 1023; + block = minix_bmap(inode,(filp->f_pos)>>BLOCK_SIZE_BITS); + if (!block || !(bh = bread(inode->i_dev,block))) { + filp->f_pos += 1024-offset; + continue; + } + de = (struct minix_dir_entry *) (offset + bh->b_data); + while (offset < 1024 && filp->f_pos < inode->i_size) { + offset += 16; + filp->f_pos += 16; + if (de->inode) { + for (i = 0; i < 14; i++) + if (c = de->name[i]) + put_fs_byte(c,i+dirent->d_name); + else + break; + if (i) { + put_fs_long(de->inode,&dirent->d_ino); + put_fs_byte(0,i+dirent->d_name); + put_fs_word(i,&dirent->d_reclen); + brelse(bh); + return i; + } + } + de++; + } + brelse(bh); + } + return 0; +} + int minix_file_read(struct inode * inode, struct file * filp, char * buf, int count) { int read,left,chars,nr; @@ -28,7 +73,7 @@ int minix_file_read(struct inode * inode left = count; read = 0; while (left > 0) { - if (nr = bmap(inode,(filp->f_pos)>>BLOCK_SIZE_BITS)) { + if (nr = minix_bmap(inode,(filp->f_pos)>>BLOCK_SIZE_BITS)) { if (!(bh=bread(inode->i_dev,nr))) return read?read:-EIO; } else @@ -39,9 +84,8 @@ int minix_file_read(struct inode * inode left -= chars; read += chars; if (bh) { - char * p = nr + bh->b_data; - while (chars-->0) - put_fs_byte(*(p++),buf++); + memcpy_tofs(buf,nr+bh->b_data,chars); + buf += chars; brelse(bh); } else { while (chars-->0) @@ -81,7 +125,6 @@ int minix_file_write(struct inode * inod } c = pos % BLOCK_SIZE; p = c + bh->b_data; - bh->b_dirt = 1; c = BLOCK_SIZE-c; if (c > count-written) c = count-written; @@ -91,15 +134,16 @@ int minix_file_write(struct inode * inod inode->i_dirt = 1; } written += c; - while (c-->0) - *(p++) = get_fs_byte(buf++); + memcpy_fromfs(p,buf,c); + buf += c; + bh->b_dirt = 1; brelse(bh); } inode->i_mtime = CURRENT_TIME; if (!(filp->f_flags & O_APPEND)) { filp->f_pos = pos; inode->i_ctime = CURRENT_TIME; - inode->i_dirt = 1; } + inode->i_dirt = 1; return written; }