1 | /* SPDX-License-Identifier: GPL-2.0-only */ |
2 | /* |
3 | * Copyright (C) Sistina Software, Inc. 1997-2003 All rights reserved. |
4 | * Copyright (C) 2004-2006 Red Hat, Inc. All rights reserved. |
5 | */ |
6 | |
7 | #ifndef __INODE_DOT_H__ |
8 | #define __INODE_DOT_H__ |
9 | |
10 | #include <linux/fs.h> |
11 | #include <linux/buffer_head.h> |
12 | #include <linux/mm.h> |
13 | #include "util.h" |
14 | |
15 | bool gfs2_release_folio(struct folio *folio, gfp_t gfp_mask); |
16 | ssize_t gfs2_internal_read(struct gfs2_inode *ip, |
17 | char *buf, loff_t *pos, size_t size); |
18 | void gfs2_set_aops(struct inode *inode); |
19 | |
20 | static inline int gfs2_is_stuffed(const struct gfs2_inode *ip) |
21 | { |
22 | return !ip->i_height; |
23 | } |
24 | |
25 | static inline int gfs2_is_jdata(const struct gfs2_inode *ip) |
26 | { |
27 | return ip->i_diskflags & GFS2_DIF_JDATA; |
28 | } |
29 | |
30 | static inline bool gfs2_is_ordered(const struct gfs2_sbd *sdp) |
31 | { |
32 | return sdp->sd_args.ar_data == GFS2_DATA_ORDERED; |
33 | } |
34 | |
35 | static inline bool gfs2_is_writeback(const struct gfs2_sbd *sdp) |
36 | { |
37 | return sdp->sd_args.ar_data == GFS2_DATA_WRITEBACK; |
38 | } |
39 | |
40 | static inline int gfs2_is_dir(const struct gfs2_inode *ip) |
41 | { |
42 | return S_ISDIR(ip->i_inode.i_mode); |
43 | } |
44 | |
45 | static inline void gfs2_set_inode_blocks(struct inode *inode, u64 blocks) |
46 | { |
47 | inode->i_blocks = blocks << (inode->i_blkbits - 9); |
48 | } |
49 | |
50 | static inline u64 gfs2_get_inode_blocks(const struct inode *inode) |
51 | { |
52 | return inode->i_blocks >> (inode->i_blkbits - 9); |
53 | } |
54 | |
55 | static inline void gfs2_add_inode_blocks(struct inode *inode, s64 change) |
56 | { |
57 | change <<= inode->i_blkbits - 9; |
58 | gfs2_assert(GFS2_SB(inode), (change >= 0 || inode->i_blocks >= -change)); |
59 | inode->i_blocks += change; |
60 | } |
61 | |
62 | static inline int gfs2_check_inum(const struct gfs2_inode *ip, u64 no_addr, |
63 | u64 no_formal_ino) |
64 | { |
65 | return ip->i_no_addr == no_addr && ip->i_no_formal_ino == no_formal_ino; |
66 | } |
67 | |
68 | static inline void gfs2_inum_out(const struct gfs2_inode *ip, |
69 | struct gfs2_dirent *dent) |
70 | { |
71 | dent->de_inum.no_formal_ino = cpu_to_be64(ip->i_no_formal_ino); |
72 | dent->de_inum.no_addr = cpu_to_be64(ip->i_no_addr); |
73 | } |
74 | |
75 | static inline int gfs2_check_internal_file_size(struct inode *inode, |
76 | u64 minsize, u64 maxsize) |
77 | { |
78 | u64 size = i_size_read(inode); |
79 | if (size < minsize || size > maxsize) |
80 | goto err; |
81 | if (size & (BIT(inode->i_blkbits) - 1)) |
82 | goto err; |
83 | return 0; |
84 | err: |
85 | gfs2_consist_inode(GFS2_I(inode)); |
86 | return -EIO; |
87 | } |
88 | |
89 | struct inode *gfs2_inode_lookup(struct super_block *sb, unsigned type, |
90 | u64 no_addr, u64 no_formal_ino, |
91 | unsigned int blktype); |
92 | struct inode *gfs2_lookup_by_inum(struct gfs2_sbd *sdp, u64 no_addr, |
93 | u64 no_formal_ino, |
94 | unsigned int blktype); |
95 | |
96 | int gfs2_inode_refresh(struct gfs2_inode *ip); |
97 | |
98 | struct inode *gfs2_lookupi(struct inode *dir, const struct qstr *name, |
99 | int is_root); |
100 | int gfs2_permission(struct mnt_idmap *idmap, |
101 | struct inode *inode, int mask); |
102 | struct inode *gfs2_lookup_meta(struct inode *dip, const char *name); |
103 | void gfs2_dinode_out(const struct gfs2_inode *ip, void *buf); |
104 | int gfs2_open_common(struct inode *inode, struct file *file); |
105 | loff_t gfs2_seek_data(struct file *file, loff_t offset); |
106 | loff_t gfs2_seek_hole(struct file *file, loff_t offset); |
107 | |
108 | extern const struct file_operations gfs2_file_fops_nolock; |
109 | extern const struct file_operations gfs2_dir_fops_nolock; |
110 | |
111 | int gfs2_fileattr_get(struct dentry *dentry, struct fileattr *fa); |
112 | int gfs2_fileattr_set(struct mnt_idmap *idmap, |
113 | struct dentry *dentry, struct fileattr *fa); |
114 | void gfs2_set_inode_flags(struct inode *inode); |
115 | |
116 | #ifdef CONFIG_GFS2_FS_LOCKING_DLM |
117 | extern const struct file_operations gfs2_file_fops; |
118 | extern const struct file_operations gfs2_dir_fops; |
119 | |
120 | static inline int gfs2_localflocks(const struct gfs2_sbd *sdp) |
121 | { |
122 | return sdp->sd_args.ar_localflocks; |
123 | } |
124 | #else /* Single node only */ |
125 | #define gfs2_file_fops gfs2_file_fops_nolock |
126 | #define gfs2_dir_fops gfs2_dir_fops_nolock |
127 | |
128 | static inline int gfs2_localflocks(const struct gfs2_sbd *sdp) |
129 | { |
130 | return 1; |
131 | } |
132 | #endif /* CONFIG_GFS2_FS_LOCKING_DLM */ |
133 | |
134 | #endif /* __INODE_DOT_H__ */ |
135 | |
136 | |