The pipe code is ignoring IS_RDONLY(). fs/inode.c | 7 ++++++- fs/pipe.c | 6 ++---- 2 files changed, 8 insertions(+), 5 deletions(-) diff -puN fs/pipe.c~pipe-rofs-fix fs/pipe.c --- 25/fs/pipe.c~pipe-rofs-fix 2003-08-08 03:34:59.000000000 -0700 +++ 25-akpm/fs/pipe.c 2003-08-08 03:34:59.000000000 -0700 @@ -208,10 +208,8 @@ pipe_write(struct file *filp, const char wake_up_interruptible(PIPE_WAIT(*inode)); kill_fasync(PIPE_FASYNC_READERS(*inode), SIGIO, POLL_IN); } - if (ret > 0) { - inode->i_ctime = inode->i_mtime = CURRENT_TIME; - mark_inode_dirty(inode); - } + if (ret > 0) + inode_update_time(inode, 1); /* mtime and ctime */ return ret; } diff -puN fs/inode.c~pipe-rofs-fix fs/inode.c --- 25/fs/inode.c~pipe-rofs-fix 2003-08-08 03:37:03.000000000 -0700 +++ 25-akpm/fs/inode.c 2003-08-08 03:37:41.000000000 -0700 @@ -1150,9 +1150,14 @@ void update_atime(struct inode *inode) void inode_update_time(struct inode *inode, int ctime_too) { - struct timespec now = current_kernel_time(); + struct timespec now; int sync_it = 0; + if (IS_RDONLY(inode)) + return; + + now = current_kernel_time(); + if (inode_times_differ(inode, &inode->i_mtime, &now)) sync_it = 1; inode->i_mtime = now; _