Skip to content
Snippets Groups Projects
Commit 7ecdd8b0 authored by Andrew Perepechko's avatar Andrew Perepechko
Browse files

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
parent e721e444
No related branches found
No related tags found
No related merge requests found
...@@ -321,7 +321,9 @@ static int mds_join_unlink_tail_inode(struct mds_update_record *rec, ...@@ -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); le32_to_cpu(tail_lmm->lmm_magic) == LOV_MAGIC);
LASSERT(de_tailparent); LASSERT(de_tailparent);
LOCK_INODE_MUTEX(de_tailparent->d_inode);
rc = ll_vfs_unlink(de_tailparent->d_inode, de_tail, mds->mds_vfsmnt); rc = ll_vfs_unlink(de_tailparent->d_inode, de_tail, mds->mds_vfsmnt);
UNLOCK_INODE_MUTEX(de_tailparent->d_inode);
if (rc == 0) { if (rc == 0) {
CDEBUG(D_INODE, "delete the tail inode %lu/%u \n", CDEBUG(D_INODE, "delete the tail inode %lu/%u \n",
......
...@@ -1087,7 +1087,9 @@ int mds_open(struct mds_update_record *rec, int offset, ...@@ -1087,7 +1087,9 @@ int mds_open(struct mds_update_record *rec, int offset,
dp.ldp_ptr = req; dp.ldp_ptr = req;
dp.ldp_inum = ino; dp.ldp_inum = ino;
LOCK_INODE_MUTEX(dparent->d_inode);
rc = ll_vfs_create(dparent->d_inode, dchild, rec->ur_mode,NULL); 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) if (dchild->d_fsdata == (void *)(unsigned long)ino)
dchild->d_fsdata = NULL; dchild->d_fsdata = NULL;
...@@ -1254,8 +1256,11 @@ found_child: ...@@ -1254,8 +1256,11 @@ found_child:
ldlm_lock_decref(child_lockh, child_mode); ldlm_lock_decref(child_lockh, child_mode);
case 2: case 2:
if (rc && created) { if (rc && created) {
int err = ll_vfs_unlink(dparent->d_inode, dchild, int err;
mds->mds_vfsmnt); 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) { if (err) {
CERROR("unlink(%.*s) in error path: %d\n", CERROR("unlink(%.*s) in error path: %d\n",
dchild->d_name.len, dchild->d_name.name, dchild->d_name.len, dchild->d_name.name,
......
...@@ -905,7 +905,9 @@ static int mds_reint_create(struct mds_update_record *rec, int offset, ...@@ -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); handle = fsfilt_start(obd, dir, FSFILT_OP_CREATE, NULL);
if (IS_ERR(handle)) if (IS_ERR(handle))
GOTO(cleanup, rc = PTR_ERR(handle)); GOTO(cleanup, rc = PTR_ERR(handle));
LOCK_INODE_MUTEX(dir);
rc = ll_vfs_create(dir, dchild, rec->ur_mode, NULL); rc = ll_vfs_create(dir, dchild, rec->ur_mode, NULL);
UNLOCK_INODE_MUTEX(dir);
mds_counter_incr(req->rq_export, LPROC_MDS_MKNOD); mds_counter_incr(req->rq_export, LPROC_MDS_MKNOD);
EXIT; EXIT;
break; break;
...@@ -914,7 +916,9 @@ static int mds_reint_create(struct mds_update_record *rec, int offset, ...@@ -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); handle = fsfilt_start(obd, dir, FSFILT_OP_MKDIR, NULL);
if (IS_ERR(handle)) if (IS_ERR(handle))
GOTO(cleanup, rc = PTR_ERR(handle)); GOTO(cleanup, rc = PTR_ERR(handle));
LOCK_INODE_MUTEX(dir);
rc = ll_vfs_mkdir(dir, dchild, mds->mds_vfsmnt, rec->ur_mode); 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); mds_counter_incr(req->rq_export, LPROC_MDS_MKDIR);
EXIT; EXIT;
break; break;
...@@ -923,11 +927,13 @@ static int mds_reint_create(struct mds_update_record *rec, int offset, ...@@ -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); handle = fsfilt_start(obd, dir, FSFILT_OP_SYMLINK, NULL);
if (IS_ERR(handle)) if (IS_ERR(handle))
GOTO(cleanup, rc = PTR_ERR(handle)); GOTO(cleanup, rc = PTR_ERR(handle));
LOCK_INODE_MUTEX(dir);
if (rec->ur_tgt == NULL) /* no target supplied */ if (rec->ur_tgt == NULL) /* no target supplied */
rc = -EINVAL; /* -EPROTO? */ rc = -EINVAL; /* -EPROTO? */
else else
rc = ll_vfs_symlink(dir, dchild, mds->mds_vfsmnt, rc = ll_vfs_symlink(dir, dchild, mds->mds_vfsmnt,
rec->ur_tgt, S_IALLUGO); rec->ur_tgt, S_IALLUGO);
UNLOCK_INODE_MUTEX(dir);
mds_counter_incr(req->rq_export, LPROC_MDS_MKNOD); mds_counter_incr(req->rq_export, LPROC_MDS_MKNOD);
EXIT; EXIT;
break; break;
...@@ -940,8 +946,10 @@ static int mds_reint_create(struct mds_update_record *rec, int offset, ...@@ -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); handle = fsfilt_start(obd, dir, FSFILT_OP_MKNOD, NULL);
if (IS_ERR(handle)) if (IS_ERR(handle))
GOTO(cleanup, rc = PTR_ERR(handle)); GOTO(cleanup, rc = PTR_ERR(handle));
LOCK_INODE_MUTEX(dir);
rc = ll_vfs_mknod(dir, dchild, mds->mds_vfsmnt, rec->ur_mode, rc = ll_vfs_mknod(dir, dchild, mds->mds_vfsmnt, rec->ur_mode,
rdev); rdev);
UNLOCK_INODE_MUTEX(dir);
mds_counter_incr(req->rq_export, LPROC_MDS_MKNOD); mds_counter_incr(req->rq_export, LPROC_MDS_MKNOD);
EXIT; EXIT;
break; break;
...@@ -1028,12 +1036,16 @@ cleanup: ...@@ -1028,12 +1036,16 @@ cleanup:
*/ */
switch (type) { switch (type) {
case S_IFDIR: case S_IFDIR:
LOCK_INODE_MUTEX(dir);
err = ll_vfs_rmdir(dir, dchild, mds->mds_vfsmnt); err = ll_vfs_rmdir(dir, dchild, mds->mds_vfsmnt);
UNLOCK_INODE_MUTEX(dir);
if (err) if (err)
CERROR("rmdir in error path: %d\n", err); CERROR("rmdir in error path: %d\n", err);
break; break;
default: default:
LOCK_INODE_MUTEX(dir);
err = ll_vfs_unlink(dir, dchild, mds->mds_vfsmnt); err = ll_vfs_unlink(dir, dchild, mds->mds_vfsmnt);
UNLOCK_INODE_MUTEX(dir);
if (err) if (err)
CERROR("unlink in error path: %d\n", err); CERROR("unlink in error path: %d\n", err);
break; break;
...@@ -1740,7 +1752,9 @@ static int mds_reint_unlink(struct mds_update_record *rec, int offset, ...@@ -1740,7 +1752,9 @@ static int mds_reint_unlink(struct mds_update_record *rec, int offset,
NULL); NULL);
if (IS_ERR(handle)) if (IS_ERR(handle))
GOTO(cleanup, rc = PTR_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); 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); mds_counter_incr(req->rq_export, LPROC_MDS_RMDIR);
break; break;
case S_IFREG: { case S_IFREG: {
...@@ -1751,7 +1765,9 @@ static int mds_reint_unlink(struct mds_update_record *rec, int offset, ...@@ -1751,7 +1765,9 @@ static int mds_reint_unlink(struct mds_update_record *rec, int offset,
le32_to_cpu(lmm->lmm_stripe_count)); le32_to_cpu(lmm->lmm_stripe_count));
if (IS_ERR(handle)) if (IS_ERR(handle))
GOTO(cleanup, rc = PTR_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); 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); mds_counter_incr(req->rq_export, LPROC_MDS_UNLINK);
break; break;
} }
...@@ -1764,7 +1780,9 @@ static int mds_reint_unlink(struct mds_update_record *rec, int offset, ...@@ -1764,7 +1780,9 @@ static int mds_reint_unlink(struct mds_update_record *rec, int offset,
NULL); NULL);
if (IS_ERR(handle)) if (IS_ERR(handle))
GOTO(cleanup, rc = PTR_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); 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); mds_counter_incr(req->rq_export, LPROC_MDS_UNLINK);
break; break;
default: default:
...@@ -1961,8 +1979,10 @@ static int mds_reint_link(struct mds_update_record *rec, int offset, ...@@ -1961,8 +1979,10 @@ static int mds_reint_link(struct mds_update_record *rec, int offset,
if (IS_ERR(handle)) if (IS_ERR(handle))
GOTO(cleanup, rc = PTR_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, rc = ll_vfs_link(de_src, mds->mds_vfsmnt, de_tgt_dir->d_inode, dchild,
mds->mds_vfsmnt); mds->mds_vfsmnt);
UNLOCK_INODE_MUTEX(de_tgt_dir->d_inode);
if (rc && rc != -EPERM && rc != -EACCES) if (rc && rc != -EPERM && rc != -EACCES)
CERROR("vfs_link error %d\n", rc); CERROR("vfs_link error %d\n", rc);
cleanup: cleanup:
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment