aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc/platforms/cell
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2012-07-19 08:12:22 -0400
committerAl Viro <viro@zeniv.linux.org.uk>2012-07-29 13:24:12 -0400
commit1ba44cc970e40b544af7e76a19285d568b4f3ccc (patch)
treed5e60ba132aeafd645e6005ab8b0f9ecb3c14f64 /arch/powerpc/platforms/cell
parent66ec7b2cd0d84561ef3c420b5995d0c1dd2cf1c5 (diff)
spufs: pull unlock-and-dput() up into spufs_create()
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'arch/powerpc/platforms/cell')
-rw-r--r--arch/powerpc/platforms/cell/spufs/inode.c33
1 files changed, 10 insertions, 23 deletions
diff --git a/arch/powerpc/platforms/cell/spufs/inode.c b/arch/powerpc/platforms/cell/spufs/inode.c
index 848134e72058..0576c44aa75c 100644
--- a/arch/powerpc/platforms/cell/spufs/inode.c
+++ b/arch/powerpc/platforms/cell/spufs/inode.c
@@ -450,28 +450,24 @@ spufs_create_context(struct inode *inode, struct dentry *dentry,
450 struct spu_context *neighbor; 450 struct spu_context *neighbor;
451 struct path path = {.mnt = mnt, .dentry = dentry}; 451 struct path path = {.mnt = mnt, .dentry = dentry};
452 452
453 ret = -EPERM;
454 if ((flags & SPU_CREATE_NOSCHED) && 453 if ((flags & SPU_CREATE_NOSCHED) &&
455 !capable(CAP_SYS_NICE)) 454 !capable(CAP_SYS_NICE))
456 goto out_unlock; 455 return -EPERM;
457 456
458 ret = -EINVAL;
459 if ((flags & (SPU_CREATE_NOSCHED | SPU_CREATE_ISOLATE)) 457 if ((flags & (SPU_CREATE_NOSCHED | SPU_CREATE_ISOLATE))
460 == SPU_CREATE_ISOLATE) 458 == SPU_CREATE_ISOLATE)
461 goto out_unlock; 459 return -EINVAL;
462 460
463 ret = -ENODEV;
464 if ((flags & SPU_CREATE_ISOLATE) && !isolated_loader) 461 if ((flags & SPU_CREATE_ISOLATE) && !isolated_loader)
465 goto out_unlock; 462 return -ENODEV;
466 463
467 gang = NULL; 464 gang = NULL;
468 neighbor = NULL; 465 neighbor = NULL;
469 affinity = flags & (SPU_CREATE_AFFINITY_MEM | SPU_CREATE_AFFINITY_SPU); 466 affinity = flags & (SPU_CREATE_AFFINITY_MEM | SPU_CREATE_AFFINITY_SPU);
470 if (affinity) { 467 if (affinity) {
471 gang = SPUFS_I(inode)->i_gang; 468 gang = SPUFS_I(inode)->i_gang;
472 ret = -EINVAL;
473 if (!gang) 469 if (!gang)
474 goto out_unlock; 470 return -EINVAL;
475 mutex_lock(&gang->aff_mutex); 471 mutex_lock(&gang->aff_mutex);
476 neighbor = spufs_assert_affinity(flags, gang, aff_filp); 472 neighbor = spufs_assert_affinity(flags, gang, aff_filp);
477 if (IS_ERR(neighbor)) { 473 if (IS_ERR(neighbor)) {
@@ -498,9 +494,6 @@ spufs_create_context(struct inode *inode, struct dentry *dentry,
498out_aff_unlock: 494out_aff_unlock:
499 if (affinity) 495 if (affinity)
500 mutex_unlock(&gang->aff_mutex); 496 mutex_unlock(&gang->aff_mutex);
501out_unlock:
502 mutex_unlock(&inode->i_mutex);
503 dput(dentry);
504 return ret; 497 return ret;
505} 498}
506 499
@@ -573,18 +566,13 @@ static int spufs_create_gang(struct inode *inode,
573 int ret; 566 int ret;
574 567
575 ret = spufs_mkgang(inode, dentry, mode & S_IRWXUGO); 568 ret = spufs_mkgang(inode, dentry, mode & S_IRWXUGO);
576 if (ret) 569 if (!ret) {
577 goto out; 570 ret = spufs_gang_open(&path);
578 571 if (ret < 0) {
579 ret = spufs_gang_open(&path); 572 int err = simple_rmdir(inode, dentry);
580 if (ret < 0) { 573 WARN_ON(err);
581 int err = simple_rmdir(inode, dentry); 574 }
582 WARN_ON(err);
583 } 575 }
584
585out:
586 mutex_unlock(&inode->i_mutex);
587 dput(dentry);
588 return ret; 576 return ret;
589} 577}
590 578
@@ -623,7 +611,6 @@ long spufs_create(struct path *path, struct dentry *dentry,
623 filp); 611 filp);
624 if (ret >= 0) 612 if (ret >= 0)
625 fsnotify_mkdir(path->dentry->d_inode, dentry); 613 fsnotify_mkdir(path->dentry->d_inode, dentry);
626 return ret;
627 614
628out: 615out:
629 mutex_unlock(&path->dentry->d_inode->i_mutex); 616 mutex_unlock(&path->dentry->d_inode->i_mutex);