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;
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,
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;
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;
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;
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;
*/
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;
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: {
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;
}
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:
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: