#include <linux/lustre_acl.h>
#include "mds_internal.h"
-int mds_audit_stat(struct ptlrpc_request *req, struct lustre_id * id,
- struct inode *inode, char *name, int namelen, int ret)
+int mds_audit(struct ptlrpc_request *req, struct dentry *dentry,
+ char *name, int namelen, audit_op op, int ret)
{
struct obd_device *obd = req->rq_export->exp_obd;
ptl_nid_t nid = req->rq_peer.peer_id.nid;
+ struct inode *inode = dentry->d_inode;
+ struct inode *parent = dentry->d_parent->d_inode;
struct audit_info info = {
+ .child = inode,
.name = NULL,
.namelen = 0,
};
- int rc = 0, len = sizeof(info);
-
+ int rc = 0;
ENTRY;
- LASSERT(inode);
- LASSERT(id);
- info.m.id = *id;
- info.m.nid = nid;
- info.m.uid = current->uid;
- info.m.gid = current->gid;
- info.m.result = ret;
- info.m.code = AUDIT_STAT;
- if (ret) {
- info.name = name;
- info.namelen = namelen;
- }
- // send info to local fs
- fsfilt_set_info(obd, inode->i_sb, inode,
- 10, "audit_info", len, (void*)&info);
-
- RETURN(rc);
-}
-
-int mds_audit_open(struct ptlrpc_request *req, struct lustre_id * id,
- struct inode *inode, char *name, int namelen, int ret)
-{
- struct obd_device *obd = req->rq_export->exp_obd;
- ptl_nid_t nid = req->rq_peer.peer_id.nid;
- struct audit_info info = {
- .name = NULL,
- .namelen = 0,
- };
- int rc = 0, len = sizeof(info);
+ /* don't catch request to cross-ref */
+ if (dentry->d_flags & DCACHE_CROSS_REF)
+ RETURN(0);
- ENTRY;
-
- LASSERT(inode);
- info.m.id = (*id);
info.m.nid = nid;
info.m.uid = current->uid;
info.m.gid = current->gid;
info.m.result = ret;
- info.m.code = AUDIT_OPEN;
- if (ret) {
+ info.m.code = op;
+
+ if (!inode) {
+ inode = parent;
info.name = name;
info.namelen = namelen;
}
-
- fsfilt_set_info(obd, inode->i_sb, inode,
- 10, "audit_info", len, (void*)&info);
+ mds_pack_inode2id(obd, &info.m.id, inode, 1);
+
+ fsfilt_set_info(obd, parent->i_sb, parent,
+ 10, "audit_info", sizeof(info), (void*)&info);
RETURN(rc);
}
if (name && namelen > 0) {
dchild = ll_lookup_one_len(name, dparent, namelen);
if (!IS_ERR(dchild)) {
- if (dchild->d_flags & DCACHE_CROSS_REF) {
- //TODO: we should know audit setting for this
- //so remote call is needed
- } else {
+ if (!dchild->d_flags & DCACHE_CROSS_REF) {
inode = dchild->d_inode;
info.name = NULL;
info.namelen = 0;
}
rc = mds_audit_auth(req, &rec->ur_uc, code, rec->ur_id1,
- rec->ur_name, rec->ur_namelen);
+ rec->ur_name, rec->ur_namelen - 1);
return rc;
}
ENTRY;
//push_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL);
-
- dentry = mds_id2dentry(obd, &msg->id, NULL);
- if (IS_ERR(dentry)) {
- CERROR("Cannot get dentry\n");
- RETURN(PTR_ERR(dentry));
+ if (IS_AUDIT_OP(msg->attr, AUDIT_FS) == 0) {
+ dentry = mds_id2dentry(obd, &msg->id, NULL);
+ if (IS_ERR(dentry)) {
+ CERROR("Cannot get dentry "DLID4" err=%li\n", OLID4(&msg->id),
+ PTR_ERR(dentry));
+ RETURN(PTR_ERR(dentry));
+ }
+ inode = dentry->d_inode;
}
-
- inode = dentry->d_inode;
- fsfilt_set_info(obd, inode->i_sb, inode,
+ fsfilt_set_info(obd, obd->u.mds.mds_sb, inode,
5, "audit", sizeof(msg->attr), &msg->attr);
- if (S_ISREG(inode->i_mode) && !IS_AUDIT_OP(msg->attr, AUDIT_FS))
+ if (inode && S_ISREG(inode->i_mode))
mds_set_obj_audit(obd, inode, &msg->attr);
- l_dput(dentry);
+ if (dentry)
+ l_dput(dentry);
//pop_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL);