summaryrefslogtreecommitdiff
path: root/net/unix/garbage.c
diff options
context:
space:
mode:
authorMark Brown <broonie@kernel.org>2016-02-05 19:28:22 +0000
committerMark Brown <broonie@kernel.org>2016-02-05 19:28:22 +0000
commitcd6f5814252060db2d38f57c602db33696c549c0 (patch)
tree0bcf23a07f1316cb57f0127e5b1622fea59c3e8e /net/unix/garbage.c
parentd235b7b42ab59e2e616082a0735b3bcc76685c7b (diff)
parente14ca734b547e3187713441909897aefdf4e4016 (diff)
Merge tag 'v3.10.96' into linux-linaro-lsk-v3.10lsk-v3.10-16.02
This is the 3.10.96 stable release
Diffstat (limited to 'net/unix/garbage.c')
-rw-r--r--net/unix/garbage.c16
1 files changed, 12 insertions, 4 deletions
diff --git a/net/unix/garbage.c b/net/unix/garbage.c
index 9bc73f87f64a..06730fe6ad9d 100644
--- a/net/unix/garbage.c
+++ b/net/unix/garbage.c
@@ -125,9 +125,12 @@ struct sock *unix_get_socket(struct file *filp)
void unix_inflight(struct file *fp)
{
struct sock *s = unix_get_socket(fp);
+
+ spin_lock(&unix_gc_lock);
+
if (s) {
struct unix_sock *u = unix_sk(s);
- spin_lock(&unix_gc_lock);
+
if (atomic_long_inc_return(&u->inflight) == 1) {
BUG_ON(!list_empty(&u->link));
list_add_tail(&u->link, &gc_inflight_list);
@@ -135,22 +138,27 @@ void unix_inflight(struct file *fp)
BUG_ON(list_empty(&u->link));
}
unix_tot_inflight++;
- spin_unlock(&unix_gc_lock);
}
+ fp->f_cred->user->unix_inflight++;
+ spin_unlock(&unix_gc_lock);
}
void unix_notinflight(struct file *fp)
{
struct sock *s = unix_get_socket(fp);
+
+ spin_lock(&unix_gc_lock);
+
if (s) {
struct unix_sock *u = unix_sk(s);
- spin_lock(&unix_gc_lock);
+
BUG_ON(list_empty(&u->link));
if (atomic_long_dec_and_test(&u->inflight))
list_del_init(&u->link);
unix_tot_inflight--;
- spin_unlock(&unix_gc_lock);
}
+ fp->f_cred->user->unix_inflight--;
+ spin_unlock(&unix_gc_lock);
}
static void scan_inflight(struct sock *x, void (*func)(struct unix_sock *),