linux-ext4.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] Copy i_flags to ext3 inode flags on write (version 2)
@ 2007-04-17 10:38 Jan Kara
  2007-04-20  7:53 ` Andrew Morton
  2007-04-24 15:14 ` Dave Kleikamp
  0 siblings, 2 replies; 6+ messages in thread
From: Jan Kara @ 2007-04-17 10:38 UTC (permalink / raw)
  To: akpm; +Cc: linux-ext4

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

  Hi,

  attached is a second version of a patch that stores inode flags such as
S_IMMUTABLE, S_APPEND, etc. from i_flags to EXT3_I(inode)->i_flags when
inode is written to disk. The same thing is done on GETFLAGS ioctl.
  Quota code changes these flags on quota files (to make it harder for
sysadmin to screw himself) and these changes were not correctly
propagated into the filesystem (especially, lsattr did not show them and
users were wondering...). Andrew, could you please put the patch into your
queue? Thanks.

								Honza
-- 
Jan Kara <jack@suse.cz>
SuSE CR Labs

[-- Attachment #2: ext3-2.6.21-rc6-propagate_flags.diff --]
[-- Type: text/x-patch, Size: 2843 bytes --]

Propagate flags such as S_APPEND, S_IMMUTABLE, etc. from i_flags into
ext3-specific i_flags. Hence, when someone sets these flags via a different
interface than ioctl, they are stored correctly.

Signed-off-by: Jan Kara <jack@suse.cz>

diff -rupX /home/jack/.kerndiffexclude linux-2.6.21-rc6/fs/ext3/inode.c linux-2.6.21-rc6-1-ext3_flags_update/fs/ext3/inode.c
--- linux-2.6.21-rc6/fs/ext3/inode.c	2007-04-10 17:09:55.000000000 +0200
+++ linux-2.6.21-rc6-1-ext3_flags_update/fs/ext3/inode.c	2007-04-17 11:24:28.000000000 +0200
@@ -2581,6 +2581,25 @@ void ext3_set_inode_flags(struct inode *
 		inode->i_flags |= S_DIRSYNC;
 }
 
+/* Propagate flags from i_flags to EXT3_I(inode)->i_flags */
+void ext3_get_inode_flags(struct ext3_inode_info *ei)
+{
+	unsigned int flags = ei->vfs_inode.i_flags;
+
+	ei->i_flags &= ~(EXT3_SYNC_FL|EXT3_APPEND_FL|
+			EXT3_IMMUTABLE_FL|EXT3_NOATIME_FL|EXT3_DIRSYNC_FL);
+	if (flags & S_SYNC)
+		ei->i_flags |= EXT3_SYNC_FL;
+	if (flags & S_APPEND)
+		ei->i_flags |= EXT3_APPEND_FL;
+	if (flags & S_IMMUTABLE)
+		ei->i_flags |= EXT3_IMMUTABLE_FL;
+	if (flags & S_NOATIME)
+		ei->i_flags |= EXT3_NOATIME_FL;
+	if (flags & S_DIRSYNC)
+		ei->i_flags |= EXT3_DIRSYNC_FL;
+}
+
 void ext3_read_inode(struct inode * inode)
 {
 	struct ext3_iloc iloc;
@@ -2736,6 +2755,7 @@ static int ext3_do_update_inode(handle_t
 	if (ei->i_state & EXT3_STATE_NEW)
 		memset(raw_inode, 0, EXT3_SB(inode->i_sb)->s_inode_size);
 
+	ext3_get_inode_flags(ei);
 	raw_inode->i_mode = cpu_to_le16(inode->i_mode);
 	if(!(test_opt(inode->i_sb, NO_UID32))) {
 		raw_inode->i_uid_low = cpu_to_le16(low_16_bits(inode->i_uid));
diff -rupX /home/jack/.kerndiffexclude linux-2.6.21-rc6/fs/ext3/ioctl.c linux-2.6.21-rc6-1-ext3_flags_update/fs/ext3/ioctl.c
--- linux-2.6.21-rc6/fs/ext3/ioctl.c	2007-02-07 12:03:23.000000000 +0100
+++ linux-2.6.21-rc6-1-ext3_flags_update/fs/ext3/ioctl.c	2007-04-17 11:24:39.000000000 +0200
@@ -28,6 +28,7 @@ int ext3_ioctl (struct inode * inode, st
 
 	switch (cmd) {
 	case EXT3_IOC_GETFLAGS:
+		ext3_get_inode_flags(ei);
 		flags = ei->i_flags & EXT3_FL_USER_VISIBLE;
 		return put_user(flags, (int __user *) arg);
 	case EXT3_IOC_SETFLAGS: {
diff -rupX /home/jack/.kerndiffexclude linux-2.6.21-rc6/include/linux/ext3_fs.h linux-2.6.21-rc6-1-ext3_flags_update/include/linux/ext3_fs.h
--- linux-2.6.21-rc6/include/linux/ext3_fs.h	2007-04-10 17:09:58.000000000 +0200
+++ linux-2.6.21-rc6-1-ext3_flags_update/include/linux/ext3_fs.h	2007-04-17 11:25:23.000000000 +0200
@@ -824,6 +824,7 @@ extern int ext3_change_inode_journal_fla
 extern int ext3_get_inode_loc(struct inode *, struct ext3_iloc *);
 extern void ext3_truncate (struct inode *);
 extern void ext3_set_inode_flags(struct inode *);
+extern void ext3_get_inode_flags(struct ext3_inode_info *);
 extern void ext3_set_aops(struct inode *inode);
 
 /* ioctl.c */

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

* Re: [PATCH] Copy i_flags to ext3 inode flags on write (version 2)
  2007-04-17 10:38 [PATCH] Copy i_flags to ext3 inode flags on write (version 2) Jan Kara
@ 2007-04-20  7:53 ` Andrew Morton
  2007-04-23 18:33   ` Jan Kara
  2007-04-24 15:14 ` Dave Kleikamp
  1 sibling, 1 reply; 6+ messages in thread
From: Andrew Morton @ 2007-04-20  7:53 UTC (permalink / raw)
  To: Jan Kara; +Cc: linux-ext4

On Tue, 17 Apr 2007 12:38:55 +0200 Jan Kara <jack@suse.cz> wrote:

>   attached is a second version of a patch that stores inode flags such as
> S_IMMUTABLE, S_APPEND, etc. from i_flags to EXT3_I(inode)->i_flags when
> inode is written to disk. The same thing is done on GETFLAGS ioctl.
>   Quota code changes these flags on quota files (to make it harder for
> sysadmin to screw himself) and these changes were not correctly
> propagated into the filesystem (especially, lsattr did not show them and
> users were wondering...). Andrew, could you please put the patch into your
> queue? Thanks.

umm, OK.

What about ext2 and all the zillions of others?

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

* Re: [PATCH] Copy i_flags to ext3 inode flags on write (version 2)
  2007-04-20  7:53 ` Andrew Morton
@ 2007-04-23 18:33   ` Jan Kara
  0 siblings, 0 replies; 6+ messages in thread
From: Jan Kara @ 2007-04-23 18:33 UTC (permalink / raw)
  To: Andrew Morton; +Cc: shaggy, linux-ext4

On Fri 20-04-07 00:53:37, Andrew Morton wrote:
> On Tue, 17 Apr 2007 12:38:55 +0200 Jan Kara <jack@suse.cz> wrote:
> 
> >   attached is a second version of a patch that stores inode flags such as
> > S_IMMUTABLE, S_APPEND, etc. from i_flags to EXT3_I(inode)->i_flags when
> > inode is written to disk. The same thing is done on GETFLAGS ioctl.
> >   Quota code changes these flags on quota files (to make it harder for
> > sysadmin to screw himself) and these changes were not correctly
> > propagated into the filesystem (especially, lsattr did not show them and
> > users were wondering...). Andrew, could you please put the patch into your
> > queue? Thanks.
> 
> umm, OK.
  Thanks.

> What about ext2 and all the zillions of others?
  Oh, yes... I'll send you patch for ext2, GFS2 and OCFS2. The only
filesystem, which is capable to store such flags and is not converted is
JFS - I was not able to find a suitable place for copying flags from VFS
inode to ondisk copy (giving CC to Shaggy)...

								Honza
-- 
Jan Kara <jack@suse.cz>
SuSE CR Labs

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

* Re: [PATCH] Copy i_flags to ext3 inode flags on write (version 2)
  2007-04-17 10:38 [PATCH] Copy i_flags to ext3 inode flags on write (version 2) Jan Kara
  2007-04-20  7:53 ` Andrew Morton
@ 2007-04-24 15:14 ` Dave Kleikamp
  2007-04-24 15:35   ` Jan Kara
  1 sibling, 1 reply; 6+ messages in thread
From: Dave Kleikamp @ 2007-04-24 15:14 UTC (permalink / raw)
  To: Jan Kara; +Cc: akpm, linux-ext4

On Tue, 2007-04-17 at 12:38 +0200, Jan Kara wrote:
>   Hi,
> 
>   attached is a second version of a patch that stores inode flags such as
> S_IMMUTABLE, S_APPEND, etc. from i_flags to EXT3_I(inode)->i_flags when
> inode is written to disk. The same thing is done on GETFLAGS ioctl.
>   Quota code changes these flags on quota files (to make it harder for
> sysadmin to screw himself) and these changes were not correctly
> propagated into the filesystem (especially, lsattr did not show them and
> users were wondering...). Andrew, could you please put the patch into your
> queue? Thanks.

I think you need a call to ext3_get_inode_flags in one more place.  In
ext3_ioctl(), EXT3_IOC_SETFLAGS modifies the flags based on what is in
ei->i_flags, so this code should make sure that ei->i_flags is in sync
with inode->i_flags.

Signed-off-by: Dave Kleikamp <shaggy@linux.vnet.ibm.com>

diff -Nurp linux-orig/fs/ext3/ioctl.c linux/fs/ext3/ioctl.c
--- linux-orig/fs/ext3/ioctl.c	2007-04-24 10:04:50.000000000 -0500
+++ linux/fs/ext3/ioctl.c	2007-04-24 10:05:59.000000000 -0500
@@ -51,6 +51,7 @@ int ext3_ioctl (struct inode * inode, st
 			flags &= ~EXT3_DIRSYNC_FL;
 
 		mutex_lock(&inode->i_mutex);
+		ext3_get_inode_flags(ei);
 		oldflags = ei->i_flags;
 
 		/* The JOURNAL_DATA flag is modifiable only by root */

-- 
David Kleikamp
IBM Linux Technology Center

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

* Re: [PATCH] Copy i_flags to ext3 inode flags on write (version 2)
  2007-04-24 15:14 ` Dave Kleikamp
@ 2007-04-24 15:35   ` Jan Kara
  2007-04-24 15:44     ` Dave Kleikamp
  0 siblings, 1 reply; 6+ messages in thread
From: Jan Kara @ 2007-04-24 15:35 UTC (permalink / raw)
  To: Dave Kleikamp; +Cc: akpm, linux-ext4

On Tue 24-04-07 10:14:37, Dave Kleikamp wrote:
> On Tue, 2007-04-17 at 12:38 +0200, Jan Kara wrote:
> >   Hi,
> > 
> >   attached is a second version of a patch that stores inode flags such as
> > S_IMMUTABLE, S_APPEND, etc. from i_flags to EXT3_I(inode)->i_flags when
> > inode is written to disk. The same thing is done on GETFLAGS ioctl.
> >   Quota code changes these flags on quota files (to make it harder for
> > sysadmin to screw himself) and these changes were not correctly
> > propagated into the filesystem (especially, lsattr did not show them and
> > users were wondering...). Andrew, could you please put the patch into your
> > queue? Thanks.
> 
> I think you need a call to ext3_get_inode_flags in one more place.  In
> ext3_ioctl(), EXT3_IOC_SETFLAGS modifies the flags based on what is in
> ei->i_flags, so this code should make sure that ei->i_flags is in sync
> with inode->i_flags.
  Hmm, I don't think so. The code does:
                flags = flags & EXT3_FL_USER_MODIFIABLE;
                flags |= oldflags & ~EXT3_FL_USER_MODIFIABLE;
                ei->i_flags = flags;
  So all EXT3_FL_USER_MODIFIABLE are overwritten by what user has supplied,
which happens to be a superset of flags influenced by
ext3_get_inode_flags(). On the other hand, from some point of view, after your
change the code is safer (in case we add some new unmodifiable flags) so I
don't object against adding the call. I just wanted to point out, that
currently there's no difference...

									Honza

> 
> Signed-off-by: Dave Kleikamp <shaggy@linux.vnet.ibm.com>
> 
> diff -Nurp linux-orig/fs/ext3/ioctl.c linux/fs/ext3/ioctl.c
> --- linux-orig/fs/ext3/ioctl.c	2007-04-24 10:04:50.000000000 -0500
> +++ linux/fs/ext3/ioctl.c	2007-04-24 10:05:59.000000000 -0500
> @@ -51,6 +51,7 @@ int ext3_ioctl (struct inode * inode, st
>  			flags &= ~EXT3_DIRSYNC_FL;
>  
>  		mutex_lock(&inode->i_mutex);
> +		ext3_get_inode_flags(ei);
>  		oldflags = ei->i_flags;
>  
>  		/* The JOURNAL_DATA flag is modifiable only by root */
> 
> -- 
> David Kleikamp
> IBM Linux Technology Center
> 
-- 
Jan Kara <jack@suse.cz>
SuSE CR Labs

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

* Re: [PATCH] Copy i_flags to ext3 inode flags on write (version 2)
  2007-04-24 15:35   ` Jan Kara
@ 2007-04-24 15:44     ` Dave Kleikamp
  0 siblings, 0 replies; 6+ messages in thread
From: Dave Kleikamp @ 2007-04-24 15:44 UTC (permalink / raw)
  To: Jan Kara; +Cc: akpm, linux-ext4

On Tue, 2007-04-24 at 17:35 +0200, Jan Kara wrote:
> On Tue 24-04-07 10:14:37, Dave Kleikamp wrote:

> > I think you need a call to ext3_get_inode_flags in one more place.  In
> > ext3_ioctl(), EXT3_IOC_SETFLAGS modifies the flags based on what is in
> > ei->i_flags, so this code should make sure that ei->i_flags is in sync
> > with inode->i_flags.
>   Hmm, I don't think so. The code does:
>                 flags = flags & EXT3_FL_USER_MODIFIABLE;
>                 flags |= oldflags & ~EXT3_FL_USER_MODIFIABLE;
>                 ei->i_flags = flags;
>   So all EXT3_FL_USER_MODIFIABLE are overwritten by what user has supplied,
> which happens to be a superset of flags influenced by
> ext3_get_inode_flags(). On the other hand, from some point of view, after your
> change the code is safer (in case we add some new unmodifiable flags) so I
> don't object against adding the call. I just wanted to point out, that
> currently there's no difference...

Okay.  I see that that's the case.  I was thinking that individual flags
could be set through the ioctl, but it takes the whole set.  I don't
really see the need to keep my patch from a safety perspective, but do
what you want.

Thanks,
Shaggy
-- 
David Kleikamp
IBM Linux Technology Center

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

end of thread, other threads:[~2007-04-24 15:44 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-04-17 10:38 [PATCH] Copy i_flags to ext3 inode flags on write (version 2) Jan Kara
2007-04-20  7:53 ` Andrew Morton
2007-04-23 18:33   ` Jan Kara
2007-04-24 15:14 ` Dave Kleikamp
2007-04-24 15:35   ` Jan Kara
2007-04-24 15:44     ` Dave Kleikamp

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).