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 (count == 0)
832 return -EINVAL;
833 if (copy_from_user(kaddr, buf, count))
834 return -EFAULT;
835 kaddr[count] = '\0';
836 ret = cd->cache_parse(cd, kaddr, count);
837 if (!ret)
838 ret = count;
839 return ret;
840}
841
842static ssize_t cache_slow_downcall(const char __user *buf,
843 size_t count, struct cache_detail *cd)
844{
845 static char write_buf[8192];
846 ssize_t ret = -EINVAL;
847
848 if (count >= sizeof(write_buf))
849 goto out;
850 mutex_lock(&queue_io_mutex);
851 ret = cache_do_downcall(write_buf, buf, count, cd);
852 mutex_unlock(&queue_io_mutex);
853out:
854 return ret;
855}
856
857static ssize_t cache_downcall(struct address_space *mapping,
858 const char __user *buf,
859 size_t count, struct cache_detail *cd)
860{
861 struct page *page;
862 char *kaddr;
863 ssize_t ret = -ENOMEM;
864
865 if (count >= PAGE_CACHE_SIZE)
866 goto out_slow;
867
868 page = find_or_create_page(mapping, 0, GFP_KERNEL);
869 if (!page)
870 goto out_slow;
871
872 kaddr = kmap(page);
873 ret = cache_do_downcall(kaddr, buf, count, cd);
874 kunmap(page);
875 unlock_page(page);
876 page_cache_release(page);
877 return ret;
878out_slow:
879 return cache_slow_downcall(buf, count, cd);
880}
881
882static ssize_t cache_write(struct file *filp, const char __user *buf,
883 size_t count, loff_t *ppos,
884 struct cache_detail *cd)
885{
886 struct address_space *mapping = filp->f_mapping;
887 struct inode *inode = filp->f_path.dentry->d_inode;
888 ssize_t ret = -EINVAL;
889
890 if (!cd->cache_parse)
891 goto out;
892
893 mutex_lock(&inode->i_mutex);
894 ret = cache_downcall(mapping, buf, count, cd);
895 mutex_unlock(&inode->i_mutex);
896out:
897 return ret;
898}
899
900static DECLARE_WAIT_QUEUE_HEAD(queue_wait);
901
902static unsigned int cache_poll(struct file *filp, poll_table *wait,
903 struct cache_detail *cd)
904{
905 unsigned int mask;
906 struct cache_reader *rp = filp->private_data;
907 struct cache_queue *cq;
908
909 poll_wait(filp, &queue_wait, wait);
910
911
912 mask = POLL_OUT | POLLWRNORM;
913
914 if (!rp)
915 return mask;
916
917 spin_lock(&queue_lock);
918
919 for (cq= &rp->q; &cq->list != &cd->queue;
920 cq = list_entry(cq->list.next, struct cache_queue, list))
921 if (!cq->reader) {
922 mask |= POLLIN | POLLRDNORM;
923 break;
924 }
925 spin_unlock(&queue_lock);
926 return mask;
927}
928
929static int cache_ioctl(struct inode *ino, struct file *filp,
930 unsigned int cmd, unsigned long arg,
931 struct cache_detail *cd)
932{
933 int len = 0;
934 struct cache_reader *rp = filp->private_data;
935 struct cache_queue *cq;
936
937 if (cmd != FIONREAD || !rp)
938 return -EINVAL;
939
940 spin_lock(&queue_lock);
941
942
943
944
945 for (cq= &rp->q; &cq->list != &cd->queue;
946 cq = list_entry(cq->list.next, struct cache_queue, list))
947 if (!cq->reader) {
948 struct cache_request *cr =
949 container_of(cq, struct cache_request, q);
950 len = cr->len - rp->offset;
951 break;
952 }
953 spin_unlock(&queue_lock);
954
955 return put_user(len, (int __user *)arg);
956}
957
958static int cache_open(struct inode *inode, struct file *filp,
959 struct cache_detail *cd)
960{
961 struct cache_reader *rp = NULL;
962
963 if (!cd || !try_module_get(cd->owner))
964 return -EACCES;
965 nonseekable_open(inode, filp);
966 if (filp->f_mode & FMODE_READ) {
967 rp = kmalloc(sizeof(*rp), GFP_KERNEL);
968 if (!rp)
969 return -ENOMEM;
970 rp->offset = 0;
971 rp->q.reader = 1;
972 atomic_inc(&cd->readers);
973 spin_lock(&queue_lock);
974 list_add(&rp->q.list, &cd->queue);
975 spin_unlock(&queue_lock);
976 }
977 filp->private_data = rp;
978 return 0;
979}
980
981static int cache_release(struct inode *inode, struct file *filp,
982 struct cache_detail *cd)
983{
984 struct cache_reader *rp = filp->private_data;
985
986 if (rp) {
987 spin_lock(&queue_lock);
988 if (rp->offset) {
989 struct cache_queue *cq;
990 for (cq= &rp->q; &cq->list != &cd->queue;
991 cq = list_entry(cq->list.next, struct cache_queue, list))
992 if (!cq->reader) {
993 container_of(cq, struct cache_request, q)
994 ->readers--;
995 break;
996 }
997 rp->offset = 0;
998 }
999 list_del(&rp->q.list);
1000 spin_unlock(&queue_lock);
1001
1002 filp->private_data = NULL;
1003 kfree(rp);
1004
1005 cd->last_close = seconds_since_boot();
1006 atomic_dec(&cd->readers);
1007 }
1008 module_put(cd->owner);
1009 return 0;
1010}
1011
1012
1013
1014static void cache_dequeue(struct cache_detail *detail, struct cache_head *ch)
1015{
1016 struct cache_queue *cq;
1017 spin_lock(&queue_lock);
1018 list_for_each_entry(cq, &detail->queue, list)
1019 if (!cq->reader) {
1020 struct cache_request *cr = container_of(cq, struct cache_request, q);
1021 if (cr->item != ch)
1022 continue;
1023 if (cr->readers != 0)
1024 continue;
1025 list_del(&cr->q.list);
1026 spin_unlock(&queue_lock);
1027 cache_put(cr->item, detail);
1028 kfree(cr->buf);
1029 kfree(cr);
1030 return;
1031 }
1032 spin_unlock(&queue_lock);
1033}
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044void qword_add(char **bpp, int *lp, char *str)
1045{
1046 char *bp = *bpp;
1047 int len = *lp;
1048 char c;
1049
1050 if (len < 0) return;
1051
1052 while ((c=*str++) && len)
1053 switch(c) {
1054 case ' ':
1055 case '\t':
1056 case '\n':
1057 case '\\':
1058 if (len >= 4) {
1059 *bp++ = '\\';
1060 *bp++ = '0' + ((c & 0300)>>6);
1061 *bp++ = '0' + ((c & 0070)>>3);
1062 *bp++ = '0' + ((c & 0007)>>0);
1063 }
1064 len -= 4;
1065 break;
1066 default:
1067 *bp++ = c;
1068 len--;
1069 }
1070 if (c || len <1) len = -1;
1071 else {
1072 *bp++ = ' ';
1073 len--;
1074 }
1075 *bpp = bp;
1076 *lp = len;
1077}
1078EXPORT_SYMBOL_GPL(qword_add);
1079
1080void qword_addhex(char **bpp, int *lp, char *buf, int blen)
1081{
1082 char *bp = *bpp;
1083 int len = *lp;
1084
1085 if (len < 0) return;
1086
1087 if (len > 2) {
1088 *bp++ = '\\';
1089 *bp++ = 'x';
1090 len -= 2;
1091 while (blen && len >= 2) {
1092 unsigned char c = *buf++;
1093 *bp++ = '0' + ((c&0xf0)>>4) + (c>=0xa0)*('a'-'9'-1);
1094 *bp++ = '0' + (c&0x0f) + ((c&0x0f)>=0x0a)*('a'-'9'-1);
1095 len -= 2;
1096 blen--;
1097 }
1098 }
1099 if (blen || len<1) len = -1;
1100 else {
1101 *bp++ = ' ';
1102 len--;
1103 }
1104 *bpp = bp;
1105 *lp = len;
1106}
1107EXPORT_SYMBOL_GPL(qword_addhex);
1108
1109static void warn_no_listener(struct cache_detail *detail)
1110{
1111 if (detail->last_warn != detail->last_close) {
1112 detail->last_warn = detail->last_close;
1113 if (detail->warn_no_listener)
1114 detail->warn_no_listener(detail, detail->last_close != 0);
1115 }
1116}
1117
1118static bool cache_listeners_exist(struct cache_detail *detail)
1119{
1120 if (atomic_read(&detail->readers))
1121 return true;
1122 if (detail->last_close == 0)
1123
1124 return false;
1125 if (detail->last_close < seconds_since_boot() - 30)
1126
1127
1128
1129
1130
1131 return false;
1132 return true;
1133}
1134
1135
1136
1137
1138
1139
1140
1141int sunrpc_cache_pipe_upcall(struct cache_detail *detail, struct cache_head *h,
1142 void (*cache_request)(struct cache_detail *,
1143 struct cache_head *,
1144 char **,
1145 int *))
1146{
1147
1148 char *buf;
1149 struct cache_request *crq;
1150 char *bp;
1151 int len;
1152
1153 if (!cache_listeners_exist(detail)) {
1154 warn_no_listener(detail);
1155 return -EINVAL;
1156 }
1157
1158 buf = kmalloc(PAGE_SIZE, GFP_KERNEL);
1159 if (!buf)
1160 return -EAGAIN;
1161
1162 crq = kmalloc(sizeof (*crq), GFP_KERNEL);
1163 if (!crq) {
1164 kfree(buf);
1165 return -EAGAIN;
1166 }
1167
1168 bp = buf; len = PAGE_SIZE;
1169
1170 cache_request(detail, h, &bp, &len);
1171
1172 if (len < 0) {
1173 kfree(buf);
1174 kfree(crq);
1175 return -EAGAIN;
1176 }
1177 crq->q.reader = 0;
1178 crq->item = cache_get(h);
1179 crq->buf = buf;
1180 crq->len = PAGE_SIZE - len;
1181 crq->readers = 0;
1182 spin_lock(&queue_lock);
1183 list_add_tail(&crq->q.list, &detail->queue);
1184 spin_unlock(&queue_lock);
1185 wake_up(&queue_wait);
1186 return 0;
1187}
1188EXPORT_SYMBOL_GPL(sunrpc_cache_pipe_upcall);
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202#define isodigit(c) (isdigit(c) && c <= '7')
1203int qword_get(char **bpp, char *dest, int bufsize)
1204{
1205
1206 char *bp = *bpp;
1207 int len = 0;
1208
1209 while (*bp == ' ') bp++;
1210
1211 if (bp[0] == '\\' && bp[1] == 'x') {
1212
1213 bp += 2;
1214 while (len < bufsize) {
1215 int h, l;
1216
1217 h = hex_to_bin(bp[0]);
1218 if (h < 0)
1219 break;
1220
1221 l = hex_to_bin(bp[1]);
1222 if (l < 0)
1223 break;
1224
1225 *dest++ = (h << 4) | l;
1226 bp += 2;
1227 len++;
1228 }
1229 } else {
1230
1231 while (*bp != ' ' && *bp != '\n' && *bp && len < bufsize-1) {
1232 if (*bp == '\\' &&
1233 isodigit(bp[1]) && (bp[1] <= '3') &&
1234 isodigit(bp[2]) &&
1235 isodigit(bp[3])) {
1236 int byte = (*++bp -'0');
1237 bp++;
1238 byte = (byte << 3) | (*bp++ - '0');
1239 byte = (byte << 3) | (*bp++ - '0');
1240 *dest++ = byte;
1241 len++;
1242 } else {
1243 *dest++ = *bp++;
1244 len++;
1245 }
1246 }
1247 }
1248
1249 if (*bp != ' ' && *bp != '\n' && *bp != '\0')
1250 return -1;
1251 while (*bp == ' ') bp++;
1252 *bpp = bp;
1253 *dest = '\0';
1254 return len;
1255}
1256EXPORT_SYMBOL_GPL(qword_get);
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266struct handle {
1267 struct cache_detail *cd;
1268};
1269
1270static void *c_start(struct seq_file *m, loff_t *pos)
1271 __acquires(cd->hash_lock)
1272{
1273 loff_t n = *pos;
1274 unsigned hash, entry;
1275 struct cache_head *ch;
1276 struct cache_detail *cd = ((struct handle*)m->private)->cd;
1277
1278
1279 read_lock(&cd->hash_lock);
1280 if (!n--)
1281 return SEQ_START_TOKEN;
1282 hash = n >> 32;
1283 entry = n & ((1LL<<32) - 1);
1284
1285 for (ch=cd->hash_table[hash]; ch; ch=ch->next)
1286 if (!entry--)
1287 return ch;
1288 n &= ~((1LL<<32) - 1);
1289 do {
1290 hash++;
1291 n += 1LL<<32;
1292 } while(hash < cd->hash_size &&
1293 cd->hash_table[hash]==NULL);
1294 if (hash >= cd->hash_size)
1295 return NULL;
1296 *pos = n+1;
1297 return cd->hash_table[hash];
1298}
1299
1300static void *c_next(struct seq_file *m, void *p, loff_t *pos)
1301{
1302 struct cache_head *ch = p;
1303 int hash = (*pos >> 32);
1304 struct cache_detail *cd = ((struct handle*)m->private)->cd;
1305
1306 if (p == SEQ_START_TOKEN)
1307 hash = 0;
1308 else if (ch->next == NULL) {
1309 hash++;
1310 *pos += 1LL<<32;
1311 } else {
1312 ++*pos;
1313 return ch->next;
1314 }
1315 *pos &= ~((1LL<<32) - 1);
1316 while (hash < cd->hash_size &&
1317 cd->hash_table[hash] == NULL) {
1318 hash++;
1319 *pos += 1LL<<32;
1320 }
1321 if (hash >= cd->hash_size)
1322 return NULL;
1323 ++*pos;
1324 return cd->hash_table[hash];
1325}
1326
1327static void c_stop(struct seq_file *m, void *p)
1328 __releases(cd->hash_lock)
1329{
1330 struct cache_detail *cd = ((struct handle*)m->private)->cd;
1331 read_unlock(&cd->hash_lock);
1332}
1333
1334static int c_show(struct seq_file *m, void *p)
1335{
1336 struct cache_head *cp = p;
1337 struct cache_detail *cd = ((struct handle*)m->private)->cd;
1338
1339 if (p == SEQ_START_TOKEN)
1340 return cd->cache_show(m, cd, NULL);
1341
1342 ifdebug(CACHE)
1343 seq_printf(m, "# expiry=%ld refcnt=%d flags=%lx\n",
1344 convert_to_wallclock(cp->expiry_time),
1345 atomic_read(&cp->ref.refcount), cp->flags);
1346 cache_get(cp);
1347 if (cache_check(cd, cp, NULL))
1348
1349 seq_printf(m, "# ");
1350 else
1351 cache_put(cp, cd);
1352
1353 return cd->cache_show(m, cd, cp);
1354}
1355
1356static const struct seq_operations cache_content_op = {
1357 .start = c_start,
1358 .next = c_next,
1359 .stop = c_stop,
1360 .show = c_show,
1361};
1362
1363static int content_open(struct inode *inode, struct file *file,
1364 struct cache_detail *cd)
1365{
1366 struct handle *han;
1367
1368 if (!cd || !try_module_get(cd->owner))
1369 return -EACCES;
1370 han = __seq_open_private(file, &cache_content_op, sizeof(*han));
1371 if (han == NULL) {
1372 module_put(cd->owner);
1373 return -ENOMEM;
1374 }
1375
1376 han->cd = cd;
1377 return 0;
1378}
1379
1380static int content_release(struct inode *inode, struct file *file,
1381 struct cache_detail *cd)
1382{
1383 int ret = seq_release_private(inode, file);
1384 module_put(cd->owner);
1385 return ret;
1386}
1387
1388static int open_flush(struct inode *inode, struct file *file,
1389 struct cache_detail *cd)
1390{
1391 if (!cd || !try_module_get(cd->owner))
1392 return -EACCES;
1393 return nonseekable_open(inode, file);
1394}
1395
1396static int release_flush(struct inode *inode, struct file *file,
1397 struct cache_detail *cd)
1398{
1399 module_put(cd->owner);
1400 return 0;
1401}
1402
1403static ssize_t read_flush(struct file *file, char __user *buf,
1404 size_t count, loff_t *ppos,
1405 struct cache_detail *cd)
1406{
1407 char tbuf[20];
1408 unsigned long p = *ppos;
1409 size_t len;
1410
1411 sprintf(tbuf, "%lu\n", convert_to_wallclock(cd->flush_time));
1412 len = strlen(tbuf);
1413 if (p >= len)
1414 return 0;
1415 len -= p;
1416 if (len > count)
1417 len = count;
1418 if (copy_to_user(buf, (void*)(tbuf+p), len))
1419 return -EFAULT;
1420 *ppos += len;
1421 return len;
1422}
1423
1424static ssize_t write_flush(struct file *file, const char __user *buf,
1425 size_t count, loff_t *ppos,
1426 struct cache_detail *cd)
1427{
1428 char tbuf[20];
1429 char *bp, *ep;
1430
1431 if (*ppos || count > sizeof(tbuf)-1)
1432 return -EINVAL;
1433 if (copy_from_user(tbuf, buf, count))
1434 return -EFAULT;
1435 tbuf[count] = 0;
1436 simple_strtoul(tbuf, &ep, 0);
1437 if (*ep && *ep != '\n')
1438 return -EINVAL;
1439
1440 bp = tbuf;
1441 cd->flush_time = get_expiry(&bp);
1442 cd->nextcheck = seconds_since_boot();
1443 cache_flush();
1444
1445 *ppos += count;
1446 return count;
1447}
1448
1449static ssize_t cache_read_procfs(struct file *filp, char __user *buf,
1450 size_t count, loff_t *ppos)
1451{
1452 struct cache_detail *cd = PDE(filp->f_path.dentry->d_inode)->data;
1453
1454 return cache_read(filp, buf, count, ppos, cd);
1455}
1456
1457static ssize_t cache_write_procfs(struct file *filp, const char __user *buf,
1458 size_t count, loff_t *ppos)
1459{
1460 struct cache_detail *cd = PDE(filp->f_path.dentry->d_inode)->data;
1461
1462 return cache_write(filp, buf, count, ppos, cd);
1463}
1464
1465static unsigned int cache_poll_procfs(struct file *filp, poll_table *wait)
1466{
1467 struct cache_detail *cd = PDE(filp->f_path.dentry->d_inode)->data;
1468
1469 return cache_poll(filp, wait, cd);
1470}
1471
1472static long cache_ioctl_procfs(struct file *filp,
1473 unsigned int cmd, unsigned long arg)
1474{
1475 struct inode *inode = filp->f_path.dentry->d_inode;
1476 struct cache_detail *cd = PDE(inode)->data;
1477
1478 return cache_ioctl(inode, filp, cmd, arg, cd);
1479}
1480
1481static int cache_open_procfs(struct inode *inode, struct file *filp)
1482{
1483 struct cache_detail *cd = PDE(inode)->data;
1484
1485 return cache_open(inode, filp, cd);
1486}
1487
1488static int cache_release_procfs(struct inode *inode, struct file *filp)
1489{
1490 struct cache_detail *cd = PDE(inode)->data;
1491
1492 return cache_release(inode, filp, cd);
1493}
1494
1495static const struct file_operations cache_file_operations_procfs = {
1496 .owner = THIS_MODULE,
1497 .llseek = no_llseek,
1498 .read = cache_read_procfs,
1499 .write = cache_write_procfs,
1500 .poll = cache_poll_procfs,
1501 .unlocked_ioctl = cache_ioctl_procfs,
1502 .open = cache_open_procfs,
1503 .release = cache_release_procfs,
1504};
1505
1506static int content_open_procfs(struct inode *inode, struct file *filp)
1507{
1508 struct cache_detail *cd = PDE(inode)->data;
1509
1510 return content_open(inode, filp, cd);
1511}
1512
1513static int content_release_procfs(struct inode *inode, struct file *filp)
1514{
1515 struct cache_detail *cd = PDE(inode)->data;
1516
1517 return content_release(inode, filp, cd);
1518}
1519
1520static const struct file_operations content_file_operations_procfs = {
1521 .open = content_open_procfs,
1522 .read = seq_read,
1523 .llseek = seq_lseek,
1524 .release = content_release_procfs,
1525};
1526
1527static int open_flush_procfs(struct inode *inode, struct file *filp)
1528{
1529 struct cache_detail *cd = PDE(inode)->data;
1530
1531 return open_flush(inode, filp, cd);
1532}
1533
1534static int release_flush_procfs(struct inode *inode, struct file *filp)
1535{
1536 struct cache_detail *cd = PDE(inode)->data;
1537
1538 return release_flush(inode, filp, cd);
1539}
1540
1541static ssize_t read_flush_procfs(struct file *filp, char __user *buf,
1542 size_t count, loff_t *ppos)
1543{
1544 struct cache_detail *cd = PDE(filp->f_path.dentry->d_inode)->data;
1545
1546 return read_flush(filp, buf, count, ppos, cd);
1547}
1548
1549static ssize_t write_flush_procfs(struct file *filp,
1550 const char __user *buf,
1551 size_t count, loff_t *ppos)
1552{
1553 struct cache_detail *cd = PDE(filp->f_path.dentry->d_inode)->data;
1554
1555 return write_flush(filp, buf, count, ppos, cd);
1556}
1557
1558static const struct file_operations cache_flush_operations_procfs = {
1559 .open = open_flush_procfs,
1560 .read = read_flush_procfs,
1561 .write = write_flush_procfs,
1562 .release = release_flush_procfs,
1563 .llseek = no_llseek,
1564};
1565
1566static void remove_cache_proc_entries(struct cache_detail *cd, struct net *net)
1567{
1568 struct sunrpc_net *sn;
1569
1570 if (cd->u.procfs.proc_ent == NULL)
1571 return;
1572 if (cd->u.procfs.flush_ent)
1573 remove_proc_entry("flush", cd->u.procfs.proc_ent);
1574 if (cd->u.procfs.channel_ent)
1575 remove_proc_entry("channel", cd->u.procfs.proc_ent);
1576 if (cd->u.procfs.content_ent)
1577 remove_proc_entry("content", cd->u.procfs.proc_ent);
1578 cd->u.procfs.proc_ent = NULL;
1579 sn = net_generic(net, sunrpc_net_id);
1580 remove_proc_entry(cd->name, sn->proc_net_rpc);
1581}
1582
1583#ifdef CONFIG_PROC_FS
1584static int create_cache_proc_entries(struct cache_detail *cd, struct net *net)
1585{
1586 struct proc_dir_entry *p;
1587 struct sunrpc_net *sn;
1588
1589 sn = net_generic(net, sunrpc_net_id);
1590 cd->u.procfs.proc_ent = proc_mkdir(cd->name, sn->proc_net_rpc);
1591 if (cd->u.procfs.proc_ent == NULL)
1592 goto out_nomem;
1593 cd->u.procfs.channel_ent = NULL;
1594 cd->u.procfs.content_ent = NULL;
1595
1596 p = proc_create_data("flush", S_IFREG|S_IRUSR|S_IWUSR,
1597 cd->u.procfs.proc_ent,
1598 &cache_flush_operations_procfs, cd);
1599 cd->u.procfs.flush_ent = p;
1600 if (p == NULL)
1601 goto out_nomem;
1602
1603 if (cd->cache_upcall || cd->cache_parse) {
1604 p = proc_create_data("channel", S_IFREG|S_IRUSR|S_IWUSR,
1605 cd->u.procfs.proc_ent,
1606 &cache_file_operations_procfs, cd);
1607 cd->u.procfs.channel_ent = p;
1608 if (p == NULL)
1609 goto out_nomem;
1610 }
1611 if (cd->cache_show) {
1612 p = proc_create_data("content", S_IFREG|S_IRUSR|S_IWUSR,
1613 cd->u.procfs.proc_ent,
1614 &content_file_operations_procfs, cd);
1615 cd->u.procfs.content_ent = p;
1616 if (p == NULL)
1617 goto out_nomem;
1618 }
1619 return 0;
1620out_nomem:
1621 remove_cache_proc_entries(cd, net);
1622 return -ENOMEM;
1623}
1624#else
1625static int create_cache_proc_entries(struct cache_detail *cd, struct net *net)
1626{
1627 return 0;
1628}
1629#endif
1630
1631void __init cache_initialize(void)
1632{
1633 INIT_DELAYED_WORK_DEFERRABLE(&cache_cleaner, do_cache_clean);
1634}
1635
1636int cache_register_net(struct cache_detail *cd, struct net *net)
1637{
1638 int ret;
1639
1640 sunrpc_init_cache_detail(cd);
1641 ret = create_cache_proc_entries(cd, net);
1642 if (ret)
1643 sunrpc_destroy_cache_detail(cd);
1644 return ret;
1645}
1646EXPORT_SYMBOL_GPL(cache_register_net);
1647
1648int cache_register(struct cache_detail *cd)
1649{
1650 return cache_register_net(cd, &init_net);
1651}
1652EXPORT_SYMBOL_GPL(cache_register);
1653
1654void cache_unregister_net(struct cache_detail *cd, struct net *net)
1655{
1656 remove_cache_proc_entries(cd, net);
1657 sunrpc_destroy_cache_detail(cd);
1658}
1659EXPORT_SYMBOL_GPL(cache_unregister_net);
1660
1661void cache_unregister(struct cache_detail *cd)
1662{
1663 cache_unregister_net(cd, &init_net);
1664}
1665EXPORT_SYMBOL_GPL(cache_unregister);
1666
1667static ssize_t cache_read_pipefs(struct file *filp, char __user *buf,
1668 size_t count, loff_t *ppos)
1669{
1670 struct cache_detail *cd = RPC_I(filp->f_path.dentry->d_inode)->private;
1671
1672 return cache_read(filp, buf, count, ppos, cd);
1673}
1674
1675static ssize_t cache_write_pipefs(struct file *filp, const char __user *buf,
1676 size_t count, loff_t *ppos)
1677{
1678 struct cache_detail *cd = RPC_I(filp->f_path.dentry->d_inode)->private;
1679
1680 return cache_write(filp, buf, count, ppos, cd);
1681}
1682
1683static unsigned int cache_poll_pipefs(struct file *filp, poll_table *wait)
1684{
1685 struct cache_detail *cd = RPC_I(filp->f_path.dentry->d_inode)->private;
1686
1687 return cache_poll(filp, wait, cd);
1688}
1689
1690static long cache_ioctl_pipefs(struct file *filp,
1691 unsigned int cmd, unsigned long arg)
1692{
1693 struct inode *inode = filp->f_dentry->d_inode;
1694 struct cache_detail *cd = RPC_I(inode)->private;
1695
1696 return cache_ioctl(inode, filp, cmd, arg, cd);
1697}
1698
1699static int cache_open_pipefs(struct inode *inode, struct file *filp)
1700{
1701 struct cache_detail *cd = RPC_I(inode)->private;
1702
1703 return cache_open(inode, filp, cd);
1704}
1705
1706static int cache_release_pipefs(struct inode *inode, struct file *filp)
1707{
1708 struct cache_detail *cd = RPC_I(inode)->private;
1709
1710 return cache_release(inode, filp, cd);
1711}
1712
1713const struct file_operations cache_file_operations_pipefs = {
1714 .owner = THIS_MODULE,
1715 .llseek = no_llseek,
1716 .read = cache_read_pipefs,
1717 .write = cache_write_pipefs,
1718 .poll = cache_poll_pipefs,
1719 .unlocked_ioctl = cache_ioctl_pipefs,
1720 .open = cache_open_pipefs,
1721 .release = cache_release_pipefs,
1722};
1723
1724static int content_open_pipefs(struct inode *inode, struct file *filp)
1725{
1726 struct cache_detail *cd = RPC_I(inode)->private;
1727
1728 return content_open(inode, filp, cd);
1729}
1730
1731static int content_release_pipefs(struct inode *inode, struct file *filp)
1732{
1733 struct cache_detail *cd = RPC_I(inode)->private;
1734
1735 return content_release(inode, filp, cd);
1736}
1737
1738const struct file_operations content_file_operations_pipefs = {
1739 .open = content_open_pipefs,
1740 .read = seq_read,
1741 .llseek = seq_lseek,
1742 .release = content_release_pipefs,
1743};
1744
1745static int open_flush_pipefs(struct inode *inode, struct file *filp)
1746{
1747 struct cache_detail *cd = RPC_I(inode)->private;
1748
1749 return open_flush(inode, filp, cd);
1750}
1751
1752static int release_flush_pipefs(struct inode *inode, struct file *filp)
1753{
1754 struct cache_detail *cd = RPC_I(inode)->private;
1755
1756 return release_flush(inode, filp, cd);
1757}
1758
1759static ssize_t read_flush_pipefs(struct file *filp, char __user *buf,
1760 size_t count, loff_t *ppos)
1761{
1762 struct cache_detail *cd = RPC_I(filp->f_path.dentry->d_inode)->private;
1763
1764 return read_flush(filp, buf, count, ppos, cd);
1765}
1766
1767static ssize_t write_flush_pipefs(struct file *filp,
1768 const char __user *buf,
1769 size_t count, loff_t *ppos)
1770{
1771 struct cache_detail *cd = RPC_I(filp->f_path.dentry->d_inode)->private;
1772
1773 return write_flush(filp, buf, count, ppos, cd);
1774}
1775
1776const struct file_operations cache_flush_operations_pipefs = {
1777 .open = open_flush_pipefs,
1778 .read = read_flush_pipefs,
1779 .write = write_flush_pipefs,
1780 .release = release_flush_pipefs,
1781 .llseek = no_llseek,
1782};
1783
1784int sunrpc_cache_register_pipefs(struct dentry *parent,
1785 const char *name, umode_t umode,
1786 struct cache_detail *cd)
1787{
1788 struct qstr q;
1789 struct dentry *dir;
1790 int ret = 0;
1791
1792 sunrpc_init_cache_detail(cd);
1793 q.name = name;
1794 q.len = strlen(name);
1795 q.hash = full_name_hash(q.name, q.len);
1796 dir = rpc_create_cache_dir(parent, &q, umode, cd);
1797 if (!IS_ERR(dir))
1798 cd->u.pipefs.dir = dir;
1799 else {
1800 sunrpc_destroy_cache_detail(cd);
1801 ret = PTR_ERR(dir);
1802 }
1803 return ret;
1804}
1805EXPORT_SYMBOL_GPL(sunrpc_cache_register_pipefs);
1806
1807void sunrpc_cache_unregister_pipefs(struct cache_detail *cd)
1808{
1809 rpc_remove_cache_dir(cd->u.pipefs.dir);
1810 cd->u.pipefs.dir = NULL;
1811 sunrpc_destroy_cache_detail(cd);
1812}
1813EXPORT_SYMBOL_GPL(sunrpc_cache_unregister_pipefs);
1814
1815