//AUDIT OPCODES, also bit number in audit_setting mask
typedef enum {
- AUDIT_NONE = 0,
+ AUDIT_UNKNOWN = 0,
AUDIT_CREATE,
AUDIT_LINK,
AUDIT_UNLINK,
AUDIT_MAX,
} audit_op;
-#define AUDIT_FAIL AUDIT_MAX
-#define AUDIT_DIR (AUDIT_MAX + 1)
-#define AUDIT_FS (AUDIT_MAX + 2)
+#define AUDIT_FAIL AUDIT_MAX
+#define AUDIT_DIR (AUDIT_MAX + 1)
+#define AUDIT_FS (AUDIT_MAX + 2)
#define AUD_BIT(a) (1 << a)
int sn_index; /*the inode snap_index*/
ino_t sn_root_ino; /*the root ino of this snap*/
};
+
+struct audit_inode_info {
+ __u64 au_mask;
+ __u8 au_valid;
+};
+
struct smfs_inode_info {
/* this first part of struct should be the same as in mds_info_info */
//struct lustre_id smi_id;
/* smfs part. */
struct inode *smi_inode;
__u32 smi_flags;
+ struct audit_inode_info au_info;
struct snap_inode_info sm_sninfo;
};
#if 0
static audit_op hook2audit(hook_op hook)
{
- audit_op opcode = AUDIT_NONE;
+ audit_op opcode = AUDIT_UNKNOWN;
switch (hook)
{
return AUDIT_READDIR;
default:
- return AUDIT_NONE;
+ break;
}
return opcode;
return inode;
}
+
+static inline int smfs_get_inode_audit(struct inode *inode, __u64 *mask)
+{
+ struct fsfilt_operations *fsfilt = S2SMI(inode->i_sb)->sm_cache_fsfilt;
+ struct smfs_inode_info * smi = I2SMI(inode);
+ int rc = 0;
+
+ if (smi->au_info.au_valid)
+ *mask = smi->au_info.au_mask;
+ else {
+ rc = fsfilt->fs_get_xattr(I2CI(inode), AUDIT_ATTR_EA, mask, sizeof(*mask));
+ if (rc <= 0)
+ *mask = AUDIT_OFF;
+ smi->au_info.au_valid = 1;
+ smi->au_info.au_mask = *mask;
+ }
+ return 0;
+}
+
/* is called also from fsfilt_smfs_get_info */
int smfs_get_audit(struct super_block * sb, struct inode * parent,
struct inode * inode, __u64 * mask)
RETURN(0);
}
/* get inode audit EA */
- rc = fsfilt->fs_get_xattr(parent, AUDIT_ATTR_EA,
- mask, sizeof(*mask));
- if (rc <= 0)
- RETURN(-ENODATA);
-
+ smfs_get_inode_audit(parent, mask);
/* check if parent has audit */
if (IS_AUDIT(*mask))
RETURN(0);
if (!inode)
RETURN(-ENOENT);
- rc = fsfilt->fs_get_xattr(inode, AUDIT_ATTR_EA,
- mask, sizeof(*mask));
- if (rc <= 0)
- RETURN(-ENODATA);
-
+ smfs_get_inode_audit(inode, mask);
if (IS_AUDIT(*mask))
RETURN(0);
{
void * handle = NULL;
struct fsfilt_operations * fsfilt = S2SMI(sb)->sm_fsfilt;
+ struct smfs_inode_info *smi = I2SMI(inode);
int rc = 0;
ENTRY;
if (fsfilt->fs_set_xattr)
rc = fsfilt->fs_set_xattr(inode, handle, AUDIT_ATTR_EA,
mask, sizeof(*mask));
-
+ /* save audit EA in inode_info */
+ if (rc >= 0) {
+ smi->au_info.au_mask = *mask;
+ smi->au_info.au_valid = 1;
+ }
+
fsfilt->fs_commit(inode->i_sb, inode, handle, 1);
RETURN(rc);