Hi Andy,

----- Original Message -----
> From: "Andrew Price" <anpr...@redhat.com>
> To: "Abhi Das" <a...@redhat.com>, cluster-devel@redhat.com
> Sent: Thursday, November 5, 2015 12:19:48 PM
> Subject: Re: [Cluster-devel] [GFS2 PATCH] gfs2: Automatically set 
> GFS2_DIF_SYSTEM flag on system files
> 
> Hi Abhi,
> 
> On 30/10/15 19:57, Abhi Das wrote:
> > When new files and directories are created inside a parent directory
> > we automatically inherit the GFS2_DIF_SYSTEM flag (if set) and assign
> > it to the new file/dirs.
> >
> > All new system files/dirs created in the metafs by, say gfs2_jadd,
> > will have this flag set because they will have parent directories in
> > the metafs whose GFS2_DIF_SYSTEM flag has already been set (most likely
> > by a previous mkfs.gfs2)
> >
> > Resolves: rhbz#1272086
> > Signed-off-by: Abhi Das <a...@redhat.com>
> > ---
> >   fs/gfs2/file.c  | 4 ++--
> >   fs/gfs2/inode.c | 5 +++++
> >   2 files changed, 7 insertions(+), 2 deletions(-)
> >
> > diff --git a/fs/gfs2/file.c b/fs/gfs2/file.c
> > index 71cd138..63fe948 100644
> > --- a/fs/gfs2/file.c
> > +++ b/fs/gfs2/file.c
> > @@ -298,9 +298,9 @@ static int gfs2_set_flags(struct file *filp, u32 __user
> > *ptr)
> >             gfsflags &= ~GFS2_DIF_TOPDIR;
> >             if (gfsflags & GFS2_DIF_INHERIT_JDATA)
> >                     gfsflags ^= (GFS2_DIF_JDATA | GFS2_DIF_INHERIT_JDATA);
> > -           return do_gfs2_set_flags(filp, gfsflags, ~0);
> > +           return do_gfs2_set_flags(filp, gfsflags, ~GFS2_DIF_SYSTEM);
> >     }
> > -   return do_gfs2_set_flags(filp, gfsflags, ~GFS2_DIF_JDATA);
> > +   return do_gfs2_set_flags(filp, gfsflags, ~(GFS2_DIF_SYSTEM |
> > GFS2_DIF_JDATA));
> 
> Are these two changes still required? The function only seems to get
> called in the SETFLAGS ioctl path.
> 
> Cheers,
> Andy
> 

Yes. This 3rd argument to do_gfs2_set_flags() is a field mask and is used
like this:

new_flags = (flags & ~mask) | (reqflags & mask);

Since the requested flags 'reqflags' from userspace (gfs2_jadd, for example) 
can't
set GFS2_DIF_SYSTEM, only way to preserve this flag's value across SETFLAGS 
ioctls
is to not touch it via the mask when it is ANDed with the existing flags 
'flags'.

Hope that makes sense.

Cheers!
--Abhi

Reply via email to