From 7ecdd8b09219d63b53975cec08c1c0ae693a4a9d Mon Sep 17 00:00:00 2001
From: anserper <anserper>
Date: Thu, 28 Aug 2008 14:18:04 +0000
Subject: [PATCH] Branch b1_6 b=16676 i=Johann Lombardi (johann@sun.com)
 i=Zhenyu Xu (zhenyu.xu@sun.com)

add inode locking around vfs-calling critical sections
---
 lustre/mds/mds_join.c  |  2 ++
 lustre/mds/mds_open.c  |  9 +++++++--
 lustre/mds/mds_reint.c | 20 ++++++++++++++++++++
 3 files changed, 29 insertions(+), 2 deletions(-)

diff --git a/lustre/mds/mds_join.c b/lustre/mds/mds_join.c
index 0cb6fdc81f..1fbaab84da 100644
--- a/lustre/mds/mds_join.c
+++ b/lustre/mds/mds_join.c
@@ -321,7 +321,9 @@ static int mds_join_unlink_tail_inode(struct mds_update_record *rec,
                 le32_to_cpu(tail_lmm->lmm_magic) == LOV_MAGIC);
 
         LASSERT(de_tailparent);
+        LOCK_INODE_MUTEX(de_tailparent->d_inode);
         rc = ll_vfs_unlink(de_tailparent->d_inode, de_tail, mds->mds_vfsmnt);
+        UNLOCK_INODE_MUTEX(de_tailparent->d_inode);
 
         if (rc == 0) {
                 CDEBUG(D_INODE, "delete the tail inode %lu/%u \n",
diff --git a/lustre/mds/mds_open.c b/lustre/mds/mds_open.c
index 291ac5b837..8dcc85d071 100644
--- a/lustre/mds/mds_open.c
+++ b/lustre/mds/mds_open.c
@@ -1087,7 +1087,9 @@ int mds_open(struct mds_update_record *rec, int offset,
                 dp.ldp_ptr = req;
                 dp.ldp_inum = ino;
 
+                LOCK_INODE_MUTEX(dparent->d_inode);
                 rc = ll_vfs_create(dparent->d_inode, dchild, rec->ur_mode,NULL);
+                UNLOCK_INODE_MUTEX(dparent->d_inode);
                 if (dchild->d_fsdata == (void *)(unsigned long)ino)
                         dchild->d_fsdata = NULL;
 
@@ -1254,8 +1256,11 @@ found_child:
                         ldlm_lock_decref(child_lockh, child_mode);
         case 2:
                 if (rc && created) {
-                        int err = ll_vfs_unlink(dparent->d_inode, dchild,
-                                                mds->mds_vfsmnt);
+                        int err;
+                        LOCK_INODE_MUTEX(dparent->d_inode);
+                        err = ll_vfs_unlink(dparent->d_inode, dchild,
+                                            mds->mds_vfsmnt);
+                        UNLOCK_INODE_MUTEX(dparent->d_inode);
                         if (err) {
                                 CERROR("unlink(%.*s) in error path: %d\n",
                                        dchild->d_name.len, dchild->d_name.name,
diff --git a/lustre/mds/mds_reint.c b/lustre/mds/mds_reint.c
index cf588341c7..7d94fe271a 100644
--- a/lustre/mds/mds_reint.c
+++ b/lustre/mds/mds_reint.c
@@ -905,7 +905,9 @@ static int mds_reint_create(struct mds_update_record *rec, int offset,
                 handle = fsfilt_start(obd, dir, FSFILT_OP_CREATE, NULL);
                 if (IS_ERR(handle))
                         GOTO(cleanup, rc = PTR_ERR(handle));
+                LOCK_INODE_MUTEX(dir);
                 rc = ll_vfs_create(dir, dchild, rec->ur_mode, NULL);
+                UNLOCK_INODE_MUTEX(dir);
                 mds_counter_incr(req->rq_export, LPROC_MDS_MKNOD);
                 EXIT;
                 break;
@@ -914,7 +916,9 @@ static int mds_reint_create(struct mds_update_record *rec, int offset,
                 handle = fsfilt_start(obd, dir, FSFILT_OP_MKDIR, NULL);
                 if (IS_ERR(handle))
                         GOTO(cleanup, rc = PTR_ERR(handle));
+                LOCK_INODE_MUTEX(dir);
                 rc = ll_vfs_mkdir(dir, dchild, mds->mds_vfsmnt, rec->ur_mode);
+                UNLOCK_INODE_MUTEX(dir);
                 mds_counter_incr(req->rq_export, LPROC_MDS_MKDIR);
                 EXIT;
                 break;
@@ -923,11 +927,13 @@ static int mds_reint_create(struct mds_update_record *rec, int offset,
                 handle = fsfilt_start(obd, dir, FSFILT_OP_SYMLINK, NULL);
                 if (IS_ERR(handle))
                         GOTO(cleanup, rc = PTR_ERR(handle));
+                LOCK_INODE_MUTEX(dir);
                 if (rec->ur_tgt == NULL)        /* no target supplied */
                         rc = -EINVAL;           /* -EPROTO? */
                 else
                         rc = ll_vfs_symlink(dir, dchild, mds->mds_vfsmnt, 
                                             rec->ur_tgt, S_IALLUGO);
+                UNLOCK_INODE_MUTEX(dir);
                 mds_counter_incr(req->rq_export, LPROC_MDS_MKNOD);
                 EXIT;
                 break;
@@ -940,8 +946,10 @@ static int mds_reint_create(struct mds_update_record *rec, int offset,
                 handle = fsfilt_start(obd, dir, FSFILT_OP_MKNOD, NULL);
                 if (IS_ERR(handle))
                         GOTO(cleanup, rc = PTR_ERR(handle));
+                LOCK_INODE_MUTEX(dir);
                 rc = ll_vfs_mknod(dir, dchild, mds->mds_vfsmnt, rec->ur_mode, 
                                   rdev);
+                UNLOCK_INODE_MUTEX(dir);
                 mds_counter_incr(req->rq_export, LPROC_MDS_MKNOD);
                 EXIT;
                 break;
@@ -1028,12 +1036,16 @@ cleanup:
                  */
                 switch (type) {
                 case S_IFDIR:
+                        LOCK_INODE_MUTEX(dir);
                         err = ll_vfs_rmdir(dir, dchild, mds->mds_vfsmnt);
+                        UNLOCK_INODE_MUTEX(dir);
                         if (err)
                                 CERROR("rmdir in error path: %d\n", err);
                         break;
                 default:
+                        LOCK_INODE_MUTEX(dir);
                         err = ll_vfs_unlink(dir, dchild, mds->mds_vfsmnt);
+                        UNLOCK_INODE_MUTEX(dir);
                         if (err)
                                 CERROR("unlink in error path: %d\n", err);
                         break;
@@ -1740,7 +1752,9 @@ static int mds_reint_unlink(struct mds_update_record *rec, int offset,
                                       NULL);
                 if (IS_ERR(handle))
                         GOTO(cleanup, rc = PTR_ERR(handle));
+                LOCK_INODE_MUTEX(dparent->d_inode);
                 rc = ll_vfs_rmdir(dparent->d_inode, dchild, mds->mds_vfsmnt);
+                UNLOCK_INODE_MUTEX(dparent->d_inode);
                 mds_counter_incr(req->rq_export, LPROC_MDS_RMDIR);
                 break;
         case S_IFREG: {
@@ -1751,7 +1765,9 @@ static int mds_reint_unlink(struct mds_update_record *rec, int offset,
                                           le32_to_cpu(lmm->lmm_stripe_count));
                 if (IS_ERR(handle))
                         GOTO(cleanup, rc = PTR_ERR(handle));
+                LOCK_INODE_MUTEX(dparent->d_inode);
                 rc = ll_vfs_unlink(dparent->d_inode, dchild, mds->mds_vfsmnt);
+                UNLOCK_INODE_MUTEX(dparent->d_inode);
                 mds_counter_incr(req->rq_export, LPROC_MDS_UNLINK);
                 break;
         }
@@ -1764,7 +1780,9 @@ static int mds_reint_unlink(struct mds_update_record *rec, int offset,
                                       NULL);
                 if (IS_ERR(handle))
                         GOTO(cleanup, rc = PTR_ERR(handle));
+                LOCK_INODE_MUTEX(dparent->d_inode);
                 rc = ll_vfs_unlink(dparent->d_inode, dchild, mds->mds_vfsmnt);
+                UNLOCK_INODE_MUTEX(dparent->d_inode);
                 mds_counter_incr(req->rq_export, LPROC_MDS_UNLINK);
                 break;
         default:
@@ -1961,8 +1979,10 @@ static int mds_reint_link(struct mds_update_record *rec, int offset,
         if (IS_ERR(handle))
                 GOTO(cleanup, rc = PTR_ERR(handle));
 
+        LOCK_INODE_MUTEX(de_tgt_dir->d_inode);
         rc = ll_vfs_link(de_src, mds->mds_vfsmnt, de_tgt_dir->d_inode, dchild,
                          mds->mds_vfsmnt);
+        UNLOCK_INODE_MUTEX(de_tgt_dir->d_inode);
         if (rc && rc != -EPERM && rc != -EACCES)
                 CERROR("vfs_link error %d\n", rc);
 cleanup:
-- 
GitLab