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