--- linux/fs/minix/file.c 2018/04/24 18:07:13 1.1 +++ linux/fs/minix/file.c 2018/04/24 18:14:25 1.1.1.5 @@ -1,21 +1,20 @@ /* - * linux/fs/minix/file.c + * linux/fs/minix/file.c * - * minix regular file handling primitives + * Copyright (C) 1991, 1992 Linus Torvalds + * + * minix regular file handling primitives */ -#include -#include - -#include -#include - #include #include #include #include #include +#include +#include +#include #define NBUF 16 @@ -25,6 +24,14 @@ #include #include +static inline void wait_on_buffer(struct buffer_head * bh) +{ + cli(); + while (bh->b_lock) + sleep_on(&bh->b_wait); + sti(); +} + int minix_file_read(struct inode *, struct file *, char *, int); static int minix_file_write(struct inode *, struct file *, char *, int); @@ -60,14 +67,6 @@ struct inode_operations minix_file_inode minix_truncate /* truncate */ }; -static inline void wait_on_buffer(struct buffer_head * bh) -{ - cli(); - while (bh->b_lock) - sleep_on(&bh->b_wait); - sti(); -} - /* * minix_file_read() is also needed by the directory read-routine, * so it's not static. NOTE! reading directories directly is a bad idea, @@ -76,7 +75,7 @@ static inline void wait_on_buffer(struct */ int minix_file_read(struct inode * inode, struct file * filp, char * buf, int count) { - int read,left,chars,nr; + int read,left,chars; int block, blocks, offset; struct buffer_head ** bhb, ** bhe; struct buffer_head * buflist[NBUF]; @@ -105,12 +104,9 @@ int minix_file_read(struct inode * inode do { if (blocks) { --blocks; - if (nr = minix_bmap(inode,block++)) { - *bhb = getblk(inode->i_dev,nr); - if (!(*bhb)->b_uptodate) - ll_rw_block(READ,*bhb); - } else - *bhb = NULL; + *bhb = minix_getblk(inode,block++,0); + if (*bhb && !(*bhb)->b_uptodate) + ll_rw_block(READ,*bhb); if (++bhb == &buflist[NBUF]) bhb = buflist; @@ -151,15 +147,17 @@ int minix_file_read(struct inode * inode } while (left > 0); if (!read) return -EIO; - inode->i_atime = CURRENT_TIME; - inode->i_dirt = 1; + if (!IS_RDONLY(inode)) { + inode->i_atime = CURRENT_TIME; + inode->i_dirt = 1; + } return read; } static int minix_file_write(struct inode * inode, struct file * filp, char * buf, int count) { off_t pos; - int written,block,c; + int written,c; struct buffer_head * bh; char * p; @@ -181,7 +179,8 @@ static int minix_file_write(struct inode pos = filp->f_pos; written = 0; while (written count-written) c = count-written; - if (c == BLOCK_SIZE) - bh = getblk(inode->i_dev, block); - else - bh = bread(inode->i_dev,block); - if (!bh) { - if (!written) - written = -EIO; - break; + if (c != BLOCK_SIZE && !bh->b_uptodate) { + ll_rw_block(READ,bh); + wait_on_buffer(bh); + if (!bh->b_uptodate) { + brelse(bh); + if (!written) + written = -EIO; + break; + } } p = (pos % BLOCK_SIZE) + bh->b_data; pos += c; @@ -212,10 +212,8 @@ static int minix_file_write(struct inode brelse(bh); } inode->i_mtime = CURRENT_TIME; - if (!(filp->f_flags & O_APPEND)) { - filp->f_pos = pos; - inode->i_ctime = CURRENT_TIME; - } + inode->i_ctime = CURRENT_TIME; + filp->f_pos = pos; inode->i_dirt = 1; return written; }