diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2012-07-19 08:12:22 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2012-07-29 13:24:12 -0400 |
commit | 1ba44cc970e40b544af7e76a19285d568b4f3ccc (patch) | |
tree | d5e60ba132aeafd645e6005ab8b0f9ecb3c14f64 /arch/powerpc/platforms/cell | |
parent | 66ec7b2cd0d84561ef3c420b5995d0c1dd2cf1c5 (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.c | 33 |
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, | |||
498 | out_aff_unlock: | 494 | out_aff_unlock: |
499 | if (affinity) | 495 | if (affinity) |
500 | mutex_unlock(&gang->aff_mutex); | 496 | mutex_unlock(&gang->aff_mutex); |
501 | out_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 | |||
585 | out: | ||
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 | ||
628 | out: | 615 | out: |
629 | mutex_unlock(&path->dentry->d_inode->i_mutex); | 616 | mutex_unlock(&path->dentry->d_inode->i_mutex); |