Whamcloud - gitweb
Branch HEAD
[fs/lustre-release.git] / lustre / mds / mds_audit.c
index e03e5f0..08c54b4 100644 (file)
 #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)
-{
-        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);
-        
-        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_perm(struct ptlrpc_request *req, struct inode *inode, audit_op op)
+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;
-        
         ENTRY;
         
-        LASSERT(inode);
-        info.m.nid = nid;
-        info.m.uid = current->uid;
-        info.m.gid = current->gid;
-        info.m.result = -EACCES;
-        info.m.code = op;
-        
-        /* failed access, log child id only */
-        mds_pack_inode2id(obd, &info.m.id, inode, 1);
+        /* don't catch request to cross-ref */
+        if (dentry->d_flags & DCACHE_CROSS_REF)
+                RETURN(0);
         
-        fsfilt_set_info(obd, inode->i_sb, inode,
-                        10, "audit_info", sizeof(info), (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);
-        
-        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);
 }
@@ -178,10 +125,7 @@ int mds_audit_auth(struct ptlrpc_request *req, struct lvfs_ucred * uc,
         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;
@@ -304,21 +248,23 @@ int mds_set_audit(struct obd_device * obd, void * val)
         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);