linux-fsdevel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] fs: block pipe_write() on a frozen filesystem
@ 2012-09-27 15:47 Eric Sandeen
  2012-10-01 15:34 ` Jan Kara
  2013-04-02 12:38 ` [PATCH] fs: block pipe_write() on a frozen filesystem PING Dmitry Monakhov
  0 siblings, 2 replies; 5+ messages in thread
From: Eric Sandeen @ 2012-09-27 15:47 UTC (permalink / raw)
  To: linux-fsdevel@vger.kernel.org
  Cc: Jan Kara, Fernando Luis Vazquez Cao, Al Viro

I noticed that this can sneak past a frozen filesystem:

# mkfifo /mnt/test/fifo
# echo foo > /mnt/test/fifo &
# fsfreeze -f /mnt/test
# cat /mnt/test/fifo

and we get a warning that jbd2 has entered a transaction while frozen:

WARNING: at fs/ext4/super.c:240 ext4_journal_start_sb+0xce/0xe0 [ext4]() (Not tainted)

which is: WARN_ON(sb->s_writers.frozen == SB_FREEZE_COMPLETE);

and we get there via the file_update_time() path in pipe_write().

Signed-off-by: Eric Sandeen <sandeen@redhat.com>
---

Is this too big a hammer?  file_update_time() is conditional...

diff --git a/fs/pipe.c b/fs/pipe.c
index 8d85d70..d19a709 100644
--- a/fs/pipe.c
+++ b/fs/pipe.c
@@ -501,6 +501,7 @@ pipe_write(struct kiocb *iocb, const struct iovec *_iov,
 
 	do_wakeup = 0;
 	ret = 0;
+	sb_start_write(inode->i_sb);
 	mutex_lock(&inode->i_mutex);
 	pipe = inode->i_pipe;
 
@@ -659,6 +660,7 @@ out:
 		if (err)
 			ret = err;
 	}
+	sb_end_write(inode->i_sb);
 	return ret;
 }
 


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH] fs: block pipe_write() on a frozen filesystem
  2012-09-27 15:47 [PATCH] fs: block pipe_write() on a frozen filesystem Eric Sandeen
@ 2012-10-01 15:34 ` Jan Kara
  2013-04-02 12:38 ` [PATCH] fs: block pipe_write() on a frozen filesystem PING Dmitry Monakhov
  1 sibling, 0 replies; 5+ messages in thread
From: Jan Kara @ 2012-10-01 15:34 UTC (permalink / raw)
  To: Eric Sandeen
  Cc: linux-fsdevel@vger.kernel.org, Jan Kara,
	Fernando Luis Vazquez Cao, Al Viro

On Thu 27-09-12 10:47:59, Eric Sandeen wrote:
> I noticed that this can sneak past a frozen filesystem:
> 
> # mkfifo /mnt/test/fifo
> # echo foo > /mnt/test/fifo &
> # fsfreeze -f /mnt/test
> # cat /mnt/test/fifo
> 
> and we get a warning that jbd2 has entered a transaction while frozen:
> 
> WARNING: at fs/ext4/super.c:240 ext4_journal_start_sb+0xce/0xe0 [ext4]() (Not tainted)
> 
> which is: WARN_ON(sb->s_writers.frozen == SB_FREEZE_COMPLETE);
> 
> and we get there via the file_update_time() path in pipe_write().
> 
> Signed-off-by: Eric Sandeen <sandeen@redhat.com>
> ---
> 
> Is this too big a hammer?  file_update_time() is conditional...
  I think your patch is fine. Just skipping update of mtime could cause
userspace issues (although they seem rather unlikely to me). So you can add
  Reviewed-by: Jan Kara <jack@suse.cz>

								Honza

> 
> diff --git a/fs/pipe.c b/fs/pipe.c
> index 8d85d70..d19a709 100644
> --- a/fs/pipe.c
> +++ b/fs/pipe.c
> @@ -501,6 +501,7 @@ pipe_write(struct kiocb *iocb, const struct iovec *_iov,
>  
>  	do_wakeup = 0;
>  	ret = 0;
> +	sb_start_write(inode->i_sb);
>  	mutex_lock(&inode->i_mutex);
>  	pipe = inode->i_pipe;
>  
> @@ -659,6 +660,7 @@ out:
>  		if (err)
>  			ret = err;
>  	}
> +	sb_end_write(inode->i_sb);
>  	return ret;
>  }
>  
> 

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] fs: block pipe_write() on a frozen filesystem PING..
  2012-09-27 15:47 [PATCH] fs: block pipe_write() on a frozen filesystem Eric Sandeen
  2012-10-01 15:34 ` Jan Kara
@ 2013-04-02 12:38 ` Dmitry Monakhov
  2013-04-02 19:57   ` Al Viro
  1 sibling, 1 reply; 5+ messages in thread
From: Dmitry Monakhov @ 2013-04-02 12:38 UTC (permalink / raw)
  To: Eric Sandeen, linux-fsdevel@vger.kernel.org
  Cc: Jan Kara, Fernando Luis Vazquez Cao, Al Viro

On Thu, 27 Sep 2012 10:47:59 -0500, Eric Sandeen <sandeen@redhat.com> wrote:
> I noticed that this can sneak past a frozen filesystem:
Ping.. any body want to take care about that patch?
> 
> # mkfifo /mnt/test/fifo
> # echo foo > /mnt/test/fifo &
> # fsfreeze -f /mnt/test
> # cat /mnt/test/fifo
> 
> and we get a warning that jbd2 has entered a transaction while frozen:
> 
> WARNING: at fs/ext4/super.c:240 ext4_journal_start_sb+0xce/0xe0 [ext4]() (Not tainted)
> 
> which is: WARN_ON(sb->s_writers.frozen == SB_FREEZE_COMPLETE);
> 
> and we get there via the file_update_time() path in pipe_write().
> 
> Signed-off-by: Eric Sandeen <sandeen@redhat.com>
> ---
> 
> Is this too big a hammer?  file_update_time() is conditional...
> 
> diff --git a/fs/pipe.c b/fs/pipe.c
> index 8d85d70..d19a709 100644
> --- a/fs/pipe.c
> +++ b/fs/pipe.c
> @@ -501,6 +501,7 @@ pipe_write(struct kiocb *iocb, const struct iovec *_iov,
>  
>  	do_wakeup = 0;
>  	ret = 0;
> +	sb_start_write(inode->i_sb);
>  	mutex_lock(&inode->i_mutex);
>  	pipe = inode->i_pipe;
>  
> @@ -659,6 +660,7 @@ out:
>  		if (err)
>  			ret = err;
>  	}
> +	sb_end_write(inode->i_sb);
>  	return ret;
>  }
>  
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] fs: block pipe_write() on a frozen filesystem PING..
  2013-04-02 12:38 ` [PATCH] fs: block pipe_write() on a frozen filesystem PING Dmitry Monakhov
@ 2013-04-02 19:57   ` Al Viro
  2013-04-02 20:30     ` Dmitry Monakhov
  0 siblings, 1 reply; 5+ messages in thread
From: Al Viro @ 2013-04-02 19:57 UTC (permalink / raw)
  To: Dmitry Monakhov
  Cc: Eric Sandeen, linux-fsdevel@vger.kernel.org, Jan Kara,
	Fernando Luis Vazquez Cao

On Tue, Apr 02, 2013 at 04:38:22PM +0400, Dmitry Monakhov wrote:
> On Thu, 27 Sep 2012 10:47:59 -0500, Eric Sandeen <sandeen@redhat.com> wrote:
> > I noticed that this can sneak past a frozen filesystem:
> Ping.. any body want to take care about that patch?

NAK.  Note that writing to FIFO that sits on filesystem that is outright
read-only is allowed just fine; blocking it for frozen ones is bogus.

IOW, it should be treated the same way we treat touch_atime().  Moreover,
it should only be done around file_update_time().  With trylock.

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] fs: block pipe_write() on a frozen filesystem PING..
  2013-04-02 19:57   ` Al Viro
@ 2013-04-02 20:30     ` Dmitry Monakhov
  0 siblings, 0 replies; 5+ messages in thread
From: Dmitry Monakhov @ 2013-04-02 20:30 UTC (permalink / raw)
  To: Al Viro
  Cc: Eric Sandeen, linux-fsdevel@vger.kernel.org, Jan Kara,
	Fernando Luis Vazquez Cao

[-- Attachment #1: Type: text/plain, Size: 692 bytes --]

On Tue, 2 Apr 2013 20:57:27 +0100, Al Viro <viro@ZenIV.linux.org.uk> wrote:
> On Tue, Apr 02, 2013 at 04:38:22PM +0400, Dmitry Monakhov wrote:
> > On Thu, 27 Sep 2012 10:47:59 -0500, Eric Sandeen <sandeen@redhat.com> wrote:
> > > I noticed that this can sneak past a frozen filesystem:
> > Ping.. any body want to take care about that patch?
> 
> NAK.  Note that writing to FIFO that sits on filesystem that is outright
> read-only is allowed just fine; blocking it for frozen ones is bogus.
> 
> IOW, it should be treated the same way we treat touch_atime().  Moreover,
> it should only be done around file_update_time().  With trylock.
Ok fair enough.
Please take a look at updated version

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-PATCH-fs-skip-mtime-update-for-fifo-on-a-frozen-file.patch --]
[-- Type: text/x-patch, Size: 1421 bytes --]

>From c01acb73b8dc9e7a891b8f087ad3eb53bb06d270 Mon Sep 17 00:00:00 2001
From: Dmitry Monakhov <dmonakhov@openvz.org>
Date: Wed, 3 Apr 2013 00:19:15 +0400
Subject: [PATCH] [PATCH] fs: skip mtime update for fifo on a frozen filesystem

Eric noticed that this can sneak past a frozen filesystem:
# mkfifo /mnt/test/fifo
# echo foo > /mnt/test/fifo &
# fsfreeze -f /mnt/test
# cat /mnt/test/fifo
and we get a warning that jbd2 has entered a transaction while frozen:
WARNING: at fs/ext4/super.c:240 ext4_journal_start_sb+0xce/0xe0 [ext4]() (Not tainted)
which is: WARN_ON(sb->s_writers.frozen == SB_FREEZE_COMPLETE);
and we get there via the file_update_time() path in pipe_write().
If filesystem is frozen we can block pipe_write() but this is not optimal
because fifo is special_file so let's skip mtime update as we do
with touch_atime()

Signed-off-by: Dmitry Monakhov <dmonakhov@openvz.org>
---
 fs/pipe.c |    3 ++-
 1 files changed, 2 insertions(+), 1 deletions(-)

diff --git a/fs/pipe.c b/fs/pipe.c
index 2234f3f..62f63d5 100644
--- a/fs/pipe.c
+++ b/fs/pipe.c
@@ -654,10 +654,11 @@ out:
 		wake_up_interruptible_sync_poll(&pipe->wait, POLLIN | POLLRDNORM);
 		kill_fasync(&pipe->fasync_readers, SIGIO, POLL_IN);
 	}
-	if (ret > 0) {
+	if (ret > 0 && sb_start_write_trylock(inode->i_sb)) {
 		int err = file_update_time(filp);
 		if (err)
 			ret = err;
+		sb_end_write(inode->i_sb);
 	}
 	return ret;
 }
-- 
1.7.1


^ permalink raw reply related	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2013-04-02 20:30 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-09-27 15:47 [PATCH] fs: block pipe_write() on a frozen filesystem Eric Sandeen
2012-10-01 15:34 ` Jan Kara
2013-04-02 12:38 ` [PATCH] fs: block pipe_write() on a frozen filesystem PING Dmitry Monakhov
2013-04-02 19:57   ` Al Viro
2013-04-02 20:30     ` Dmitry Monakhov

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).