/core/10.4/fusefs/fuse_knote.c

http://macfuse.googlecode.com/ · C · 132 lines · 92 code · 24 blank · 16 comment · 30 complexity · d8b6a003714d6fb39a0cdc4995af9552 MD5 · raw file

  1. /*
  2. * Copyright (C) 2007 Google. All Rights Reserved.
  3. * Amit Singh <singh@>
  4. */
  5. #include <fuse_param.h>
  6. #if M_MACFUSE_ENABLE_KQUEUE
  7. #include "fuse.h"
  8. #include "fuse_knote.h"
  9. #include "fuse_node.h"
  10. struct filterops fuseread_filtops =
  11. { 1, NULL, filt_fusedetach, filt_fuseread };
  12. struct filterops fusewrite_filtops =
  13. { 1, NULL, filt_fusedetach, filt_fusewrite };
  14. struct filterops fusevnode_filtops =
  15. { 1, NULL, filt_fusedetach, filt_fusevnode };
  16. /* Like HFS+ ... */
  17. void
  18. filt_fusedetach(struct knote *kn)
  19. {
  20. struct vnode *vp;
  21. vp = (struct vnode *)kn->kn_hook;
  22. if (vnode_getwithvid(vp, kn->kn_hookid)) {
  23. return;
  24. }
  25. if (1) { /* !KNDETACH_VNLOCKED */
  26. if (/* take exclusive lock */ 1) {
  27. (void)KNOTE_DETACH(&VTOFUD(vp)->c_knotes, kn);
  28. /* release lock */
  29. }
  30. }
  31. vnode_put(vp);
  32. }
  33. int
  34. filt_fuseread(struct knote *kn, long hint)
  35. {
  36. vnode_t vp = (vnode_t)kn->kn_hook;
  37. int dropvp = 0;
  38. int result = 0;
  39. if (hint == 0) {
  40. if ((vnode_getwithvid(vp, kn->kn_hookid) != 0)) {
  41. hint = NOTE_REVOKE;
  42. } else {
  43. dropvp = 1;
  44. }
  45. }
  46. if (hint == NOTE_REVOKE) {
  47. /*
  48. * filesystem is gone, so set the EOF flag and schedule
  49. * the knote for deletion.
  50. */
  51. kn->kn_flags |= (EV_EOF | EV_ONESHOT);
  52. return 1;
  53. }
  54. /* poll(2) semantics dictate always saying there is data */
  55. if (kn->kn_flags & EV_POLL) {
  56. kn->kn_data = 1;
  57. result = 1;
  58. } else {
  59. /* I'm not going to look inside kn_fp now... to hell with it. */
  60. kn->kn_data = 1;
  61. result = 1;
  62. }
  63. if (dropvp) {
  64. vnode_put(vp);
  65. }
  66. return (kn->kn_data != 0);
  67. }
  68. int
  69. filt_fusewrite(struct knote *kn, long hint)
  70. {
  71. if (hint == 0) {
  72. if ((vnode_getwithvid((vnode_t)kn->kn_hook, kn->kn_hookid) != 0)) {
  73. hint = NOTE_REVOKE;
  74. } else
  75. vnode_put((vnode_t)kn->kn_hook);
  76. }
  77. if (hint == NOTE_REVOKE) {
  78. /*
  79. * filesystem is gone, so set the EOF flag and schedule
  80. * the knote for deletion.
  81. */
  82. kn->kn_data = 0;
  83. kn->kn_flags |= (EV_EOF | EV_ONESHOT);
  84. return 1;
  85. }
  86. kn->kn_data = 0;
  87. return 1;
  88. }
  89. int
  90. filt_fusevnode(struct knote *kn, long hint)
  91. {
  92. if (hint == 0) {
  93. if ((vnode_getwithvid((vnode_t)kn->kn_hook, kn->kn_hookid) != 0)) {
  94. hint = NOTE_REVOKE;
  95. } else {
  96. vnode_put((vnode_t)kn->kn_hook);
  97. }
  98. }
  99. if (kn->kn_sfflags & hint) {
  100. kn->kn_fflags |= (int)hint;
  101. }
  102. if ((hint == NOTE_REVOKE)) {
  103. kn->kn_flags |= (EV_EOF | EV_ONESHOT);
  104. return 1;
  105. }
  106. return (kn->kn_fflags != 0);
  107. }
  108. #endif /* M_MACFUSE_ENABLE_KQUEUE */