[Ocfs2-devel] ext2 attributes for OCFS2
Herbert Poetzl
herbert at 13thfloor.at
Wed Jun 14 05:44:00 CDT 2006
On Tue, Jun 13, 2006 at 04:56:25PM -0700, Mark Fasheh wrote:
> On Mon, Jun 12, 2006 at 11:41:17PM +0200, Herbert Poetzl wrote:
> > okay, so it looks like the ocfs2 folks are open to such
> > an extention which for me means that a mainline patch
> > makes sense ...
> Yes - thanks for following up on this :)
always good to hear ...
> > the good news here is that some of the attributes (like
> > the immutable or append) work out of the box once they
> > are there (i.e. present in the generic inode flags)
> Yeah, it should mostly work just fine, but I'm betting there are some
> paths which will need a manual re-check as things may have changed out
> from under the VFS while we weren't holding a cluster lock. It should
> be easy enough to check things like the immutable flag in those places
> though.
might be, I already wondered why things like
mark_inode_dirty() do not work with ocfs2,
IMHO the vfs/ocfs2 synchronization is broken
(to some degree) but maybe that is intentional
> > okay, I moved those parts out of the ocfs2_ioctl
> > to match the general structure and enhance the
> > readabilitly - I hope I got the locks right this
> > time, please double check ...
> The locking looks good, thanks. The ioctl.[ch] parts of the patch
> looks pretty good now btw.
okay, good
> > okay, I added this and hopefully it will work as
> > expected, it didn't get exercised on my (up to now)
> > single node test setup :)
> Cool. As much testing as you can do is good :) At any rate, we'll
> certainly be testing things out over here once the patch is good for
> inclusion.
guess it will get more testing once I set it up
as a cluster system
> There is a small problem with the lvb stuff which I'll outline below.
>
> > I decided to make this patch a little more agressive
> > than the last one, using a reserved field of the
> > on disk structure to store the new attributes, which
> > actually has two advantages IMHO:
> >
> > - the mapping between ext2/3 and ocfs2 isn't required
> > anymore, as we an store the ext attrs without fear
> > of collisions with existing ocfs2 flags
> >
> > - the mixing and separation of ocfs2 flags and ext
> > flags can be avoided completely, probably enhancing
> > readability while simplifying code
> I agree that using a new field seems nicer.
> Can we compress things though and just use a u16?
sure we can, but I think we should either use
the flags _as is_ and do not map/change anything
or compress them into the existing i_flags,
avoiding the new on disk field completely
> I don't mind the translation that we were doing before, so you can go
> ahead and pack the actual bit values for OCFS2's purposes.
> Also I would prefer if you could split the i_reserved0 __le32 into
> a pair of __le16 values:
>
> -/*10*/ __le32 i_reserved0;
> +/*10*/ __le16 i_attr_flags;
> + __le16 i_reserved0;
>
> Actually, looking at the values, it seems that OCFS2_DIRSYNC_FL is the
> only one that won't fit within 16 bits, so you could just give that
> one some new value and we'll only have to translate on one flag :)
I'd prefer to use the flag by flag mapping instead
of some magic shift/mask which doesn't actually
gain that much
> > here is the new patch, this time inline for easier review and comments ...
> Great, thanks - more comments inline.
>
> > @@ -1368,6 +1372,16 @@ static void ocfs2_refresh_inode_from_lvb
> > inode->i_blocks =
> > ocfs2_align_bytes_to_sectors(i_size_read(inode));
> >
> > + switch (version) {
> > + case 3:
> > + oi->ip_iflags = be32_to_cpu(lvb->lvb_iflags);
> > + printk("lvb refresh for %p flags %x\n", inode, oi->ip_iflags);
> > + break;
> > + default:
> > + oi->ip_iflags = 0;
> > + printk("lvb refresh for %p flags = 0\n", inode);
> > + }
> You won't ever hit the 'default' case because
> ocfs2_meta_lvb_is_trustable() will always return false. Which is what
> we probably want in this case because if you're going to allow nodes
> which don't understand the attributes to be in the cluster we don't
> want to trust their lvbs (and instead read from disk) as they won't
> have put anything useful in the flags lvb field.
ah, okay, good to know, so we simply reduce that to
oi->ip_iflags = be32_to_cpu(lvb->lvb_iflags), yes?
> > inode->i_uid = be32_to_cpu(lvb->lvb_iuid);
> > inode->i_gid = be32_to_cpu(lvb->lvb_igid);
> > inode->i_mode = be16_to_cpu(lvb->lvb_imode);
> Hmm, you also left out the corresponding code in __ocfs2_stuff_meta_lvb()
hmm, I did? .. checking ... hmm, what about this part?
--- linux-2.6.16.20/fs/ocfs2/dlmglue.c 2006-01-18 06:08:34 +0100
+++ linux-2.6.16.20-ocfs2-0.01/fs/ocfs2/dlmglue.c 2006-06-12 22:32:00 +0200
@@ -1321,6 +1321,7 @@ static void __ocfs2_stuff_meta_lvb(struc
lvb->lvb_version = cpu_to_be32(OCFS2_LVB_VERSION);
lvb->lvb_isize = cpu_to_be64(i_size_read(inode));
lvb->lvb_iclusters = cpu_to_be32(oi->ip_clusters);
+ lvb->lvb_iflags = cpu_to_be32(oi->ip_iflags);
lvb->lvb_iuid = cpu_to_be32(inode->i_uid);
lvb->lvb_igid = cpu_to_be32(inode->i_gid);
lvb->lvb_imode = cpu_to_be16(inode->i_mode);
do we need more?
> I'll attach a quick, untested patch against dlmglue.[ch] which you can
> hopefully use.
okay, will check ...
> > diff -NurpP --minimal linux-2.6.16.20/fs/ocfs2/inode.h linux-2.6.16.20-ocfs2-0.01/fs/ocfs2/inode.h
> > --- linux-2.6.16.20/fs/ocfs2/inode.h 2006-04-09 13:49:54 +0200
> > +++ linux-2.6.16.20-ocfs2-0.01/fs/ocfs2/inode.h 2006-06-12 21:08:39 +0200
> > @@ -56,6 +56,7 @@ struct ocfs2_inode_info
> > struct ocfs2_journal_handle *ip_handle;
> >
> > u32 ip_flags; /* see below */
> > + u32 ip_iflags; /* inode attributes */
> Minor nit, but would you mind changing the name to something
> like ip_attr_flags? I know - I'm the one who brought up that
> not-so-good-name in the first place :) Maybe we can just start saying
> attr_flags instead of iflags elsewhere too? I apologize for the poor
> 1st pass at naming this thing :)
well, I actually used ip_iattr in the second patch
I did, but this actually makes things even more
confusing, as for example the functions would then
look like this:
+void ocfs2_set_inode_flags(struct inode *inode)
+{
+ unsigned int flags = OCFS2_I(inode)->ip_iattr;
+
+ inode->i_flags &= ...
and this:
+int ocfs2_get_iattr(struct inode *inode, unsigned *flags)
+int ocfs2_set_iattr(struct inode *inode, unsigned flags, unsigned mask)
which IMHO is even more confusing, but, I think we
won't have this name clash if we stick to mangling
the existing ip_flags with the new ones ...
> > -/*70*/ __le64 i_reserved1[9];
> > +/*70*/ __le32 i_iflags; /* inode attr flags */
> > + __le32 i_reserved1;
> > + __le64 i_reserved2[8];
> I guess just see my comment above on where to locate this.
>
>
> So IMHO, and you can probably tell this by the lack of patch comments
> that things are coming along pretty well. Thanks again for doing all
> this :)
you're welcome! and tx for the quick feedback!
will prepare a patch with the complete mangling
added back (in a slightly more readable way)
best,
Herbert
PS: did I miss the quickly attached patch? :)
> --Mark
>
> --
> Mark Fasheh
> Senior Software Developer, Oracle
> mark.fasheh at oracle.com
More information about the Ocfs2-devel
mailing list