diff options
author | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2008-02-06 21:06:58 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2008-02-06 21:06:58 -0500 |
commit | 488b5ec871191359b9b79262a3d48456dae7ea5f (patch) | |
tree | af9d1ca5d16e7cd195cf132e7af74222dc00a6f9 /net/9p/util.c | |
parent | a80a438bd08827d0581fca849f3e4e539a22b39c (diff) | |
parent | 727674435470537a5e75e5f81f96d5d97de57956 (diff) |
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ericvh/v9fs
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ericvh/v9fs:
9p: fix p9_printfcall export
9p: transport API reorganization
9p: add remove function to trans_virtio
9p: Convert semaphore to spinlock for p9_idpool
9p: fix mmap to be read-only
9p: add support for sticky bit
9p: Fix soft lockup in virtio transport
9p: fix bug in attach-per-user
9p: block-based virtio client
9p: create transport rpc cut-thru
9p: fix bug in p9_clone_stat
Diffstat (limited to 'net/9p/util.c')
-rw-r--r-- | net/9p/util.c | 20 |
1 files changed, 8 insertions, 12 deletions
diff --git a/net/9p/util.c b/net/9p/util.c index 22077b79395d..ef7215565d88 100644 --- a/net/9p/util.c +++ b/net/9p/util.c | |||
@@ -33,7 +33,7 @@ | |||
33 | #include <net/9p/9p.h> | 33 | #include <net/9p/9p.h> |
34 | 34 | ||
35 | struct p9_idpool { | 35 | struct p9_idpool { |
36 | struct semaphore lock; | 36 | spinlock_t lock; |
37 | struct idr pool; | 37 | struct idr pool; |
38 | }; | 38 | }; |
39 | 39 | ||
@@ -45,7 +45,7 @@ struct p9_idpool *p9_idpool_create(void) | |||
45 | if (!p) | 45 | if (!p) |
46 | return ERR_PTR(-ENOMEM); | 46 | return ERR_PTR(-ENOMEM); |
47 | 47 | ||
48 | init_MUTEX(&p->lock); | 48 | spin_lock_init(&p->lock); |
49 | idr_init(&p->pool); | 49 | idr_init(&p->pool); |
50 | 50 | ||
51 | return p; | 51 | return p; |
@@ -71,19 +71,17 @@ int p9_idpool_get(struct p9_idpool *p) | |||
71 | { | 71 | { |
72 | int i = 0; | 72 | int i = 0; |
73 | int error; | 73 | int error; |
74 | unsigned int flags; | ||
74 | 75 | ||
75 | retry: | 76 | retry: |
76 | if (idr_pre_get(&p->pool, GFP_KERNEL) == 0) | 77 | if (idr_pre_get(&p->pool, GFP_KERNEL) == 0) |
77 | return 0; | 78 | return 0; |
78 | 79 | ||
79 | if (down_interruptible(&p->lock) == -EINTR) { | 80 | spin_lock_irqsave(&p->lock, flags); |
80 | P9_EPRINTK(KERN_WARNING, "Interrupted while locking\n"); | ||
81 | return -1; | ||
82 | } | ||
83 | 81 | ||
84 | /* no need to store exactly p, we just need something non-null */ | 82 | /* no need to store exactly p, we just need something non-null */ |
85 | error = idr_get_new(&p->pool, p, &i); | 83 | error = idr_get_new(&p->pool, p, &i); |
86 | up(&p->lock); | 84 | spin_unlock_irqrestore(&p->lock, flags); |
87 | 85 | ||
88 | if (error == -EAGAIN) | 86 | if (error == -EAGAIN) |
89 | goto retry; | 87 | goto retry; |
@@ -104,12 +102,10 @@ EXPORT_SYMBOL(p9_idpool_get); | |||
104 | 102 | ||
105 | void p9_idpool_put(int id, struct p9_idpool *p) | 103 | void p9_idpool_put(int id, struct p9_idpool *p) |
106 | { | 104 | { |
107 | if (down_interruptible(&p->lock) == -EINTR) { | 105 | unsigned int flags; |
108 | P9_EPRINTK(KERN_WARNING, "Interrupted while locking\n"); | 106 | spin_lock_irqsave(&p->lock, flags); |
109 | return; | ||
110 | } | ||
111 | idr_remove(&p->pool, id); | 107 | idr_remove(&p->pool, id); |
112 | up(&p->lock); | 108 | spin_unlock_irqrestore(&p->lock, flags); |
113 | } | 109 | } |
114 | EXPORT_SYMBOL(p9_idpool_put); | 110 | EXPORT_SYMBOL(p9_idpool_put); |
115 | 111 | ||