fscache.h 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. /* SPDX-License-Identifier: LGPL-2.1 */
  2. /*
  3. * CIFS filesystem cache interface definitions
  4. *
  5. * Copyright (c) 2010 Novell, Inc.
  6. * Authors(s): Suresh Jayaraman ([email protected]>
  7. *
  8. */
  9. #ifndef _CIFS_FSCACHE_H
  10. #define _CIFS_FSCACHE_H
  11. #include <linux/swap.h>
  12. #include <linux/fscache.h>
  13. #include "cifsglob.h"
  14. /*
  15. * Coherency data attached to CIFS volume within the cache
  16. */
  17. struct cifs_fscache_volume_coherency_data {
  18. __le64 resource_id; /* unique server resource id */
  19. __le64 vol_create_time;
  20. __le32 vol_serial_number;
  21. } __packed;
  22. /*
  23. * Coherency data attached to CIFS inode within the cache.
  24. */
  25. struct cifs_fscache_inode_coherency_data {
  26. __le64 last_write_time_sec;
  27. __le64 last_change_time_sec;
  28. __le32 last_write_time_nsec;
  29. __le32 last_change_time_nsec;
  30. };
  31. #ifdef CONFIG_CIFS_FSCACHE
  32. /*
  33. * fscache.c
  34. */
  35. extern int cifs_fscache_get_super_cookie(struct cifs_tcon *);
  36. extern void cifs_fscache_release_super_cookie(struct cifs_tcon *);
  37. extern void cifs_fscache_get_inode_cookie(struct inode *inode);
  38. extern void cifs_fscache_release_inode_cookie(struct inode *);
  39. extern void cifs_fscache_unuse_inode_cookie(struct inode *inode, bool update);
  40. static inline
  41. void cifs_fscache_fill_coherency(struct inode *inode,
  42. struct cifs_fscache_inode_coherency_data *cd)
  43. {
  44. struct cifsInodeInfo *cifsi = CIFS_I(inode);
  45. memset(cd, 0, sizeof(*cd));
  46. cd->last_write_time_sec = cpu_to_le64(cifsi->netfs.inode.i_mtime.tv_sec);
  47. cd->last_write_time_nsec = cpu_to_le32(cifsi->netfs.inode.i_mtime.tv_nsec);
  48. cd->last_change_time_sec = cpu_to_le64(cifsi->netfs.inode.i_ctime.tv_sec);
  49. cd->last_change_time_nsec = cpu_to_le32(cifsi->netfs.inode.i_ctime.tv_nsec);
  50. }
  51. static inline struct fscache_cookie *cifs_inode_cookie(struct inode *inode)
  52. {
  53. return netfs_i_cookie(&CIFS_I(inode)->netfs);
  54. }
  55. static inline void cifs_invalidate_cache(struct inode *inode, unsigned int flags)
  56. {
  57. struct cifs_fscache_inode_coherency_data cd;
  58. cifs_fscache_fill_coherency(inode, &cd);
  59. fscache_invalidate(cifs_inode_cookie(inode), &cd,
  60. i_size_read(inode), flags);
  61. }
  62. extern int __cifs_fscache_query_occupancy(struct inode *inode,
  63. pgoff_t first, unsigned int nr_pages,
  64. pgoff_t *_data_first,
  65. unsigned int *_data_nr_pages);
  66. static inline int cifs_fscache_query_occupancy(struct inode *inode,
  67. pgoff_t first, unsigned int nr_pages,
  68. pgoff_t *_data_first,
  69. unsigned int *_data_nr_pages)
  70. {
  71. if (!cifs_inode_cookie(inode))
  72. return -ENOBUFS;
  73. return __cifs_fscache_query_occupancy(inode, first, nr_pages,
  74. _data_first, _data_nr_pages);
  75. }
  76. extern int __cifs_readpage_from_fscache(struct inode *pinode, struct page *ppage);
  77. extern void __cifs_readpage_to_fscache(struct inode *pinode, struct page *ppage);
  78. static inline int cifs_readpage_from_fscache(struct inode *inode,
  79. struct page *page)
  80. {
  81. if (cifs_inode_cookie(inode))
  82. return __cifs_readpage_from_fscache(inode, page);
  83. return -ENOBUFS;
  84. }
  85. static inline void cifs_readpage_to_fscache(struct inode *inode,
  86. struct page *page)
  87. {
  88. if (cifs_inode_cookie(inode))
  89. __cifs_readpage_to_fscache(inode, page);
  90. }
  91. #else /* CONFIG_CIFS_FSCACHE */
  92. static inline
  93. void cifs_fscache_fill_coherency(struct inode *inode,
  94. struct cifs_fscache_inode_coherency_data *cd)
  95. {
  96. }
  97. static inline int cifs_fscache_get_super_cookie(struct cifs_tcon *tcon) { return 0; }
  98. static inline void cifs_fscache_release_super_cookie(struct cifs_tcon *tcon) {}
  99. static inline void cifs_fscache_get_inode_cookie(struct inode *inode) {}
  100. static inline void cifs_fscache_release_inode_cookie(struct inode *inode) {}
  101. static inline void cifs_fscache_unuse_inode_cookie(struct inode *inode, bool update) {}
  102. static inline struct fscache_cookie *cifs_inode_cookie(struct inode *inode) { return NULL; }
  103. static inline void cifs_invalidate_cache(struct inode *inode, unsigned int flags) {}
  104. static inline int cifs_fscache_query_occupancy(struct inode *inode,
  105. pgoff_t first, unsigned int nr_pages,
  106. pgoff_t *_data_first,
  107. unsigned int *_data_nr_pages)
  108. {
  109. *_data_first = ULONG_MAX;
  110. *_data_nr_pages = 0;
  111. return -ENOBUFS;
  112. }
  113. static inline int
  114. cifs_readpage_from_fscache(struct inode *inode, struct page *page)
  115. {
  116. return -ENOBUFS;
  117. }
  118. static inline
  119. void cifs_readpage_to_fscache(struct inode *inode, struct page *page) {}
  120. #endif /* CONFIG_CIFS_FSCACHE */
  121. #endif /* _CIFS_FSCACHE_H */