1
2
3
4
5
6
7
8
9
10
11
12
13#include <linux/types.h>
14#include <linux/fs.h>
15#include <linux/file.h>
16#include <linux/slab.h>
17#include <linux/signal.h>
18#include <linux/sched.h>
19#include <linux/kmod.h>
20#include <linux/list.h>
21#include <linux/module.h>
22#include <linux/ctype.h>
23#include <asm/uaccess.h>
24#include <linux/poll.h>
25#include <linux/seq_file.h>
26#include <linux/proc_fs.h>
27#include <linux/net.h>
28#include <linux/workqueue.h>
29#include <linux/mutex.h>
30#include <linux/pagemap.h>
31#include <asm/ioctls.h>
32#include <linux/sunrpc/types.h>
33#include <linux/sunrpc/cache.h>
34#include <linux/sunrpc/stats.h>
35#include <linux/sunrpc/rpc_pipe_fs.h>
36#include "netns.h"
37
38#define RPCDBG_FACILITY RPCDBG_CACHE
39
40static bool cache_defer_req(struct cache_req *req, struct cache_head *item);
41static void cache_revisit_request(struct cache_head *item);
42
43static void cache_init(struct cache_head *h)
44{
45 time_t now = seconds_since_boot();
46 h->next = NULL;
47 h->flags = 0;
48 kref_init(&h->ref);
49 h->expiry_time = now + CACHE_NEW_EXPIRY;
50 h->last_refresh = now;
51}
52
53static inline int cache_is_expired(struct cache_detail *detail, struct cache_head *h)
54{
55 return (h->expiry_time < seconds_since_boot()) ||
56 (detail->flush_time > h->last_refresh);
57}
58
59struct cache_head *sunrpc_cache_lookup(struct cache_detail *detail,
60 struct cache_head *key, int hash)
61{
62 struct cache_head **head, **hp;
63 struct cache_head *new = NULL, *freeme = NULL;
64
65 head = &detail->hash_table[hash];
66
67 read_lock(&detail->hash_lock);
68
69 for (hp=head; *hp != NULL ; hp = &(*hp)->next) {
70 struct cache_head *tmp = *hp;
71 if (detail->match(tmp, key)) {
72 if (cache_is_expired(detail, tmp))
73
74 break;
75 cache_get(tmp);
76 read_unlock(&detail->hash_lock);
77 return tmp;
78 }
79 }
80 read_unlock(&detail->hash_lock);
81
82
83 new = detail->alloc();
84 if (!new)
85 return NULL;
86
87
88
89
90 cache_init(new);
91 detail->init(new, key);
92
93 write_lock(&detail->hash_lock);
94
95
96 for (hp=head; *hp != NULL ; hp = &(*hp)->next) {
97 struct cache_head *tmp = *hp;
98 if (detail->match(tmp, key)) {
99 if (cache_is_expired(detail, tmp)) {
100 *hp = tmp->next;
101 tmp->next = NULL;
102 detail->entries --;
103 freeme = tmp;
104 break;
105 }
106 cache_get(tmp);
107 write_unlock(&detail->hash_lock);
108 cache_put(new, detail);
109 return tmp;
110 }
111 }
112 new->next = *head;
113 *head = new;
114 detail->entries++;
115 cache_get(new);
116 write_unlock(&detail->hash_lock);
117
118 if (freeme)
119 cache_put(freeme, detail);
120 return new;
121}
122EXPORT_SYMBOL_GPL(sunrpc_cache_lookup);
123
124
125static void cache_dequeue(struct cache_detail *detail, struct cache_head *ch);
126
127static void cache_fresh_locked(struct cache_head *head, time_t expiry)
128{
129 head->expiry_time = expiry;
130 head->last_refresh = seconds_since_boot();
131 smp_wmb();
132 set_bit(CACHE_VALID, &head->flags);
133}
134
135static void cache_fresh_unlocked(struct cache_head *head,
136 struct cache_detail *detail)
137{
138 if (test_and_clear_bit(CACHE_PENDING, &head->flags)) {
139 cache_revisit_request(head);
140 cache_dequeue(detail, head);
141 }
142}
143
144struct cache_head *sunrpc_cache_update(struct cache_detail *detail,
145 struct cache_head *new, struct cache_head *old, int hash)
146{
147
148
149
150
151 struct cache_head **head;
152 struct cache_head *tmp;
153
154 if (!test_bit(CACHE_VALID, &old->flags)) {
155 write_lock(&detail->hash_lock);
156 if (!test_bit(CACHE_VALID, &old->flags)) {
157 if (test_bit(CACHE_NEGATIVE, &new->flags))
158 set_bit(CACHE_NEGATIVE, &old->flags);
159 else
160 detail->update(old, new);
161 cache_fresh_locked(old, new->expiry_time);
162 write_unlock(&detail->hash_lock);
163 cache_fresh_unlocked(old, detail);
164 return old;
165 }
166 write_unlock(&detail->hash_lock);
167 }
168
169 tmp = detail->alloc();
170 if (!tmp) {
171 cache_put(old, detail);
172 return NULL;
173 }
174 cache_init(tmp);
175 detail->init(tmp, old);
176 head = &detail->hash_table[hash];
177
178 write_lock(&detail->hash_lock);
179 if (test_bit(CACHE_NEGATIVE, &new->flags))
180 set_bit(CACHE_NEGATIVE, &tmp->flags);
181 else
182 detail->update(tmp, new);
183 tmp->next = *head;
184 *head = tmp;
185 detail->entries++;
186 cache_get(tmp);
187 cache_fresh_locked(tmp, new->expiry_time);
188 cache_fresh_locked(old, 0);
189 write_unlock(&detail->hash_lock);
190 cache_fresh_unlocked(tmp, detail);
191 cache_fresh_unlocked(old, detail);
192 cache_put(old, detail);
193 return tmp;
194}
195EXPORT_SYMBOL_GPL(sunrpc_cache_update);
196
197static int cache_make_upcall(struct cache_detail *cd, struct cache_head *h)
198{
199 if (!cd->cache_upcall)
200 return -EINVAL;
201 return cd->cache_upcall(cd, h);
202}
203
204static inline int cache_is_valid(struct cache_detail *detail, struct cache_head *h)
205{
206 if (!test_bit(CACHE_VALID, &h->flags))
207 return -EAGAIN;
208 else {
209
210 if (test_bit(CACHE_NEGATIVE, &h->flags))
211 return -ENOENT;
212 else {
213
214
215
216
217
218
219 smp_rmb();
220 return 0;
221 }
222 }
223}
224
225static int try_to_negate_entry(struct cache_detail *detail, struct cache_head *h)
226{
227 int rv;
228
229 write_lock(&detail->hash_lock);
230 rv = cache_is_valid(detail, h);
231 if (rv != -EAGAIN) {
232 write_unlock(&detail->hash_lock);
233 return rv;
234 }
235 set_bit(CACHE_NEGATIVE, &h->flags);
236 cache_fresh_locked(h, seconds_since_boot()+CACHE_NEW_EXPIRY);
237 write_unlock(&detail->hash_lock);
238 cache_fresh_unlocked(h, detail);
239 return -ENOENT;
240}
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256int cache_check(struct cache_detail *detail,
257 struct cache_head *h, struct cache_req *rqstp)
258{
259 int rv;
260 long refresh_age, age;
261
262
263 rv = cache_is_valid(detail, h);
264
265
266 refresh_age = (h->expiry_time - h->last_refresh);
267 age = seconds_since_boot() - h->last_refresh;
268
269 if (rqstp == NULL) {
270 if (rv == -EAGAIN)
271 rv = -ENOENT;
272 } else if (rv == -EAGAIN || age > refresh_age/2) {
273 dprintk("RPC: Want update, refage=%ld, age=%ld\n",
274 refresh_age, age);
275 if (!test_and_set_bit(CACHE_PENDING, &h->flags)) {
276 switch (cache_make_upcall(detail, h)) {
277 case -EINVAL:
278 clear_bit(CACHE_PENDING, &h->flags);
279 cache_revisit_request(h);
280 rv = try_to_negate_entry(detail, h);
281 break;
282 case -EAGAIN:
283 clear_bit(CACHE_PENDING, &h->flags);
284 cache_revisit_request(h);
285 break;
286 }
287 }
288 }
289
290 if (rv == -EAGAIN) {
291 if (!cache_defer_req(rqstp, h)) {
292
293
294
295
296 rv = cache_is_valid(detail, h);
297 if (rv == -EAGAIN)
298 rv = -ETIMEDOUT;
299 }
300 }
301 if (rv)
302 cache_put(h, detail);
303 return rv;
304}
305EXPORT_SYMBOL_GPL(cache_check);
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339static LIST_HEAD(cache_list);
340static DEFINE_SPINLOCK(cache_list_lock);
341static struct cache_detail *current_detail;
342static int current_index;
343
344static void do_cache_clean(struct work_struct *work);
345static struct delayed_work cache_cleaner;
346
347void sunrpc_init_cache_detail(struct cache_detail *cd)
348{
349 rwlock_init(&cd->hash_lock);
350 INIT_LIST_HEAD(&cd->queue);
351 spin_lock(&cache_list_lock);
352 cd->nextcheck = 0;
353 cd->entries = 0;
354 atomic_set(&cd->readers, 0);
355 cd->last_close = 0;
356 cd->last_warn = -1;
357 list_add(&cd->others, &cache_list);
358 spin_unlock(&cache_list_lock);
359
360
361 schedule_delayed_work(&cache_cleaner, 0);
362}
363EXPORT_SYMBOL_GPL(sunrpc_init_cache_detail);
364
365void sunrpc_destroy_cache_detail(struct cache_detail *cd)
366{
367 cache_purge(cd);
368 spin_lock(&cache_list_lock);
369 write_lock(&cd->hash_lock);
370 if (cd->entries || atomic_read(&cd->inuse)) {
371 write_unlock(&cd->hash_lock);
372 spin_unlock(&cache_list_lock);
373 goto out;
374 }
375 if (current_detail == cd)
376 current_detail = NULL;
377 list_del_init(&cd->others);
378 write_unlock(&cd->hash_lock);
379 spin_unlock(&cache_list_lock);
380 if (list_empty(&cache_list)) {
381
382 cancel_delayed_work_sync(&cache_cleaner);
383 }
384 return;
385out:
386 printk(KERN_ERR "nfsd: failed to unregister %s cache\n", cd->name);
387}
388EXPORT_SYMBOL_GPL(sunrpc_destroy_cache_detail);
389
390
391
392
393
394
395
396static int cache_clean(void)
397{
398 int rv = 0;
399 struct list_head *next;
400
401 spin_lock(&cache_list_lock);
402
403
404 while (current_detail == NULL ||
405 current_index >= current_detail->hash_size) {
406 if (current_detail)
407 next = current_detail->others.next;
408 else
409 next = cache_list.next;
410 if (next == &cache_list) {
411 current_detail = NULL;
412 spin_unlock(&cache_list_lock);
413 return -1;
414 }
415 current_detail = list_entry(next, struct cache_detail, others);
416 if (current_detail->nextcheck > seconds_since_boot())
417 current_index = current_detail->hash_size;
418 else {
419 current_index = 0;
420 current_detail->nextcheck = seconds_since_boot()+30*60;
421 }
422 }
423
424
425 while (current_detail &&
426 current_index < current_detail->hash_size &&
427 current_detail->hash_table[current_index] == NULL)
428 current_index++;
429
430
431
432 if (current_detail && current_index < current_detail->hash_size) {
433 struct cache_head *ch, **cp;
434 struct cache_detail *d;
435
436 write_lock(¤t_detail->hash_lock);
437
438
439
440 cp = & current_detail->hash_table[current_index];
441 for (ch = *cp ; ch ; cp = & ch->next, ch = *cp) {
442 if (current_detail->nextcheck > ch->expiry_time)
443 current_detail->nextcheck = ch->expiry_time+1;
444 if (!cache_is_expired(current_detail, ch))
445 continue;
446
447 *cp = ch->next;
448 ch->next = NULL;
449 current_detail->entries--;
450 rv = 1;
451 break;
452 }
453
454 write_unlock(¤t_detail->hash_lock);
455 d = current_detail;
456 if (!ch)
457 current_index ++;
458 spin_unlock(&cache_list_lock);
459 if (ch) {
460 if (test_and_clear_bit(CACHE_PENDING, &ch->flags))
461 cache_dequeue(current_detail, ch);
462 cache_revisit_request(ch);
463 cache_put(ch, d);
464 }
465 } else
466 spin_unlock(&cache_list_lock);
467
468 return rv;
469}
470
471
472
473
474static void do_cache_clean(struct work_struct *work)
475{
476 int delay = 5;
477 if (cache_clean() == -1)
478 delay = round_jiffies_relative(30*HZ);
479
480 if (list_empty(&cache_list))
481 delay = 0;
482
483 if (delay)
484 schedule_delayed_work(&cache_cleaner, delay);
485}
486
487
488
489
490
491
492
493void cache_flush(void)
494{
495 while (cache_clean() != -1)
496 cond_resched();
497 while (cache_clean() != -1)
498 cond_resched();
499}
500EXPORT_SYMBOL_GPL(cache_flush);
501
502void cache_purge(struct cache_detail *detail)
503{
504 detail->flush_time = LONG_MAX;
505 detail->nextcheck = seconds_since_boot();
506 cache_flush();
507 detail->flush_time = 1;
508}
509EXPORT_SYMBOL_GPL(cache_purge);
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527#define DFR_HASHSIZE (PAGE_SIZE/sizeof(struct list_head))
528#define DFR_HASH(item) ((((long)item)>>4 ^ (((long)item)>>13)) % DFR_HASHSIZE)
529
530#define DFR_MAX 300
531
532static DEFINE_SPINLOCK(cache_defer_lock);
533static LIST_HEAD(cache_defer_list);
534static struct hlist_head cache_defer_hash[DFR_HASHSIZE];
535static int cache_defer_cnt;
536
537static void __unhash_deferred_req(struct cache_deferred_req *dreq)
538{
539 hlist_del_init(&dreq->hash);
540 if (!list_empty(&dreq->recent)) {
541 list_del_init(&dreq->recent);
542 cache_defer_cnt--;
543 }
544}
545
546static void __hash_deferred_req(struct cache_deferred_req *dreq, struct cache_head *item)
547{
548 int hash = DFR_HASH(item);
549
550 INIT_LIST_HEAD(&dreq->recent);
551 hlist_add_head(&dreq->hash, &cache_defer_hash[hash]);
552}
553
554static void setup_deferral(struct cache_deferred_req *dreq,
555 struct cache_head *item,
556 int count_me)
557{
558
559 dreq->item = item;
560
561 spin_lock(&cache_defer_lock);
562
563 __hash_deferred_req(dreq, item);
564
565 if (count_me) {
566 cache_defer_cnt++;
567 list_add(&dreq->recent, &cache_defer_list);
568 }
569
570 spin_unlock(&cache_defer_lock);
571
572}
573
574struct thread_deferred_req {
575 struct cache_deferred_req handle;
576 struct completion completion;
577};
578
579static void cache_restart_thread(struct cache_deferred_req *dreq, int too_many)
580{
581 struct thread_deferred_req *dr =
582 container_of(dreq, struct thread_deferred_req, handle);
583 complete(&dr->completion);
584}
585
586static void cache_wait_req(struct cache_req *req, struct cache_head *item)
587{
588 struct thread_deferred_req sleeper;
589 struct cache_deferred_req *dreq = &sleeper.handle;
590
591 sleeper.completion = COMPLETION_INITIALIZER_ONSTACK(sleeper.completion);
592 dreq->revisit = cache_restart_thread;
593
594 setup_deferral(dreq, item, 0);
595
596 if (!test_bit(CACHE_PENDING, &item->flags) ||
597 wait_for_completion_interruptible_timeout(
598 &sleeper.completion, req->thread_wait) <= 0) {
599
600
601
602 spin_lock(&cache_defer_lock);
603 if (!hlist_unhashed(&sleeper.handle.hash)) {
604 __unhash_deferred_req(&sleeper.handle);
605 spin_unlock(&cache_defer_lock);
606 } else {
607
608
609
610
611
612 spin_unlock(&cache_defer_lock);
613 wait_for_completion(&sleeper.completion);
614 }
615 }
616}
617
618static void cache_limit_defers(void)
619{
620
621
622
623 struct cache_deferred_req *discard = NULL;
624
625 if (cache_defer_cnt <= DFR_MAX)
626 return;
627
628 spin_lock(&cache_defer_lock);
629
630
631 if (cache_defer_cnt > DFR_MAX) {
632 if (net_random() & 1)
633 discard = list_entry(cache_defer_list.next,
634 struct cache_deferred_req, recent);
635 else
636 discard = list_entry(cache_defer_list.prev,
637 struct cache_deferred_req, recent);
638 __unhash_deferred_req(discard);
639 }
640 spin_unlock(&cache_defer_lock);
641 if (discard)
642 discard->revisit(discard, 1);
643}
644
645
646static bool cache_defer_req(struct cache_req *req, struct cache_head *item)
647{
648 struct cache_deferred_req *dreq;
649
650 if (req->thread_wait) {
651 cache_wait_req(req, item);
652 if (!test_bit(CACHE_PENDING, &item->flags))
653 return false;
654 }
655 dreq = req->defer(req);
656 if (dreq == NULL)
657 return false;
658 setup_deferral(dreq, item, 1);
659 if (!test_bit(CACHE_PENDING, &item->flags))
660
661
662
663 cache_revisit_request(item);
664
665 cache_limit_defers();
666 return true;
667}
668
669static void cache_revisit_request(struct cache_head *item)
670{
671 struct cache_deferred_req *dreq;
672 struct list_head pending;
673 struct hlist_node *lp, *tmp;
674 int hash = DFR_HASH(item);
675
676 INIT_LIST_HEAD(&pending);
677 spin_lock(&cache_defer_lock);
678
679 hlist_for_each_entry_safe(dreq, lp, tmp, &cache_defer_hash[hash], hash)
680 if (dreq->item == item) {
681 __unhash_deferred_req(dreq);
682 list_add(&dreq->recent, &pending);
683 }
684
685 spin_unlock(&cache_defer_lock);
686
687 while (!list_empty(&pending)) {
688 dreq = list_entry(pending.next, struct cache_deferred_req, recent);
689 list_del_init(&dreq->recent);
690 dreq->revisit(dreq, 0);
691 }
692}
693
694void cache_clean_deferred(void *owner)
695{
696 struct cache_deferred_req *dreq, *tmp;
697 struct list_head pending;
698
699
700 INIT_LIST_HEAD(&pending);
701 spin_lock(&cache_defer_lock);
702
703 list_for_each_entry_safe(dreq, tmp, &cache_defer_list, recent) {
704 if (dreq->owner == owner) {
705 __unhash_deferred_req(dreq);
706 list_add(&dreq->recent, &pending);
707 }
708 }
709 spin_unlock(&cache_defer_lock);
710
711 while (!list_empty(&pending)) {
712 dreq = list_entry(pending.next, struct cache_deferred_req, recent);
713 list_del_init(&dreq->recent);
714 dreq->revisit(dreq, 1);
715 }
716}
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734static DEFINE_SPINLOCK(queue_lock);
735static DEFINE_MUTEX(queue_io_mutex);
736
737struct cache_queue {
738 struct list_head list;
739 int reader;
740};
741struct cache_request {
742 struct cache_queue q;
743 struct cache_head *item;
744 char * buf;
745 int len;
746 int readers;
747};
748struct cache_reader {
749 struct cache_queue q;
750 int offset;
751};
752
753static ssize_t cache_read(struct file *filp, char __user *buf, size_t count,
754 loff_t *ppos, struct cache_detail *cd)
755{
756 struct cache_reader *rp = filp->private_data;
757 struct cache_request *rq;
758 struct inode *inode = filp->f_path.dentry->d_inode;
759 int err;
760
761 if (count == 0)
762 return 0;
763
764 mutex_lock(&inode->i_mutex);
765
766 again:
767 spin_lock(&queue_lock);
768
769 while (rp->q.list.next != &cd->queue &&
770 list_entry(rp->q.list.next, struct cache_queue, list)
771 ->reader) {
772 struct list_head *next = rp->q.list.next;
773 list_move(&rp->q.list, next);
774 }
775 if (rp->q.list.next == &cd->queue) {
776 spin_unlock(&queue_lock);
777 mutex_unlock(&inode->i_mutex);
778 BUG_ON(rp->offset);
779 return 0;
780 }
781 rq = container_of(rp->q.list.next, struct cache_request, q.list);
782 BUG_ON(rq->q.reader);
783 if (rp->offset == 0)
784 rq->readers++;
785 spin_unlock(&queue_lock);
786
787 if (rp->offset == 0 && !test_bit(CACHE_PENDING, &rq->item->flags)) {
788 err = -EAGAIN;
789 spin_lock(&queue_lock);
790 list_move(&rp->q.list, &rq->q.list);
791 spin_unlock(&queue_lock);
792 } else {
793 if (rp->offset + count > rq->len)
794 count = rq->len - rp->offset;
795 err = -EFAULT;
796 if (copy_to_user(buf, rq->buf + rp->offset, count))
797 goto out;
798 rp->offset += count;
799 if (rp->offset >= rq->len) {
800 rp->offset = 0;
801 spin_lock(&queue_lock);
802 list_move(&rp->q.list, &rq->q.list);
803 spin_unlock(&queue_lock);
804 }
805 err = 0;
806 }
807 out:
808 if (rp->offset == 0) {
809
810 spin_lock(&queue_lock);
811 rq->readers--;
812 if (rq->readers == 0 &&
813 !test_bit(CACHE_PENDING, &rq->item->flags)) {
814 list_del(&rq->q.list);
815 spin_unlock(&queue_lock);
816 cache_put(rq->item, cd);
817 kfree(rq->buf);
818 kfree(rq);
819 } else
820 spin_unlock(&queue_lock);
821 }
822 if (err == -EAGAIN)
823 goto again;
824 mutex_unlock(&inode->i_mutex);
825 return err ? err : count;
826}
827
828static ssize_t cache_do_downcall(char *kaddr, const char __user *buf,
829 size_t count, struct cache_detail *cd)
830{
831 ssize_t ret;
832
833 if (count == 0)
834 return -EINVAL;
835 if (copy_from_user(kaddr, buf, count))
836 return -EFAULT;
837 kaddr[count] = '\0';
838 ret = cd->cache_parse(cd, kaddr, count);
839 if (!ret)
840 ret = count;
841 return ret;
842}
843
844static ssize_t cache_slow_downcall(const char __user *buf,
845 size_t count, struct cache_detail *cd)
846{
847 static char write_buf[8192];
848 ssize_t ret = -EINVAL;
849
850 if (count >= sizeof(write_buf))
851 goto out;
852 mutex_lock(&queue_io_mutex);
853 ret = cache_do_downcall(write_buf, buf, count, cd);
854 mutex_unlock(&queue_io_mutex);
855out:
856 return ret;
857}
858
859static ssize_t cache_downcall(struct address_space *mapping,
860 const char __user *buf,
861 size_t count, struct cache_detail *cd)
862{
863 struct page *page;
864 char *kaddr;
865 ssize_t ret = -ENOMEM;
866
867 if (count >= PAGE_CACHE_SIZE)
868 goto out_slow;
869
870 page = find_or_create_page(mapping, 0, GFP_KERNEL);
871 if (!page)
872 goto out_slow;
873
874 kaddr = kmap(page);
875 ret = cache_do_downcall(kaddr, buf, count, cd);
876 kunmap(page);
877 unlock_page(page);
878 page_cache_release(page);
879 return ret;
880out_slow:
881 return cache_slow_downcall(buf, count, cd);
882}
883
884static ssize_t cache_write(struct file *filp, const char __user *buf,
885 size_t count, loff_t *ppos,
886 struct cache_detail *cd)
887{
888 struct address_space *mapping = filp->f_mapping;
889 struct inode *inode = filp->f_path.dentry->d_inode;
890 ssize_t ret = -EINVAL;
891
892 if (!cd->cache_parse)
893 goto out;
894
895 mutex_lock(&inode->i_mutex);
896 ret = cache_downcall(mapping, buf, count, cd);
897 mutex_unlock(&inode->i_mutex);
898out:
899 return ret;
900}
901
902static DECLARE_WAIT_QUEUE_HEAD(queue_wait);
903
904static unsigned int cache_poll(struct file *filp, poll_table *wait,
905 struct cache_detail *cd)
906{
907 unsigned int mask;
908 struct cache_reader *rp = filp->private_data;
909 struct cache_queue *cq;
910
911 poll_wait(filp, &queue_wait, wait);
912
913
914 mask = POLL_OUT | POLLWRNORM;
915
916 if (!rp)
917 return mask;
918
919 spin_lock(&queue_lock);
920
921 for (cq= &rp->q; &cq->list != &cd->queue;
922 cq = list_entry(cq->list.next, struct cache_queue, list))
923 if (!cq->reader) {
924 mask |= POLLIN | POLLRDNORM;
925 break;
926 }
927 spin_unlock(&queue_lock);
928 return mask;
929}
930
931static int cache_ioctl(struct inode *ino, struct file *filp,
932 unsigned int cmd, unsigned long arg,
933 struct cache_detail *cd)
934{
935 int len = 0;
936 struct cache_reader *rp = filp->private_data;
937 struct cache_queue *cq;
938
939 if (cmd != FIONREAD || !rp)
940 return -EINVAL;
941
942 spin_lock(&queue_lock);
943
944
945
946
947 for (cq= &rp->q; &cq->list != &cd->queue;
948 cq = list_entry(cq->list.next, struct cache_queue, list))
949 if (!cq->reader) {
950 struct cache_request *cr =
951 container_of(cq, struct cache_request, q);
952 len = cr->len - rp->offset;
953 break;
954 }
955 spin_unlock(&queue_lock);
956
957 return put_user(len, (int __user *)arg);
958}
959
960static int cache_open(struct inode *inode, struct file *filp,
961 struct cache_detail *cd)
962{
963 struct cache_reader *rp = NULL;
964
965 if (!cd || !try_module_get(cd->owner))
966 return -EACCES;
967 nonseekable_open(inode, filp);
968 if (filp->f_mode & FMODE_READ) {
969 rp = kmalloc(sizeof(*rp), GFP_KERNEL);
970 if (!rp)
971 return -ENOMEM;
972 rp->offset = 0;
973 rp->q.reader = 1;
974 atomic_inc(&cd->readers);
975 spin_lock(&queue_lock);
976 list_add(&rp->q.list, &cd->queue);
977 spin_unlock(&queue_lock);
978 }
979 filp->private_data = rp;
980 return 0;
981}
982
983static int cache_release(struct inode *inode, struct file *filp,
984 struct cache_detail *cd)
985{
986 struct cache_reader *rp = filp->private_data;
987
988 if (rp) {
989 spin_lock(&queue_lock);
990 if (rp->offset) {
991 struct cache_queue *cq;
992 for (cq= &rp->q; &cq->list != &cd->queue;
993 cq = list_entry(cq->list.next, struct cache_queue, list))
994 if (!cq->reader) {
995 container_of(cq, struct cache_request, q)
996 ->readers--;
997 break;
998 }
999 rp->offset = 0;
1000 }
1001 list_del(&rp->q.list);
1002 spin_unlock(&queue_lock);
1003
1004 filp->private_data = NULL;
1005 kfree(rp);
1006
1007 cd->last_close = seconds_since_boot();
1008 atomic_dec(&cd->readers);
1009 }
1010 module_put(cd->owner);
1011 return 0;
1012}
1013
1014
1015
1016static void cache_dequeue(struct cache_detail *detail, struct cache_head *ch)
1017{
1018 struct cache_queue *cq;
1019 spin_lock(&queue_lock);
1020 list_for_each_entry(cq, &detail->queue, list)
1021 if (!cq->reader) {
1022 struct cache_request *cr = container_of(cq, struct cache_request, q);
1023 if (cr->item != ch)
1024 continue;
1025 if (cr->readers != 0)
1026 continue;
1027 list_del(&cr->q.list);
1028 spin_unlock(&queue_lock);
1029 cache_put(cr->item, detail);
1030 kfree(cr->buf);
1031 kfree(cr);
1032 return;
1033 }
1034 spin_unlock(&queue_lock);
1035}
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046void qword_add(char **bpp, int *lp, char *str)
1047{
1048 char *bp = *bpp;
1049 int len = *lp;
1050 char c;
1051
1052 if (len < 0) return;
1053
1054 while ((c=*str++) && len)
1055 switch(c) {
1056 case ' ':
1057 case '\t':
1058 case '\n':
1059 case '\\':
1060 if (len >= 4) {
1061 *bp++ = '\\';
1062 *bp++ = '0' + ((c & 0300)>>6);
1063 *bp++ = '0' + ((c & 0070)>>3);
1064 *bp++ = '0' + ((c & 0007)>>0);
1065 }
1066 len -= 4;
1067 break;
1068 default:
1069 *bp++ = c;
1070 len--;
1071 }
1072 if (c || len <1) len = -1;
1073 else {
1074 *bp++ = ' ';
1075 len--;
1076 }
1077 *bpp = bp;
1078 *lp = len;
1079}
1080EXPORT_SYMBOL_GPL(qword_add);
1081
1082void qword_addhex(char **bpp, int *lp, char *buf, int blen)
1083{
1084 char *bp = *bpp;
1085 int len = *lp;
1086
1087 if (len < 0) return;
1088
1089 if (len > 2) {
1090 *bp++ = '\\';
1091 *bp++ = 'x';
1092 len -= 2;
1093 while (blen && len >= 2) {
1094 unsigned char c = *buf++;
1095 *bp++ = '0' + ((c&0xf0)>>4) + (c>=0xa0)*('a'-'9'-1);
1096 *bp++ = '0' + (c&0x0f) + ((c&0x0f)>=0x0a)*('a'-'9'-1);
1097 len -= 2;
1098 blen--;
1099 }
1100 }
1101 if (blen || len<1) len = -1;
1102 else {
1103 *bp++ = ' ';
1104 len--;
1105 }
1106 *bpp = bp;
1107 *lp = len;
1108}
1109EXPORT_SYMBOL_GPL(qword_addhex);
1110
1111static void warn_no_listener(struct cache_detail *detail)
1112{
1113 if (detail->last_warn != detail->last_close) {
1114 detail->last_warn = detail->last_close;
1115 if (detail->warn_no_listener)
1116 detail->warn_no_listener(detail, detail->last_close != 0);
1117 }
1118}
1119
1120static bool cache_listeners_exist(struct cache_detail *detail)
1121{
1122 if (atomic_read(&detail->readers))
1123 return true;
1124 if (detail->last_close == 0)
1125
1126 return false;
1127 if (detail->last_close < seconds_since_boot() - 30)
1128
1129
1130
1131
1132
1133 return false;
1134 return true;
1135}
1136
1137
1138
1139
1140
1141
1142
1143int sunrpc_cache_pipe_upcall(struct cache_detail *detail, struct cache_head *h,
1144 void (*cache_request)(struct cache_detail *,
1145 struct cache_head *,
1146 char **,
1147 int *))
1148{
1149
1150 char *buf;
1151 struct cache_request *crq;
1152 char *bp;
1153 int len;
1154
1155 if (!cache_listeners_exist(detail)) {
1156 warn_no_listener(detail);
1157 return -EINVAL;
1158 }
1159
1160 buf = kmalloc(PAGE_SIZE, GFP_KERNEL);
1161 if (!buf)
1162 return -EAGAIN;
1163
1164 crq = kmalloc(sizeof (*crq), GFP_KERNEL);
1165 if (!crq) {
1166 kfree(buf);
1167 return -EAGAIN;
1168 }
1169
1170 bp = buf; len = PAGE_SIZE;
1171
1172 cache_request(detail, h, &bp, &len);
1173
1174 if (len < 0) {
1175 kfree(buf);
1176 kfree(crq);
1177 return -EAGAIN;
1178 }
1179 crq->q.reader = 0;
1180 crq->item = cache_get(h);
1181 crq->buf = buf;
1182 crq->len = PAGE_SIZE - len;
1183 crq->readers = 0;
1184 spin_lock(&queue_lock);
1185 list_add_tail(&crq->q.list, &detail->queue);
1186 spin_unlock(&queue_lock);
1187 wake_up(&queue_wait);
1188 return 0;
1189}
1190EXPORT_SYMBOL_GPL(sunrpc_cache_pipe_upcall);
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204#define isodigit(c) (isdigit(c) && c <= '7')
1205int qword_get(char **bpp, char *dest, int bufsize)
1206{
1207
1208 char *bp = *bpp;
1209 int len = 0;
1210
1211 while (*bp == ' ') bp++;
1212
1213 if (bp[0] == '\\' && bp[1] == 'x') {
1214
1215 bp += 2;
1216 while (len < bufsize) {
1217 int h, l;
1218
1219 h = hex_to_bin(bp[0]);
1220 if (h < 0)
1221 break;
1222
1223 l = hex_to_bin(bp[1]);
1224 if (l < 0)
1225 break;
1226
1227 *dest++ = (h << 4) | l;
1228 bp += 2;
1229 len++;
1230 }
1231 } else {
1232
1233 while (*bp != ' ' && *bp != '\n' && *bp && len < bufsize-1) {
1234 if (*bp == '\\' &&
1235 isodigit(bp[1]) && (bp[1] <= '3') &&
1236 isodigit(bp[2]) &&
1237 isodigit(bp[3])) {
1238 int byte = (*++bp -'0');
1239 bp++;
1240 byte = (byte << 3) | (*bp++ - '0');
1241 byte = (byte << 3) | (*bp++ - '0');
1242 *dest++ = byte;
1243 len++;
1244 } else {
1245 *dest++ = *bp++;
1246 len++;
1247 }
1248 }
1249 }
1250
1251 if (*bp != ' ' && *bp != '\n' && *bp != '\0')
1252 return -1;
1253 while (*bp == ' ') bp++;
1254 *bpp = bp;
1255 *dest = '\0';
1256 return len;
1257}
1258EXPORT_SYMBOL_GPL(qword_get);
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268struct handle {
1269 struct cache_detail *cd;
1270};
1271
1272static void *c_start(struct seq_file *m, loff_t *pos)
1273 __acquires(cd->hash_lock)
1274{
1275 loff_t n = *pos;
1276 unsigned int hash, entry;
1277 struct cache_head *ch;
1278 struct cache_detail *cd = ((struct handle*)m->private)->cd;
1279
1280
1281 read_lock(&cd->hash_lock);
1282 if (!n--)
1283 return SEQ_START_TOKEN;
1284 hash = n >> 32;
1285 entry = n & ((1LL<<32) - 1);
1286
1287 for (ch=cd->hash_table[hash]; ch; ch=ch->next)
1288 if (!entry--)
1289 return ch;
1290 n &= ~((1LL<<32) - 1);
1291 do {
1292 hash++;
1293 n += 1LL<<32;
1294 } while(hash < cd->hash_size &&
1295 cd->hash_table[hash]==NULL);
1296 if (hash >= cd->hash_size)
1297 return NULL;
1298 *pos = n+1;
1299 return cd->hash_table[hash];
1300}
1301
1302static void *c_next(struct seq_file *m, void *p, loff_t *pos)
1303{
1304 struct cache_head *ch = p;
1305 int hash = (*pos >> 32);
1306 struct cache_detail *cd = ((struct handle*)m->private)->cd;
1307
1308 if (p == SEQ_START_TOKEN)
1309 hash = 0;
1310 else if (ch->next == NULL) {
1311 hash++;
1312 *pos += 1LL<<32;
1313 } else {
1314 ++*pos;
1315 return ch->next;
1316 }
1317 *pos &= ~((1LL<<32) - 1);
1318 while (hash < cd->hash_size &&
1319 cd->hash_table[hash] == NULL) {
1320 hash++;
1321 *pos += 1LL<<32;
1322 }
1323 if (hash >= cd->hash_size)
1324 return NULL;
1325 ++*pos;
1326 return cd->hash_table[hash];
1327}
1328
1329static void c_stop(struct seq_file *m, void *p)
1330 __releases(cd->hash_lock)
1331{
1332 struct cache_detail *cd = ((struct handle*)m->private)->cd;
1333 read_unlock(&cd->hash_lock);
1334}
1335
1336static int c_show(struct seq_file *m, void *p)
1337{
1338 struct cache_head *cp = p;
1339 struct cache_detail *cd = ((struct handle*)m->private)->cd;
1340
1341 if (p == SEQ_START_TOKEN)
1342 return cd->cache_show(m, cd, NULL);
1343
1344 ifdebug(CACHE)
1345 seq_printf(m, "# expiry=%ld refcnt=%d flags=%lx\n",
1346 convert_to_wallclock(cp->expiry_time),
1347 atomic_read(&cp->ref.refcount), cp->flags);
1348 cache_get(cp);
1349 if (cache_check(cd, cp, NULL))
1350
1351 seq_printf(m, "# ");
1352 else {
1353 if (cache_is_expired(cd, cp))
1354 seq_printf(m, "# ");
1355 cache_put(cp, cd);
1356 }
1357
1358 return cd->cache_show(m, cd, cp);
1359}
1360
1361static const struct seq_operations cache_content_op = {
1362 .start = c_start,
1363 .next = c_next,
1364 .stop = c_stop,
1365 .show = c_show,
1366};
1367
1368static int content_open(struct inode *inode, struct file *file,
1369 struct cache_detail *cd)
1370{
1371 struct handle *han;
1372
1373 if (!cd || !try_module_get(cd->owner))
1374 return -EACCES;
1375 han = __seq_open_private(file, &cache_content_op, sizeof(*han));
1376 if (han == NULL) {
1377 module_put(cd->owner);
1378 return -ENOMEM;
1379 }
1380
1381 han->cd = cd;
1382 return 0;
1383}
1384
1385static int content_release(struct inode *inode, struct file *file,
1386 struct cache_detail *cd)
1387{
1388 int ret = seq_release_private(inode, file);
1389 module_put(cd->owner);
1390 return ret;
1391}
1392
1393static int open_flush(struct inode *inode, struct file *file,
1394 struct cache_detail *cd)
1395{
1396 if (!cd || !try_module_get(cd->owner))
1397 return -EACCES;
1398 return nonseekable_open(inode, file);
1399}
1400
1401static int release_flush(struct inode *inode, struct file *file,
1402 struct cache_detail *cd)
1403{
1404 module_put(cd->owner);
1405 return 0;
1406}
1407
1408static ssize_t read_flush(struct file *file, char __user *buf,
1409 size_t count, loff_t *ppos,
1410 struct cache_detail *cd)
1411{
1412 char tbuf[22];
1413 unsigned long p = *ppos;
1414 size_t len;
1415
1416 snprintf(tbuf, sizeof(tbuf), "%lu\n", convert_to_wallclock(cd->flush_time));
1417 len = strlen(tbuf);
1418 if (p >= len)
1419 return 0;
1420 len -= p;
1421 if (len > count)
1422 len = count;
1423 if (copy_to_user(buf, (void*)(tbuf+p), len))
1424 return -EFAULT;
1425 *ppos += len;
1426 return len;
1427}
1428
1429static ssize_t write_flush(struct file *file, const char __user *buf,
1430 size_t count, loff_t *ppos,
1431 struct cache_detail *cd)
1432{
1433 char tbuf[20];
1434 char *bp, *ep;
1435
1436 if (*ppos || count > sizeof(tbuf)-1)
1437 return -EINVAL;
1438 if (copy_from_user(tbuf, buf, count))
1439 return -EFAULT;
1440 tbuf[count] = 0;
1441 simple_strtoul(tbuf, &ep, 0);
1442 if (*ep && *ep != '\n')
1443 return -EINVAL;
1444
1445 bp = tbuf;
1446 cd->flush_time = get_expiry(&bp);
1447 cd->nextcheck = seconds_since_boot();
1448 cache_flush();
1449
1450 *ppos += count;
1451 return count;
1452}
1453
1454static ssize_t cache_read_procfs(struct file *filp, char __user *buf,
1455 size_t count, loff_t *ppos)
1456{
1457 struct cache_detail *cd = PDE(filp->f_path.dentry->d_inode)->data;
1458
1459 return cache_read(filp, buf, count, ppos, cd);
1460}
1461
1462static ssize_t cache_write_procfs(struct file *filp, const char __user *buf,
1463 size_t count, loff_t *ppos)
1464{
1465 struct cache_detail *cd = PDE(filp->f_path.dentry->d_inode)->data;
1466
1467 return cache_write(filp, buf, count, ppos, cd);
1468}
1469
1470static unsigned int cache_poll_procfs(struct file *filp, poll_table *wait)
1471{
1472 struct cache_detail *cd = PDE(filp->f_path.dentry->d_inode)->data;
1473
1474 return cache_poll(filp, wait, cd);
1475}
1476
1477static long cache_ioctl_procfs(struct file *filp,
1478 unsigned int cmd, unsigned long arg)
1479{
1480 struct inode *inode = filp->f_path.dentry->d_inode;
1481 struct cache_detail *cd = PDE(inode)->data;
1482
1483 return cache_ioctl(inode, filp, cmd, arg, cd);
1484}
1485
1486static int cache_open_procfs(struct inode *inode, struct file *filp)
1487{
1488 struct cache_detail *cd = PDE(inode)->data;
1489
1490 return cache_open(inode, filp, cd);
1491}
1492
1493static int cache_release_procfs(struct inode *inode, struct file *filp)
1494{
1495 struct cache_detail *cd = PDE(inode)->data;
1496
1497 return cache_release(inode, filp, cd);
1498}
1499
1500static const struct file_operations cache_file_operations_procfs = {
1501 .owner = THIS_MODULE,
1502 .llseek = no_llseek,
1503 .read = cache_read_procfs,
1504 .write = cache_write_procfs,
1505 .poll = cache_poll_procfs,
1506 .unlocked_ioctl = cache_ioctl_procfs,
1507 .open = cache_open_procfs,
1508 .release = cache_release_procfs,
1509};
1510
1511static int content_open_procfs(struct inode *inode, struct file *filp)
1512{
1513 struct cache_detail *cd = PDE(inode)->data;
1514
1515 return content_open(inode, filp, cd);
1516}
1517
1518static int content_release_procfs(struct inode *inode, struct file *filp)
1519{
1520 struct cache_detail *cd = PDE(inode)->data;
1521
1522 return content_release(inode, filp, cd);
1523}
1524
1525static const struct file_operations content_file_operations_procfs = {
1526 .open = content_open_procfs,
1527 .read = seq_read,
1528 .llseek = seq_lseek,
1529 .release = content_release_procfs,
1530};
1531
1532static int open_flush_procfs(struct inode *inode, struct file *filp)
1533{
1534 struct cache_detail *cd = PDE(inode)->data;
1535
1536 return open_flush(inode, filp, cd);
1537}
1538
1539static int release_flush_procfs(struct inode *inode, struct file *filp)
1540{
1541 struct cache_detail *cd = PDE(inode)->data;
1542
1543 return release_flush(inode, filp, cd);
1544}
1545
1546static ssize_t read_flush_procfs(struct file *filp, char __user *buf,
1547 size_t count, loff_t *ppos)
1548{
1549 struct cache_detail *cd = PDE(filp->f_path.dentry->d_inode)->data;
1550
1551 return read_flush(filp, buf, count, ppos, cd);
1552}
1553
1554static ssize_t write_flush_procfs(struct file *filp,
1555 const char __user *buf,
1556 size_t count, loff_t *ppos)
1557{
1558 struct cache_detail *cd = PDE(filp->f_path.dentry->d_inode)->data;
1559
1560 return write_flush(filp, buf, count, ppos, cd);
1561}
1562
1563static const struct file_operations cache_flush_operations_procfs = {
1564 .open = open_flush_procfs,
1565 .read = read_flush_procfs,
1566 .write = write_flush_procfs,
1567 .release = release_flush_procfs,
1568 .llseek = no_llseek,
1569};
1570
1571static void remove_cache_proc_entries(struct cache_detail *cd, struct net *net)
1572{
1573 struct sunrpc_net *sn;
1574
1575 if (cd->u.procfs.proc_ent == NULL)
1576 return;
1577 if (cd->u.procfs.flush_ent)
1578 remove_proc_entry("flush", cd->u.procfs.proc_ent);
1579 if (cd->u.procfs.channel_ent)
1580 remove_proc_entry("channel", cd->u.procfs.proc_ent);
1581 if (cd->u.procfs.content_ent)
1582 remove_proc_entry("content", cd->u.procfs.proc_ent);
1583 cd->u.procfs.proc_ent = NULL;
1584 sn = net_generic(net, sunrpc_net_id);
1585 remove_proc_entry(cd->name, sn->proc_net_rpc);
1586}
1587
1588#ifdef CONFIG_PROC_FS
1589static int create_cache_proc_entries(struct cache_detail *cd, struct net *net)
1590{
1591 struct proc_dir_entry *p;
1592 struct sunrpc_net *sn;
1593
1594 sn = net_generic(net, sunrpc_net_id);
1595 cd->u.procfs.proc_ent = proc_mkdir(cd->name, sn->proc_net_rpc);
1596 if (cd->u.procfs.proc_ent == NULL)
1597 goto out_nomem;
1598 cd->u.procfs.channel_ent = NULL;
1599 cd->u.procfs.content_ent = NULL;
1600
1601 p = proc_create_data("flush", S_IFREG|S_IRUSR|S_IWUSR,
1602 cd->u.procfs.proc_ent,
1603 &cache_flush_operations_procfs, cd);
1604 cd->u.procfs.flush_ent = p;
1605 if (p == NULL)
1606 goto out_nomem;
1607
1608 if (cd->cache_upcall || cd->cache_parse) {
1609 p = proc_create_data("channel", S_IFREG|S_IRUSR|S_IWUSR,
1610 cd->u.procfs.proc_ent,
1611 &cache_file_operations_procfs, cd);
1612 cd->u.procfs.channel_ent = p;
1613 if (p == NULL)
1614 goto out_nomem;
1615 }
1616 if (cd->cache_show) {
1617 p = proc_create_data("content", S_IFREG|S_IRUSR|S_IWUSR,
1618 cd->u.procfs.proc_ent,
1619 &content_file_operations_procfs, cd);
1620 cd->u.procfs.content_ent = p;
1621 if (p == NULL)
1622 goto out_nomem;
1623 }
1624 return 0;
1625out_nomem:
1626 remove_cache_proc_entries(cd, net);
1627 return -ENOMEM;
1628}
1629#else
1630static int create_cache_proc_entries(struct cache_detail *cd, struct net *net)
1631{
1632 return 0;
1633}
1634#endif
1635
1636void __init cache_initialize(void)
1637{
1638 INIT_DELAYED_WORK_DEFERRABLE(&cache_cleaner, do_cache_clean);
1639}
1640
1641int cache_register_net(struct cache_detail *cd, struct net *net)
1642{
1643 int ret;
1644
1645 sunrpc_init_cache_detail(cd);
1646 ret = create_cache_proc_entries(cd, net);
1647 if (ret)
1648 sunrpc_destroy_cache_detail(cd);
1649 return ret;
1650}
1651EXPORT_SYMBOL_GPL(cache_register_net);
1652
1653void cache_unregister_net(struct cache_detail *cd, struct net *net)
1654{
1655 remove_cache_proc_entries(cd, net);
1656 sunrpc_destroy_cache_detail(cd);
1657}
1658EXPORT_SYMBOL_GPL(cache_unregister_net);
1659
1660struct cache_detail *cache_create_net(struct cache_detail *tmpl, struct net *net)
1661{
1662 struct cache_detail *cd;
1663
1664 cd = kmemdup(tmpl, sizeof(struct cache_detail), GFP_KERNEL);
1665 if (cd == NULL)
1666 return ERR_PTR(-ENOMEM);
1667
1668 cd->hash_table = kzalloc(cd->hash_size * sizeof(struct cache_head *),
1669 GFP_KERNEL);
1670 if (cd->hash_table == NULL) {
1671 kfree(cd);
1672 return ERR_PTR(-ENOMEM);
1673 }
1674 cd->net = net;
1675 return cd;
1676}
1677EXPORT_SYMBOL_GPL(cache_create_net);
1678
1679void cache_destroy_net(struct cache_detail *cd, struct net *net)
1680{
1681 kfree(cd->hash_table);
1682 kfree(cd);
1683}
1684EXPORT_SYMBOL_GPL(cache_destroy_net);
1685
1686static ssize_t cache_read_pipefs(struct file *filp, char __user *buf,
1687 size_t count, loff_t *ppos)
1688{
1689 struct cache_detail *cd = RPC_I(filp->f_path.dentry->d_inode)->private;
1690
1691 return cache_read(filp, buf, count, ppos, cd);
1692}
1693
1694static ssize_t cache_write_pipefs(struct file *filp, const char __user *buf,
1695 size_t count, loff_t *ppos)
1696{
1697 struct cache_detail *cd = RPC_I(filp->f_path.dentry->d_inode)->private;
1698
1699 return cache_write(filp, buf, count, ppos, cd);
1700}
1701
1702static unsigned int cache_poll_pipefs(struct file *filp, poll_table *wait)
1703{
1704 struct cache_detail *cd = RPC_I(filp->f_path.dentry->d_inode)->private;
1705
1706 return cache_poll(filp, wait, cd);
1707}
1708
1709static long cache_ioctl_pipefs(struct file *filp,
1710 unsigned int cmd, unsigned long arg)
1711{
1712 struct inode *inode = filp->f_dentry->d_inode;
1713 struct cache_detail *cd = RPC_I(inode)->private;
1714
1715 return cache_ioctl(inode, filp, cmd, arg, cd);
1716}
1717
1718static int cache_open_pipefs(struct inode *inode, struct file *filp)
1719{
1720 struct cache_detail *cd = RPC_I(inode)->private;
1721
1722 return cache_open(inode, filp, cd);
1723}
1724
1725static int cache_release_pipefs(struct inode *inode, struct file *filp)
1726{
1727 struct cache_detail *cd = RPC_I(inode)->private;
1728
1729 return cache_release(inode, filp, cd);
1730}
1731
1732const struct file_operations cache_file_operations_pipefs = {
1733 .owner = THIS_MODULE,
1734 .llseek = no_llseek,
1735 .read = cache_read_pipefs,
1736 .write = cache_write_pipefs,
1737 .poll = cache_poll_pipefs,
1738 .unlocked_ioctl = cache_ioctl_pipefs,
1739 .open = cache_open_pipefs,
1740 .release = cache_release_pipefs,
1741};
1742
1743static int content_open_pipefs(struct inode *inode, struct file *filp)
1744{
1745 struct cache_detail *cd = RPC_I(inode)->private;
1746
1747 return content_open(inode, filp, cd);
1748}
1749
1750static int content_release_pipefs(struct inode *inode, struct file *filp)
1751{
1752 struct cache_detail *cd = RPC_I(inode)->private;
1753
1754 return content_release(inode, filp, cd);
1755}
1756
1757const struct file_operations content_file_operations_pipefs = {
1758 .open = content_open_pipefs,
1759 .read = seq_read,
1760 .llseek = seq_lseek,
1761 .release = content_release_pipefs,
1762};
1763
1764static int open_flush_pipefs(struct inode *inode, struct file *filp)
1765{
1766 struct cache_detail *cd = RPC_I(inode)->private;
1767
1768 return open_flush(inode, filp, cd);
1769}
1770
1771static int release_flush_pipefs(struct inode *inode, struct file *filp)
1772{
1773 struct cache_detail *cd = RPC_I(inode)->private;
1774
1775 return release_flush(inode, filp, cd);
1776}
1777
1778static ssize_t read_flush_pipefs(struct file *filp, char __user *buf,
1779 size_t count, loff_t *ppos)
1780{
1781 struct cache_detail *cd = RPC_I(filp->f_path.dentry->d_inode)->private;
1782
1783 return read_flush(filp, buf, count, ppos, cd);
1784}
1785
1786static ssize_t write_flush_pipefs(struct file *filp,
1787 const char __user *buf,
1788 size_t count, loff_t *ppos)
1789{
1790 struct cache_detail *cd = RPC_I(filp->f_path.dentry->d_inode)->private;
1791
1792 return write_flush(filp, buf, count, ppos, cd);
1793}
1794
1795const struct file_operations cache_flush_operations_pipefs = {
1796 .open = open_flush_pipefs,
1797 .read = read_flush_pipefs,
1798 .write = write_flush_pipefs,
1799 .release = release_flush_pipefs,
1800 .llseek = no_llseek,
1801};
1802
1803int sunrpc_cache_register_pipefs(struct dentry *parent,
1804 const char *name, umode_t umode,
1805 struct cache_detail *cd)
1806{
1807 struct qstr q;
1808 struct dentry *dir;
1809 int ret = 0;
1810
1811 q.name = name;
1812 q.len = strlen(name);
1813 q.hash = full_name_hash(q.name, q.len);
1814 dir = rpc_create_cache_dir(parent, &q, umode, cd);
1815 if (!IS_ERR(dir))
1816 cd->u.pipefs.dir = dir;
1817 else
1818 ret = PTR_ERR(dir);
1819 return ret;
1820}
1821EXPORT_SYMBOL_GPL(sunrpc_cache_register_pipefs);
1822
1823void sunrpc_cache_unregister_pipefs(struct cache_detail *cd)
1824{
1825 rpc_remove_cache_dir(cd->u.pipefs.dir);
1826 cd->u.pipefs.dir = NULL;
1827}
1828EXPORT_SYMBOL_GPL(sunrpc_cache_unregister_pipefs);
1829
1830