40b78a3223
This has been on my list for some time. We need to change the way in which we handle extended attributes to allow faster file creation times (by reducing the number of transactions required) and the extended attribute code is the main obstacle to this. In addition to that, the VFS provides a way to demultiplex the xattr calls which we ought to be using, rather than rolling our own. This patch changes the GFS2 code to use that VFS feature and as a result the code shrinks by a couple of hundred lines or so, and becomes easier to read. I'm planning on doing further clean up work in this area, but this patch is a good start. The cleaned up code also uses the more usual "xattr" shorthand, I plan to eliminate the use of "eattr" eventually and in the mean time it serves as a flag as to which bits of the code have been updated. Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>
73 lines
2.4 KiB
C
73 lines
2.4 KiB
C
/*
|
|
* Copyright (C) Sistina Software, Inc. 1997-2003 All rights reserved.
|
|
* Copyright (C) 2004-2006 Red Hat, Inc. All rights reserved.
|
|
*
|
|
* This copyrighted material is made available to anyone wishing to use,
|
|
* modify, copy, or redistribute it subject to the terms and conditions
|
|
* of the GNU General Public License version 2.
|
|
*/
|
|
|
|
#ifndef __EATTR_DOT_H__
|
|
#define __EATTR_DOT_H__
|
|
|
|
struct gfs2_inode;
|
|
struct iattr;
|
|
|
|
#define GFS2_EA_REC_LEN(ea) be32_to_cpu((ea)->ea_rec_len)
|
|
#define GFS2_EA_DATA_LEN(ea) be32_to_cpu((ea)->ea_data_len)
|
|
|
|
#define GFS2_EA_SIZE(ea) \
|
|
ALIGN(sizeof(struct gfs2_ea_header) + (ea)->ea_name_len + \
|
|
((GFS2_EA_IS_STUFFED(ea)) ? GFS2_EA_DATA_LEN(ea) : \
|
|
(sizeof(__be64) * (ea)->ea_num_ptrs)), 8)
|
|
|
|
#define GFS2_EA_IS_STUFFED(ea) (!(ea)->ea_num_ptrs)
|
|
#define GFS2_EA_IS_LAST(ea) ((ea)->ea_flags & GFS2_EAFLAG_LAST)
|
|
|
|
#define GFS2_EAREQ_SIZE_STUFFED(er) \
|
|
ALIGN(sizeof(struct gfs2_ea_header) + (er)->er_name_len + (er)->er_data_len, 8)
|
|
|
|
#define GFS2_EA2NAME(ea) ((char *)((struct gfs2_ea_header *)(ea) + 1))
|
|
#define GFS2_EA2DATA(ea) (GFS2_EA2NAME(ea) + (ea)->ea_name_len)
|
|
|
|
#define GFS2_EA2DATAPTRS(ea) \
|
|
((__be64 *)(GFS2_EA2NAME(ea) + ALIGN((ea)->ea_name_len, 8)))
|
|
|
|
#define GFS2_EA2NEXT(ea) \
|
|
((struct gfs2_ea_header *)((char *)(ea) + GFS2_EA_REC_LEN(ea)))
|
|
|
|
#define GFS2_EA_BH2FIRST(bh) \
|
|
((struct gfs2_ea_header *)((bh)->b_data + sizeof(struct gfs2_meta_header)))
|
|
|
|
struct gfs2_ea_request {
|
|
const char *er_name;
|
|
char *er_data;
|
|
unsigned int er_name_len;
|
|
unsigned int er_data_len;
|
|
unsigned int er_type; /* GFS2_EATYPE_... */
|
|
};
|
|
|
|
struct gfs2_ea_location {
|
|
struct buffer_head *el_bh;
|
|
struct gfs2_ea_header *el_ea;
|
|
struct gfs2_ea_header *el_prev;
|
|
};
|
|
|
|
extern int gfs2_xattr_get(struct inode *inode, int type, const char *name,
|
|
void *buffer, size_t size);
|
|
extern int gfs2_xattr_set(struct inode *inode, int type, const char *name,
|
|
const void *value, size_t size, int flags);
|
|
extern ssize_t gfs2_listxattr(struct dentry *dentry, char *buffer, size_t size);
|
|
extern int gfs2_ea_dealloc(struct gfs2_inode *ip);
|
|
|
|
/* Exported to acl.c */
|
|
|
|
extern int gfs2_ea_find(struct gfs2_inode *ip, int type, const char *name,
|
|
struct gfs2_ea_location *el);
|
|
extern int gfs2_ea_get_copy(struct gfs2_inode *ip, struct gfs2_ea_location *el,
|
|
char *data, size_t size);
|
|
extern int gfs2_ea_acl_chmod(struct gfs2_inode *ip, struct gfs2_ea_location *el,
|
|
struct iattr *attr, char *data);
|
|
|
|
#endif /* __EATTR_DOT_H__ */
|