From aba91aec601695c1d284d940e2979137bfdaf464 Mon Sep 17 00:00:00 2001
From: adilger <adilger>
Date: Sat, 23 Mar 2002 00:33:13 +0000
Subject: [PATCH] mds/handler.c, mds/mds_reint.c: fixup the ext3 MDS code a bit
 to build on 	the older 2.4.9 kernel (i_blkbits does not exist there), and
 add 	in the missing fixup for i_diskblocks ALL: add in test framework for
 simulating errors, dropped packets, etc. 	does not yet integrate with
 the ext3 on-disk error interface

---
 lustre/include/linux/obd_support.h |  87 ++++++++----
 lustre/mds/handler.c               |  29 ++--
 lustre/mds/mds_reint.c             | 209 ++++++++++++++---------------
 lustre/obdclass/class_obd.c        |   4 +-
 lustre/obdclass/sysctl.c           |   6 +-
 lustre/ost/ost_handler.c           |  22 +--
 6 files changed, 193 insertions(+), 164 deletions(-)

diff --git a/lustre/include/linux/obd_support.h b/lustre/include/linux/obd_support.h
index 93863958b9..072dc846e2 100644
--- a/lustre/include/linux/obd_support.h
+++ b/lustre/include/linux/obd_support.h
@@ -29,37 +29,74 @@
 
 /* global variables */
 extern unsigned long obd_memory;
-extern unsigned long obd_drop_packet;
+extern unsigned long obd_fail_loc;
 
 enum {
-        OBD_INST_MDS_GETATTR = 1,
-        OBD_INST_MDS_READPAGE,
-        OBD_INST_MDS_READPAGE_BULK,
-        OBD_INST_MDS_REINT,
-        OBD_INST_MDS_OPEN,
-        OBD_INST_MDS_CLOSE,
-        OBD_INST_OST_CONNECT,
-        OBD_INST_OST_DISCONNECT,
-        OBD_INST_OST_GET_INFO,
-        OBD_INST_OST_CREATE,
-        OBD_INST_OST_DESTROY,
-        OBD_INST_OST_GETATTR,
-        OBD_INST_OST_SETATTR,
-        OBD_INST_OST_OPEN,
-        OBD_INST_OST_CLOSE,
-        OBD_INST_OST_BRW,
-        OBD_INST_OST_PUNCH
+        OBD_FAIL_MDS = 0x100,
+        OBD_FAIL_MDS_HANDLE_UNPACK,
+        OBD_FAIL_MDS_GETATTR_NET,
+        OBD_FAIL_MDS_GETATTR_PACK,
+        OBD_FAIL_MDS_READPAGE_NET,
+        OBD_FAIL_MDS_READPAGE_PACK,
+        OBD_FAIL_MDS_READPAGE_BULK_NET,
+        OBD_FAIL_MDS_SENDPAGE,
+        OBD_FAIL_MDS_REINT_NET,
+        OBD_FAIL_MDS_REINT_UNPACK,
+        OBD_FAIL_MDS_REINT_SETATTR,
+        OBD_FAIL_MDS_REINT_SETATTR_WRITE,
+        OBD_FAIL_MDS_REINT_CREATE,
+        OBD_FAIL_MDS_REINT_CREATE_WRITE,
+        OBD_FAIL_MDS_REINT_UNLINK,
+        OBD_FAIL_MDS_REINT_UNLINK_WRITE,
+        OBD_FAIL_MDS_REINT_LINK,
+        OBD_FAIL_MDS_REINT_LINK_WRITE,
+        OBD_FAIL_MDS_REINT_RENAME,
+        OBD_FAIL_MDS_REINT_RENAME_WRITE,
+        OBD_FAIL_MDS_OPEN_NET,
+        OBD_FAIL_MDS_OPEN_PACK,
+        OBD_FAIL_MDS_CLOSE_NET,
+        OBD_FAIL_MDS_CLOSE_PACK,
+
+        OBD_FAIL_OST = 0x200,
+        OBD_FAIL_OST_CONNECT_NET,
+        OBD_FAIL_OST_DISCONNECT_NET,
+        OBD_FAIL_OST_GET_INFO_NET,
+        OBD_FAIL_OST_CREATE_NET,
+        OBD_FAIL_OST_DESTROY_NET,
+        OBD_FAIL_OST_GETATTR_NET,
+        OBD_FAIL_OST_SETATTR_NET,
+        OBD_FAIL_OST_OPEN_NET,
+        OBD_FAIL_OST_CLOSE_NET,
+        OBD_FAIL_OST_BRW_NET,
+        OBD_FAIL_OST_PUNCH_NET,
 };
 
-#define OBD_CHECK_DROP_PACKET(req, id)                                  \
-do {                                                                    \
-        if (obd_drop_packet != id)                                      \
-                break;                                                  \
-                                                                        \
-        CDEBUG(D_OTHER, "obd_drop_packet=%d, dropping packet.\n", id);  \
-        RETURN(0);                                                      \
+/* preparation for a more advanced failure testbed (not functional yet) */
+#define OBD_FAIL_MASK_SYS    0x0000FF00
+#define OBD_FAIL_MASK_LOC    (0x000000FF | OBD_FAIL_MASK_SYS)
+#define OBD_FAIL_ONCE        0x80000000
+#define OBD_FAILED           0x40000000
+#define OBD_FAIL_MDS_ALL_NET 0x01000000
+#define OBD_FAIL_OST_ALL_NET 0x02000000
+
+#define OBD_FAIL_CHECK(id)      ((obd_fail_loc & OBD_FAIL_MASK_LOC) == (id))
+
+#define OBD_FAIL_RETURN(id, ret)                                             \
+do {                                                                         \
+        if (OBD_FAIL_CHECK(id)) {                                            \
+                CERROR("obd_fail_loc=%d, fail operation rc=%d\n", id, ret);  \
+                RETURN(ret);                                                 \
+        }                                                                    \
 } while(0)
 
+#define OBD_FAIL_WRITE(id)                                                   \
+do {                                                                         \
+        if (OBD_FAIL_CHECK(id)) {                                            \
+                CERROR("obd_fail_loc=%d, fail write operation\n", id);       \
+                /* FIXME: do something bad here */                           \
+        }                                                                    \
+} while (0)
+
 #define OBD_ALLOC(ptr, size)                                    \
 do {                                                            \
         long s = (size);                                        \
diff --git a/lustre/mds/handler.c b/lustre/mds/handler.c
index 394439e456..1118d6c919 100644
--- a/lustre/mds/handler.c
+++ b/lustre/mds/handler.c
@@ -42,6 +42,8 @@ int mds_sendpage(struct ptlrpc_request *req, struct file *file,
         int rc = 0;
         mm_segment_t oldfs = get_fs();
 
+        OBD_FAIL_RETURN(OBD_FAIL_MDS_SENDPAGE, -EIO);
+
         if (req->rq_peer.peer_nid == 0) {
                 struct inode *inode = file->f_dentry->d_inode;
                 char *buf = (char *)(long)dst->addr;
@@ -59,7 +61,8 @@ int mds_sendpage(struct ptlrpc_request *req, struct file *file,
                 else if (!strcmp(inode->i_sb->s_type->name, "ext3")) {
                         struct buffer_head *bh;
 
-                        bh = ext3_bread(NULL, inode, offset >> inode->i_blkbits,
+                        bh = ext3_bread(NULL, inode,
+                                        offset >> inode->i_sb->s_blocksize_bits,
                                         0, &rc);
 
                         if (bh) {
@@ -222,7 +225,7 @@ int mds_getattr(struct ptlrpc_request *req)
 
         rc = mds_pack_rep(NULL, 0, NULL, 0, &req->rq_rephdr, &req->rq_rep,
                           &req->rq_replen, &req->rq_repbuf);
-        if (rc) {
+        if (rc || OBD_FAIL_CHECK(OBD_FAIL_MDS_GETATTR_PACK)) {
                 CERROR("mds: out of memory\n");
                 req->rq_status = -ENOMEM;
                 RETURN(0);
@@ -264,7 +267,7 @@ int mds_open(struct ptlrpc_request *req)
 
         rc = mds_pack_rep(NULL, 0, NULL, 0, &req->rq_rephdr, &req->rq_rep,
                           &req->rq_replen, &req->rq_repbuf);
-        if (rc) {
+        if (rc || OBD_FAIL_CHECK(OBD_FAIL_MDS_OPEN_PACK)) {
                 CERROR("mds: out of memory\n");
                 req->rq_status = -ENOMEM;
                 RETURN(0);
@@ -299,7 +302,7 @@ int mds_close(struct ptlrpc_request *req)
 
         rc = mds_pack_rep(NULL, 0, NULL, 0, &req->rq_rephdr, &req->rq_rep,
                           &req->rq_replen, &req->rq_repbuf);
-        if (rc) {
+        if (rc || OBD_FAIL_CHECK(OBD_FAIL_MDS_CLOSE_PACK)) {
                 CERROR("mds: out of memory\n");
                 req->rq_status = -ENOMEM;
                 RETURN(0);
@@ -336,7 +339,7 @@ int mds_readpage(struct ptlrpc_request *req)
 
         rc = mds_pack_rep(NULL, 0, NULL, 0, &req->rq_rephdr, &req->rq_rep,
                           &req->rq_replen, &req->rq_repbuf);
-        if (rc) {
+        if (rc || OBD_FAIL_CHECK(OBD_FAIL_MDS_READPAGE_PACK)) {
                 CERROR("mds: out of memory\n");
                 req->rq_status = -ENOMEM;
                 RETURN(0);
@@ -382,10 +385,10 @@ int mds_reint(struct ptlrpc_request *req)
         len = req->rq_req.mds->tgtlen;
 
         rc = mds_update_unpack(buf, len, &rec);
-        if (rc) {
+        if (rc || OBD_FAIL_CHECK(OBD_FAIL_MDS_REINT_UNPACK)) {
                 CERROR("invalid record\n");
                 req->rq_status = -EINVAL;
-                return 0;
+                RETURN(0);
         }
         /* rc will be used to interrupt a for loop over multiple records */
         rc = mds_reint_rec(&rec, req);
@@ -411,7 +414,7 @@ int mds_handle(struct obd_device *dev, struct ptlrpc_service *svc,
 
         rc = mds_unpack_req(req->rq_reqbuf, req->rq_reqlen,
                             &req->rq_reqhdr, &req->rq_req);
-        if (rc) {
+        if (rc || OBD_FAIL_CHECK(OBD_FAIL_MDS_HANDLE_UNPACK)) {
                 CERROR("lustre_mds: Invalid request\n");
                 GOTO(out, rc);
         }
@@ -420,31 +423,31 @@ int mds_handle(struct obd_device *dev, struct ptlrpc_service *svc,
 
         case MDS_GETATTR:
                 CDEBUG(D_INODE, "getattr\n");
-                OBD_CHECK_DROP_PACKET(req, OBD_INST_MDS_GETATTR);
+                OBD_FAIL_RETURN(OBD_FAIL_MDS_GETATTR_NET, 0);
                 rc = mds_getattr(req);
                 break;
 
         case MDS_READPAGE:
                 CDEBUG(D_INODE, "readpage\n");
-                OBD_CHECK_DROP_PACKET(req, OBD_INST_MDS_READPAGE);
+                OBD_FAIL_RETURN(OBD_FAIL_MDS_READPAGE_NET, 0);
                 rc = mds_readpage(req);
                 break;
 
         case MDS_REINT:
                 CDEBUG(D_INODE, "reint\n");
-                OBD_CHECK_DROP_PACKET(req, OBD_INST_MDS_REINT);
+                OBD_FAIL_RETURN(OBD_FAIL_MDS_REINT_NET, 0);
                 rc = mds_reint(req);
                 break;
 
         case MDS_OPEN:
                 CDEBUG(D_INODE, "open\n");
-                OBD_CHECK_DROP_PACKET(req, OBD_INST_MDS_OPEN);
+                OBD_FAIL_RETURN(OBD_FAIL_MDS_OPEN_NET, 0);
                 rc = mds_open(req);
                 break;
 
         case MDS_CLOSE:
                 CDEBUG(D_INODE, "close\n");
-                OBD_CHECK_DROP_PACKET(req, OBD_INST_MDS_CLOSE);
+                OBD_FAIL_RETURN(OBD_FAIL_MDS_CLOSE_NET, 0);
                 rc = mds_close(req);
                 break;
 
diff --git a/lustre/mds/mds_reint.c b/lustre/mds/mds_reint.c
index ee22076cc9..ba9e21467b 100644
--- a/lustre/mds/mds_reint.c
+++ b/lustre/mds/mds_reint.c
@@ -41,15 +41,17 @@ extern struct ptlrpc_request *mds_prep_req(int size, int opcode, int namelen, ch
 
 static int mds_reint_setattr(struct mds_update_record *rec, struct ptlrpc_request *req)
 {
+        struct inode *inode;
 	struct dentry *de;
 
 	de = mds_fid2dentry(&req->rq_obd->u.mds, rec->ur_fid1, NULL);
-	if (IS_ERR(de)) { 
-		req->rq_rephdr->status = -ESTALE;
-		return 0;
+        if (IS_ERR(de) || OBD_FAIL_CHECK(OBD_FAIL_MDS_REINT_SETATTR)) {
+                req->rq_rephdr->status = -ESTALE;
+                RETURN(0);
 	}
 
-        CDEBUG(D_INODE, "ino %ld\n", de->d_inode->i_ino);
+        inode = de->d_inode;
+        CDEBUG(D_INODE, "ino %ld\n", inode->i_ino);
 
 	/* a _really_ horrible hack to avoid removing the data stored
 	   in the block pointers; this data is the object id 
@@ -58,20 +60,30 @@ static int mds_reint_setattr(struct mds_update_record *rec, struct ptlrpc_reques
 	if ( rec->ur_iattr.ia_valid & ATTR_SIZE ) { 
 		/* ATTR_SIZE would invoke truncate: clear it */ 
 		rec->ur_iattr.ia_valid &= ~ATTR_SIZE;
-		de->d_inode->i_size = rec->ur_iattr.ia_size;
+                inode->i_size = rec->ur_iattr.ia_size;
+
+                /* an _even_more_ horrible hack to make this hack work with
+                 * ext3.  This is because ext3 keeps a separate inode size
+                 * until the inode is committed to ensure consistency.  This
+                 * will also go away with the move to EAs.
+                 */
+                if (!strcmp(inode->i_sb->s_type->name, "ext3"))
+                        inode->u.ext3_i.i_disksize = inode->i_size;
+
 		/* make sure _something_ gets set - so new inode
 		   goes to disk (probably won't work over XFS */
-		if (!rec->ur_iattr.ia_valid & ATTR_MODE) { 
+		if (!rec->ur_iattr.ia_valid & ATTR_MODE) {
 			rec->ur_iattr.ia_valid |= ATTR_MODE;
-			rec->ur_iattr.ia_mode = de->d_inode->i_mode;
+			rec->ur_iattr.ia_mode = inode->i_mode;
 		}
 	}
-	if ( de->d_inode->i_op->setattr ) {
+        OBD_FAIL_WRITE(OBD_FAIL_MDS_REINT_SETATTR_WRITE);
+        if ( inode->i_op->setattr ) {
 		req->rq_rephdr->status =
-			de->d_inode->i_op->setattr(de, &rec->ur_iattr);
-	} else { 
+                        inode->i_op->setattr(de, &rec->ur_iattr);
+	} else {
 		req->rq_rephdr->status =
-			inode_setattr(de->d_inode, &rec->ur_iattr);
+                        inode_setattr(inode, &rec->ur_iattr);
 	}
 
 	l_dput(de);
@@ -94,42 +106,35 @@ static int mds_reint_create(struct mds_update_record *rec,
 			    struct ptlrpc_request *req)
 {
 	int type = rec->ur_mode & S_IFMT;
-	struct dentry *de;
+        struct dentry *de = NULL;
 	struct mds_rep *rep = req->rq_rep.mds;
-	struct dentry *dchild; 
+        struct dentry *dchild = NULL;
 	int rc;
 	ENTRY;
 
 	de = mds_fid2dentry(&req->rq_obd->u.mds, rec->ur_fid1, NULL);
-	if (IS_ERR(de)) { 
-		req->rq_rephdr->status = -ESTALE;
+        if (IS_ERR(de) || OBD_FAIL_CHECK(OBD_FAIL_MDS_REINT_CREATE)) {
                 BUG();
-		EXIT;
-		return 0;
+                GOTO(out_reint_create, (rc = -ESTALE));
 	}
         CDEBUG(D_INODE, "ino %ld\n", de->d_inode->i_ino);
 
 	dchild = lookup_one_len(rec->ur_name, de, rec->ur_namelen - 1);
-	rc = PTR_ERR(dchild);
-	if (IS_ERR(dchild)) { 
-		CERROR("child lookup error %d\n", rc);
-		dput(de); 
-		req->rq_rephdr->status = -ESTALE;
+        if (IS_ERR(dchild)) {
+                CERROR("child lookup error %ld\n", PTR_ERR(dchild));
                 BUG();
-		EXIT;
-		return 0;
+                GOTO(out_reint_create, (rc = -ESTALE));
 	}
 
 	if (dchild->d_inode) {
 		CERROR("child exists (dir %ld, name %s)\n", 
 		       de->d_inode->i_ino, rec->ur_name);
-		dput(de); 
-		req->rq_rephdr->status = -EEXIST;
                 BUG();
-		EXIT;
-		return 0;
+                GOTO(out_reint_create, (rc = -EEXIST));
 	}
 
+        OBD_FAIL_WRITE(OBD_FAIL_MDS_REINT_CREATE_WRITE);
+
 	switch (type) {
 	case S_IFREG: { 
 		rc = vfs_create(de->d_inode, dchild, rec->ur_mode);
@@ -157,7 +162,6 @@ static int mds_reint_create(struct mds_update_record *rec,
 	}
 	}
 
-	req->rq_rephdr->status = rc;
 	if (!rc) { 
 		if (type == S_IFREG)
 			mds_store_objid(dchild->d_inode, &rec->ur_id); 
@@ -169,105 +173,95 @@ static int mds_reint_create(struct mds_update_record *rec,
 		rep->ino = dchild->d_inode->i_ino;
 	}
 
-	dput(de);
-	dput(dchild); 
-	EXIT;
-	return 0;
+out_reint_create:
+        req->rq_rephdr->status = rc;
+        l_dput(de);
+        l_dput(dchild);
+        RETURN(0);
 }
 
 static int mds_reint_unlink(struct mds_update_record *rec, 
 			    struct ptlrpc_request *req)
 {
-	struct dentry *de;
-	struct dentry *dchild; 
-	int rc;
+        struct dentry *de = NULL;
+        struct dentry *dchild = NULL;
+        int rc = 0;
 	ENTRY;
 
 	de = mds_fid2dentry(&req->rq_obd->u.mds, rec->ur_fid1, NULL);
-	if (IS_ERR(de)) { 
+        if (IS_ERR(de) || OBD_FAIL_CHECK(OBD_FAIL_MDS_REINT_UNLINK)) {
                 BUG();
-		req->rq_rephdr->status = -ESTALE;
-		EXIT;
-		return 0;
+                GOTO(out_unlink, (rc = -ESTALE));
 	}
         CDEBUG(D_INODE, "ino %ld\n", de->d_inode->i_ino);
 
 	dchild = lookup_one_len(rec->ur_name, de, rec->ur_namelen - 1);
-	rc = PTR_ERR(dchild);
-	if (IS_ERR(dchild)) { 
-		CERROR("child lookup error %d\n", rc);
+        if (IS_ERR(dchild)) {
+                CERROR("child lookup error %ld\n", PTR_ERR(dchild));
                 BUG();
-		dput(de); 
-		req->rq_rephdr->status = -ESTALE;
-		EXIT;
-		return 0;
+                GOTO(out_unlink, (rc = -ESTALE));
 	}
 
 	if (!dchild->d_inode) {
 		CERROR("child doesn't exist (dir %ld, name %s\n", 
 		       de->d_inode->i_ino, rec->ur_name);
                 BUG();
-		dput(de); 
-		req->rq_rephdr->status = -ESTALE;
-		EXIT;
-		return 0;
+                GOTO(out_unlink, (rc = -ESTALE));
 	}
 
+        OBD_FAIL_WRITE(OBD_FAIL_MDS_REINT_UNLINK_WRITE);
+
 	switch (dchild->d_inode->i_mode & S_IFMT) {
 	case S_IFDIR:
 		rc = vfs_rmdir(de->d_inode, dchild);
 		EXIT;
 		break;
 	default:
-		rc = vfs_unlink(de->d_inode, dchild);
-		
+                rc = vfs_unlink(de->d_inode, dchild);
 		EXIT;
 		break;
 	}
 
-	req->rq_rephdr->status = rc;
-	dput(de);
-	dput(dchild); 
-	EXIT;
-	return 0;
+out_unlink:
+        req->rq_rephdr->status = rc;
+        l_dput(de);
+        l_dput(dchild);
+        RETURN(0);
 }
 
 static int mds_reint_link(struct mds_update_record *rec, 
 			    struct ptlrpc_request *req)
 {
-	struct dentry *de_src = NULL;
-	struct dentry *de_tgt_dir = NULL;
-	struct dentry *dchild = NULL; 
-	int rc;
-	ENTRY;
+        struct dentry *de_src = NULL;
+        struct dentry *de_tgt_dir = NULL;
+        struct dentry *dchild = NULL;
+        int rc = 0;
 
-	rc = -ESTALE;
-	de_src = mds_fid2dentry(&req->rq_obd->u.mds, rec->ur_fid1, NULL);
-	if (IS_ERR(de_src)) { 
-		EXIT;
-		goto out_link;
-	}
+        ENTRY;
+        de_src = mds_fid2dentry(&req->rq_obd->u.mds, rec->ur_fid1, NULL);
+        if (IS_ERR(de_src) || OBD_FAIL_CHECK(OBD_FAIL_MDS_REINT_LINK)) {
+                GOTO(out_link, (rc = -ESTALE));
+        }
 
 	de_tgt_dir = mds_fid2dentry(&req->rq_obd->u.mds, rec->ur_fid2, NULL);
-	if (IS_ERR(de_tgt_dir)) { 
-		EXIT;
-		goto out_link;
+        if (IS_ERR(de_tgt_dir)) {
+                GOTO(out_link, (rc = -ESTALE));
 	}
 
 	dchild = lookup_one_len(rec->ur_name, de_tgt_dir, rec->ur_namelen - 1);
-	if (IS_ERR(dchild)) { 
-		CERROR("child lookup error %d\n", rc);
-                EXIT;
-		goto out_link;
+	if (IS_ERR(dchild)) {
+                CERROR("child lookup error %ld\n", PTR_ERR(dchild));
+		GOTO(out_link, (rc = -ESTALE));
 	}
 
 	if (dchild->d_inode) {
 		CERROR("child exists (dir %ld, name %s\n", 
 		       de_tgt_dir->d_inode->i_ino, rec->ur_name);
-		EXIT;
-		goto out_link;
+		GOTO(out_link, (rc = -EEXIST));
 	}
 
+        OBD_FAIL_WRITE(OBD_FAIL_MDS_REINT_LINK_WRITE);
+
 	rc = vfs_link(de_src, de_tgt_dir->d_inode, dchild); 
         EXIT;
 
@@ -287,36 +281,33 @@ static int mds_reint_rename(struct mds_update_record *rec,
 	struct dentry *de_tgtdir = NULL;
 	struct dentry *de_old = NULL; 
 	struct dentry *de_new = NULL; 
-	int rc;
+	int rc = 0;
 	ENTRY;
 
-	rc = -ESTALE;
 	de_srcdir = mds_fid2dentry(&req->rq_obd->u.mds, rec->ur_fid1, NULL);
-	if (IS_ERR(de_srcdir)) { 
-		EXIT;
-		goto out_rename;
+        if (IS_ERR(de_srcdir)) {
+                GOTO(out_rename, (rc = -ESTALE));
 	}
 
 	de_tgtdir = mds_fid2dentry(&req->rq_obd->u.mds, rec->ur_fid2, NULL);
-	if (IS_ERR(de_tgtdir)) { 
-		EXIT;
-		goto out_rename;
+        if (IS_ERR(de_tgtdir)) {
+                GOTO(out_rename, (rc = -ESTALE));
 	}
 
 	de_old = lookup_one_len(rec->ur_name, de_srcdir, rec->ur_namelen - 1);
-	if (IS_ERR(de_old)) { 
-		CERROR("child lookup error %d\n", rc);
-                EXIT;
-		goto out_rename;
+        if (IS_ERR(de_old)) {
+                CERROR("child lookup error %ld\n", PTR_ERR(de_old));
+                GOTO(out_rename, (rc = -ESTALE));
 	}
 
 	de_new = lookup_one_len(rec->ur_tgt, de_tgtdir, rec->ur_tgtlen - 1);
-	if (IS_ERR(de_new)) { 
-		CERROR("child lookup error %d\n", rc);
-                EXIT;
-		goto out_rename;
+        if (IS_ERR(de_new)) {
+                CERROR("child lookup error %ld\n", PTR_ERR(de_new));
+                GOTO(out_rename, (rc = -ESTALE));
 	}
 
+        OBD_FAIL_WRITE(OBD_FAIL_MDS_REINT_RENAME_WRITE);
+
 	rc = vfs_rename(de_srcdir->d_inode, de_old, de_tgtdir->d_inode, de_new);
         EXIT;
 
@@ -331,32 +322,30 @@ static int mds_reint_rename(struct mds_update_record *rec,
 
 typedef int (*mds_reinter)(struct mds_update_record *, struct ptlrpc_request*); 
 
-static mds_reinter  reinters[REINT_MAX+1] = { 
-	[REINT_SETATTR]   mds_reint_setattr, 
-	[REINT_CREATE]    mds_reint_create,
-	[REINT_UNLINK]    mds_reint_unlink, 
-	[REINT_LINK]      mds_reint_link,
-	[REINT_RENAME]    mds_reint_rename
+static mds_reinter  reinters[REINT_MAX+1] = {
+        [REINT_SETATTR]   mds_reint_setattr,
+        [REINT_CREATE]    mds_reint_create,
+        [REINT_UNLINK]    mds_reint_unlink,
+        [REINT_LINK]      mds_reint_link,
+        [REINT_RENAME]    mds_reint_rename
 };
 
 int mds_reint_rec(struct mds_update_record *rec, struct ptlrpc_request *req)
 {
 	int rc; 
 
-	if (rec->ur_opcode < 0 || rec->ur_opcode > REINT_MAX) { 
-		CERROR("opcode %d not valid\n", 
-		       rec->ur_opcode); 
-		rc = req->rq_status = -EINVAL;
-		return rc;
+        if (rec->ur_opcode < 0 || rec->ur_opcode > REINT_MAX) {
+                CERROR("opcode %d not valid\n", rec->ur_opcode);
+                rc = req->rq_status = -EINVAL;
+                RETURN(rc);
 	}
 
 	rc = mds_pack_rep(NULL, 0, NULL, 0, &req->rq_rephdr, &req->rq_rep, 
 			  &req->rq_replen, &req->rq_repbuf);
-	if (rc) { 
-		EXIT;
-		CERROR("mds: out of memory\n");
-		rc = req->rq_status = -ENOMEM;
-		return rc;
+        if (rc) {
+                CERROR("mds: out of memory\n");
+                rc = req->rq_status = -ENOMEM;
+                RETURN(rc);
 	}
 	req->rq_rephdr->xid = req->rq_reqhdr->xid;
 
diff --git a/lustre/obdclass/class_obd.c b/lustre/obdclass/class_obd.c
index 5d83a8911f..9d92bbb07c 100644
--- a/lustre/obdclass/class_obd.c
+++ b/lustre/obdclass/class_obd.c
@@ -61,7 +61,7 @@
 
 static int obd_init_magic;
 unsigned long obd_memory = 0;
-unsigned long obd_drop_packet = 0;
+unsigned long obd_fail_loc = 0;
 struct obd_device obd_dev[MAX_OBD_DEVICES];
 struct list_head obd_types;
 
@@ -545,7 +545,7 @@ EXPORT_SYMBOL(obdo_cachep);
 EXPORT_SYMBOL(gen_multi_setup);
 EXPORT_SYMBOL(gen_multi_cleanup);
 EXPORT_SYMBOL(obd_memory);
-EXPORT_SYMBOL(obd_drop_packet);
+EXPORT_SYMBOL(obd_fail_loc);
 
 static int __init init_obdclass(void)
 {
diff --git a/lustre/obdclass/sysctl.c b/lustre/obdclass/sysctl.c
index 388e8f3e36..57ae735344 100644
--- a/lustre/obdclass/sysctl.c
+++ b/lustre/obdclass/sysctl.c
@@ -52,7 +52,7 @@ static int obd_sctl_reset( ctl_table * table, int write, struct file
 
 #define OBD_SYSCTL 300
 
-#define OBD_DROP_PACKET     1       /* control packet drop instrumentation */
+#define OBD_FAIL_LOC        1       /* control test failures instrumentation */
 #define OBD_ENTRY           2       /* control enter/leave pattern */
 #define OBD_TIMEOUT         3       /* timeout on upcalls to become intrble */
 #define OBD_HARD            4       /* mount type "hard" or "soft" */
@@ -63,7 +63,7 @@ static int obd_sctl_reset( ctl_table * table, int write, struct file
 #define OBD_VARS_SLOT       2
 
 static ctl_table obd_table[] = {
-        {OBD_VARS, "drop_packet", &obd_drop_packet, sizeof(int), 0644, NULL, &proc_dointvec},
+        {OBD_FAIL_LOC, "fail_loc", &obd_fail_loc, sizeof(int), 0644, NULL, &proc_dointvec},
         {OBD_VARS, "vars", &vars[0], sizeof(int), 0644, NULL, &proc_dointvec},
         {OBD_INDEX, "index", &index, sizeof(int), 0644, NULL, &obd_sctl_vars},
         {OBD_RESET, "reset", NULL, 0, 0644, NULL, &obd_sctl_reset},
@@ -71,7 +71,7 @@ static ctl_table obd_table[] = {
 };
 
 static ctl_table parent_table[] = {
-       {OBD_SYSCTL, "obd", NULL, 0, 0555, obd_table},
+       {OBD_SYSCTL, "lustre", NULL, 0, 0555, obd_table},
        {0}
 };
 
diff --git a/lustre/ost/ost_handler.c b/lustre/ost/ost_handler.c
index 10a595b9f7..3ef44b6658 100644
--- a/lustre/ost/ost_handler.c
+++ b/lustre/ost/ost_handler.c
@@ -574,57 +574,57 @@ static int ost_handle(struct obd_device *obddev, struct ptlrpc_service *svc,
 
         case OST_CONNECT:
                 CDEBUG(D_INODE, "connect\n");
-                OBD_CHECK_DROP_PACKET(req, OBD_INST_OST_CONNECT);
+                OBD_FAIL_RETURN(OBD_FAIL_OST_CONNECT_NET, 0);
                 rc = ost_connect(ost, req);
                 break;
         case OST_DISCONNECT:
                 CDEBUG(D_INODE, "disconnect\n");
-                OBD_CHECK_DROP_PACKET(req, OBD_INST_OST_DISCONNECT);
+                OBD_FAIL_RETURN(OBD_FAIL_OST_DISCONNECT_NET, 0);
                 rc = ost_disconnect(ost, req);
                 break;
         case OST_GET_INFO:
                 CDEBUG(D_INODE, "get_info\n");
-                OBD_CHECK_DROP_PACKET(req, OBD_INST_OST_GET_INFO);
+                OBD_FAIL_RETURN(OBD_FAIL_OST_GET_INFO_NET, 0);
                 rc = ost_get_info(ost, req);
                 break;
         case OST_CREATE:
                 CDEBUG(D_INODE, "create\n");
-                OBD_CHECK_DROP_PACKET(req, OBD_INST_OST_CREATE);
+                OBD_FAIL_RETURN(OBD_FAIL_OST_CREATE_NET, 0);
                 rc = ost_create(ost, req);
                 break;
         case OST_DESTROY:
                 CDEBUG(D_INODE, "destroy\n");
-                OBD_CHECK_DROP_PACKET(req, OBD_INST_OST_DESTROY);
+                OBD_FAIL_RETURN(OBD_FAIL_OST_DESTROY_NET, 0);
                 rc = ost_destroy(ost, req);
                 break;
         case OST_GETATTR:
                 CDEBUG(D_INODE, "getattr\n");
-                OBD_CHECK_DROP_PACKET(req, OBD_INST_OST_GETATTR);
+                OBD_FAIL_RETURN(OBD_FAIL_OST_GETATTR_NET, 0);
                 rc = ost_getattr(ost, req);
                 break;
         case OST_SETATTR:
                 CDEBUG(D_INODE, "setattr\n");
-                OBD_CHECK_DROP_PACKET(req, OBD_INST_OST_SETATTR);
+                OBD_FAIL_RETURN(OBD_FAIL_OST_SETATTR_NET, 0);
                 rc = ost_setattr(ost, req);
                 break;
         case OST_OPEN:
                 CDEBUG(D_INODE, "setattr\n");
-                OBD_CHECK_DROP_PACKET(req, OBD_INST_OST_OPEN);
+                OBD_FAIL_RETURN(OBD_FAIL_OST_OPEN_NET, 0);
                 rc = ost_open(ost, req);
                 break;
         case OST_CLOSE:
                 CDEBUG(D_INODE, "setattr\n");
-                OBD_CHECK_DROP_PACKET(req, OBD_INST_OST_CLOSE);
+                OBD_FAIL_RETURN(OBD_FAIL_OST_CLOSE_NET, 0);
                 rc = ost_close(ost, req);
                 break;
         case OST_BRW:
                 CDEBUG(D_INODE, "brw\n");
-                OBD_CHECK_DROP_PACKET(req, OBD_INST_OST_BRW);
+                OBD_FAIL_RETURN(OBD_FAIL_OST_BRW_NET, 0);
                 rc = ost_brw(ost, req);
                 break;
         case OST_PUNCH:
                 CDEBUG(D_INODE, "punch\n");
-                OBD_CHECK_DROP_PACKET(req, OBD_INST_OST_PUNCH);
+                OBD_FAIL_RETURN(OBD_FAIL_OST_PUNCH_NET, 0);
                 rc = ost_punch(ost, req);
                 break;
         default:
-- 
GitLab