inode.h 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. /*
  2. * Copyright (C) Sistina Software, Inc. 1997-2003 All rights reserved.
  3. * Copyright (C) 2004-2006 Red Hat, Inc. All rights reserved.
  4. *
  5. * This copyrighted material is made available to anyone wishing to use,
  6. * modify, copy, or redistribute it subject to the terms and conditions
  7. * of the GNU General Public License version 2.
  8. */
  9. #ifndef __INODE_DOT_H__
  10. #define __INODE_DOT_H__
  11. #include <linux/fs.h>
  12. #include <linux/buffer_head.h>
  13. #include <linux/mm.h>
  14. #include "util.h"
  15. extern int gfs2_releasepage(struct page *page, gfp_t gfp_mask);
  16. extern int gfs2_internal_read(struct gfs2_inode *ip,
  17. char *buf, loff_t *pos, unsigned size);
  18. extern void gfs2_set_aops(struct inode *inode);
  19. static inline int gfs2_is_stuffed(const struct gfs2_inode *ip)
  20. {
  21. return !ip->i_height;
  22. }
  23. static inline int gfs2_is_jdata(const struct gfs2_inode *ip)
  24. {
  25. return ip->i_diskflags & GFS2_DIF_JDATA;
  26. }
  27. static inline int gfs2_is_writeback(const struct gfs2_inode *ip)
  28. {
  29. const struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode);
  30. return (sdp->sd_args.ar_data == GFS2_DATA_WRITEBACK) && !gfs2_is_jdata(ip);
  31. }
  32. static inline int gfs2_is_ordered(const struct gfs2_inode *ip)
  33. {
  34. const struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode);
  35. return (sdp->sd_args.ar_data == GFS2_DATA_ORDERED) && !gfs2_is_jdata(ip);
  36. }
  37. static inline int gfs2_is_dir(const struct gfs2_inode *ip)
  38. {
  39. return S_ISDIR(ip->i_inode.i_mode);
  40. }
  41. static inline void gfs2_set_inode_blocks(struct inode *inode, u64 blocks)
  42. {
  43. inode->i_blocks = blocks <<
  44. (GFS2_SB(inode)->sd_sb.sb_bsize_shift - GFS2_BASIC_BLOCK_SHIFT);
  45. }
  46. static inline u64 gfs2_get_inode_blocks(const struct inode *inode)
  47. {
  48. return inode->i_blocks >>
  49. (GFS2_SB(inode)->sd_sb.sb_bsize_shift - GFS2_BASIC_BLOCK_SHIFT);
  50. }
  51. static inline void gfs2_add_inode_blocks(struct inode *inode, s64 change)
  52. {
  53. gfs2_assert(GFS2_SB(inode), (change >= 0 || inode->i_blocks > -change));
  54. change *= (GFS2_SB(inode)->sd_sb.sb_bsize/GFS2_BASIC_BLOCK);
  55. inode->i_blocks += change;
  56. }
  57. static inline int gfs2_check_inum(const struct gfs2_inode *ip, u64 no_addr,
  58. u64 no_formal_ino)
  59. {
  60. return ip->i_no_addr == no_addr && ip->i_no_formal_ino == no_formal_ino;
  61. }
  62. static inline void gfs2_inum_out(const struct gfs2_inode *ip,
  63. struct gfs2_dirent *dent)
  64. {
  65. dent->de_inum.no_formal_ino = cpu_to_be64(ip->i_no_formal_ino);
  66. dent->de_inum.no_addr = cpu_to_be64(ip->i_no_addr);
  67. }
  68. static inline int gfs2_check_internal_file_size(struct inode *inode,
  69. u64 minsize, u64 maxsize)
  70. {
  71. u64 size = i_size_read(inode);
  72. if (size < minsize || size > maxsize)
  73. goto err;
  74. if (size & ((1 << inode->i_blkbits) - 1))
  75. goto err;
  76. return 0;
  77. err:
  78. gfs2_consist_inode(GFS2_I(inode));
  79. return -EIO;
  80. }
  81. extern struct inode *gfs2_inode_lookup(struct super_block *sb, unsigned type,
  82. u64 no_addr, u64 no_formal_ino,
  83. int non_block);
  84. extern struct inode *gfs2_lookup_by_inum(struct gfs2_sbd *sdp, u64 no_addr,
  85. u64 *no_formal_ino,
  86. unsigned int blktype);
  87. extern struct inode *gfs2_ilookup(struct super_block *sb, u64 no_addr, int nonblock);
  88. extern int gfs2_inode_refresh(struct gfs2_inode *ip);
  89. extern struct inode *gfs2_lookupi(struct inode *dir, const struct qstr *name,
  90. int is_root);
  91. extern int gfs2_permission(struct inode *inode, int mask);
  92. extern int gfs2_setattr_simple(struct inode *inode, struct iattr *attr);
  93. extern struct inode *gfs2_lookup_simple(struct inode *dip, const char *name);
  94. extern void gfs2_dinode_out(const struct gfs2_inode *ip, void *buf);
  95. extern int gfs2_open_common(struct inode *inode, struct file *file);
  96. extern const struct inode_operations gfs2_file_iops;
  97. extern const struct inode_operations gfs2_dir_iops;
  98. extern const struct inode_operations gfs2_symlink_iops;
  99. extern const struct file_operations gfs2_file_fops_nolock;
  100. extern const struct file_operations gfs2_dir_fops_nolock;
  101. extern void gfs2_set_inode_flags(struct inode *inode);
  102. #ifdef CONFIG_GFS2_FS_LOCKING_DLM
  103. extern const struct file_operations gfs2_file_fops;
  104. extern const struct file_operations gfs2_dir_fops;
  105. static inline int gfs2_localflocks(const struct gfs2_sbd *sdp)
  106. {
  107. return sdp->sd_args.ar_localflocks;
  108. }
  109. #else /* Single node only */
  110. #define gfs2_file_fops gfs2_file_fops_nolock
  111. #define gfs2_dir_fops gfs2_dir_fops_nolock
  112. static inline int gfs2_localflocks(const struct gfs2_sbd *sdp)
  113. {
  114. return 1;
  115. }
  116. #endif /* CONFIG_GFS2_FS_LOCKING_DLM */
  117. #endif /* __INODE_DOT_H__ */