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