Messages in this thread Patch in this message | ![/](/images/icornerl.gif) | | Date | Fri, 30 May 2003 14:21:12 +0100 | From | "Stephen C. Tweedie" <> | Subject | Re: 2.4 bug: fifo-write causes diskwrites to read-only fs ! |
| |
Hi,
On Wed, May 28, 2003 at 10:52:30PM +0200, Rob van Nieuwkerk wrote:
> I don't have the POSIX spec, but maybe it specifies what "read-only" > is supposed to mean somewhere too ..
SingleUnix says:
http://www.opengroup.org/onlinepubs/007904975/basedefs/xbd_chap04.html#tag_04_07
"Marks for update, and updates themselves, are not done for files on read-only file systems"
So we're wrong here. Patch below fixes it for me for 2.4.
Cheers, Stephen --- linux-2.4-odirect/fs/inode.c.=K0004=.orig +++ linux-2.4-odirect/fs/inode.c @@ -1194,6 +1194,24 @@ void update_atime (struct inode *inode) mark_inode_dirty_sync (inode); } /* End Function update_atime */ +/** + * update_mctime - update the mtime and ctime + * @inode: inode accessed + * + * Update the modified and changed times on an inode for writes to special + * files such as fifos. No change is forced if the timestamps are already + * up-to-date or if the filesystem is readonly. + */ + +void update_mctime (struct inode *inode) +{ + if (inode->i_mtime == CURRENT_TIME && inode->i_ctime == CURRENT_TIME) + return; + if ( IS_RDONLY (inode) ) return; + inode->i_ctime = inode->i_mtime = CURRENT_TIME; + mark_inode_dirty (inode); +} /* End Function update_mctime */ + /* * Quota functions that want to walk the inode lists.. --- linux-2.4-odirect/fs/pipe.c.=K0004=.orig +++ linux-2.4-odirect/fs/pipe.c @@ -230,8 +230,7 @@ pipe_write(struct file *filp, const char /* Signal readers asynchronously that there is more data. */ wake_up_interruptible(PIPE_WAIT(*inode)); - inode->i_ctime = inode->i_mtime = CURRENT_TIME; - mark_inode_dirty(inode); + update_mctime(inode); out: up(PIPE_SEM(*inode)); --- linux-2.4-odirect/include/linux/fs.h.=K0004=.orig +++ linux-2.4-odirect/include/linux/fs.h @@ -201,6 +201,7 @@ extern int leases_enable, dir_notify_ena #include <asm/byteorder.h> extern void update_atime (struct inode *); +extern void update_mctime (struct inode *); #define UPDATE_ATIME(inode) update_atime (inode) extern void buffer_init(unsigned long); | ![\](/images/icornerr.gif) |