From 3af97648b816c168a818215e1ea8ef2cacf570d1 Mon Sep 17 00:00:00 2001 From: Andre Detsch Date: Fri, 11 Jan 2008 15:03:26 +1100 Subject: [PATCH] --- yaml --- r: 83935 b: refs/heads/master c: 58119068cb27ef7513f80aff44b62a3a8f40ef5f h: refs/heads/master i: 83933: 28d0ef37d5fef68e52add5e06b4cf169bd20bffa 83931: 31d6a6d675e488a174d56069227b923f3606e0c8 83927: f2724f6ddb6e166983010a746721cee154475dff 83919: a8cc5c50b906030222d7d2ca41d17f5eec700d35 83903: 1261ac7354811c4aec6e0b25f26e10d70aadea97 v: v3 --- [refs] | 2 +- .../arch/powerpc/platforms/cell/spufs/inode.c | 29 ++++++++++++++----- 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/[refs] b/[refs] index 5463fe1913da..571947941dd0 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 60cf54db47727935af1c439f59c636a96a8cbd4b +refs/heads/master: 58119068cb27ef7513f80aff44b62a3a8f40ef5f diff --git a/trunk/arch/powerpc/platforms/cell/spufs/inode.c b/trunk/arch/powerpc/platforms/cell/spufs/inode.c index c0e968a4c211..90784c029f25 100644 --- a/trunk/arch/powerpc/platforms/cell/spufs/inode.c +++ b/trunk/arch/powerpc/platforms/cell/spufs/inode.c @@ -322,7 +322,7 @@ static struct spu_context * spufs_assert_affinity(unsigned int flags, struct spu_gang *gang, struct file *filp) { - struct spu_context *tmp, *neighbor; + struct spu_context *tmp, *neighbor, *err; int count, node; int aff_supp; @@ -354,11 +354,15 @@ spufs_assert_affinity(unsigned int flags, struct spu_gang *gang, if (!list_empty(&neighbor->aff_list) && !(neighbor->aff_head) && !list_is_last(&neighbor->aff_list, &gang->aff_list_head) && !list_entry(neighbor->aff_list.next, struct spu_context, - aff_list)->aff_head) - return ERR_PTR(-EEXIST); + aff_list)->aff_head) { + err = ERR_PTR(-EEXIST); + goto out_put_neighbor; + } - if (gang != neighbor->gang) - return ERR_PTR(-EINVAL); + if (gang != neighbor->gang) { + err = ERR_PTR(-EINVAL); + goto out_put_neighbor; + } count = 1; list_for_each_entry(tmp, &gang->aff_list_head, aff_list) @@ -372,11 +376,17 @@ spufs_assert_affinity(unsigned int flags, struct spu_gang *gang, break; } - if (node == MAX_NUMNODES) - return ERR_PTR(-EEXIST); + if (node == MAX_NUMNODES) { + err = ERR_PTR(-EEXIST); + goto out_put_neighbor; + } } return neighbor; + +out_put_neighbor: + put_spu_context(neighbor); + return err; } static void @@ -454,9 +464,12 @@ spufs_create_context(struct inode *inode, struct dentry *dentry, if (ret) goto out_aff_unlock; - if (affinity) + if (affinity) { spufs_set_affinity(flags, SPUFS_I(dentry->d_inode)->i_ctx, neighbor); + if (neighbor) + put_spu_context(neighbor); + } /* * get references for dget and mntget, will be released