1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun #ifndef _UFS_UFS_H
3*4882a593Smuzhiyun #define _UFS_UFS_H 1
4*4882a593Smuzhiyun
5*4882a593Smuzhiyun #ifdef pr_fmt
6*4882a593Smuzhiyun #undef pr_fmt
7*4882a593Smuzhiyun #endif
8*4882a593Smuzhiyun
9*4882a593Smuzhiyun #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
10*4882a593Smuzhiyun
11*4882a593Smuzhiyun #define UFS_MAX_GROUP_LOADED 8
12*4882a593Smuzhiyun #define UFS_CGNO_EMPTY ((unsigned)-1)
13*4882a593Smuzhiyun
14*4882a593Smuzhiyun struct ufs_sb_private_info;
15*4882a593Smuzhiyun struct ufs_cg_private_info;
16*4882a593Smuzhiyun struct ufs_csum;
17*4882a593Smuzhiyun
18*4882a593Smuzhiyun struct ufs_sb_info {
19*4882a593Smuzhiyun struct ufs_sb_private_info * s_uspi;
20*4882a593Smuzhiyun struct ufs_csum * s_csp;
21*4882a593Smuzhiyun unsigned s_bytesex;
22*4882a593Smuzhiyun unsigned s_flags;
23*4882a593Smuzhiyun struct buffer_head ** s_ucg;
24*4882a593Smuzhiyun struct ufs_cg_private_info * s_ucpi[UFS_MAX_GROUP_LOADED];
25*4882a593Smuzhiyun unsigned s_cgno[UFS_MAX_GROUP_LOADED];
26*4882a593Smuzhiyun unsigned short s_cg_loaded;
27*4882a593Smuzhiyun unsigned s_mount_opt;
28*4882a593Smuzhiyun struct super_block *sb;
29*4882a593Smuzhiyun int work_queued; /* non-zero if the delayed work is queued */
30*4882a593Smuzhiyun struct delayed_work sync_work; /* FS sync delayed work */
31*4882a593Smuzhiyun spinlock_t work_lock; /* protects sync_work and work_queued */
32*4882a593Smuzhiyun struct mutex s_lock;
33*4882a593Smuzhiyun };
34*4882a593Smuzhiyun
35*4882a593Smuzhiyun struct ufs_inode_info {
36*4882a593Smuzhiyun union {
37*4882a593Smuzhiyun __fs32 i_data[15];
38*4882a593Smuzhiyun __u8 i_symlink[2 * 4 * 15];
39*4882a593Smuzhiyun __fs64 u2_i_data[15];
40*4882a593Smuzhiyun } i_u1;
41*4882a593Smuzhiyun __u32 i_flags;
42*4882a593Smuzhiyun __u32 i_shadow;
43*4882a593Smuzhiyun __u32 i_unused1;
44*4882a593Smuzhiyun __u32 i_unused2;
45*4882a593Smuzhiyun __u32 i_oeftflag;
46*4882a593Smuzhiyun __u16 i_osync;
47*4882a593Smuzhiyun __u64 i_lastfrag;
48*4882a593Smuzhiyun seqlock_t meta_lock;
49*4882a593Smuzhiyun struct mutex truncate_mutex;
50*4882a593Smuzhiyun __u32 i_dir_start_lookup;
51*4882a593Smuzhiyun struct inode vfs_inode;
52*4882a593Smuzhiyun };
53*4882a593Smuzhiyun
54*4882a593Smuzhiyun /* mount options */
55*4882a593Smuzhiyun #define UFS_MOUNT_ONERROR 0x0000000F
56*4882a593Smuzhiyun #define UFS_MOUNT_ONERROR_PANIC 0x00000001
57*4882a593Smuzhiyun #define UFS_MOUNT_ONERROR_LOCK 0x00000002
58*4882a593Smuzhiyun #define UFS_MOUNT_ONERROR_UMOUNT 0x00000004
59*4882a593Smuzhiyun #define UFS_MOUNT_ONERROR_REPAIR 0x00000008
60*4882a593Smuzhiyun
61*4882a593Smuzhiyun #define UFS_MOUNT_UFSTYPE 0x0000FFF0
62*4882a593Smuzhiyun #define UFS_MOUNT_UFSTYPE_OLD 0x00000010
63*4882a593Smuzhiyun #define UFS_MOUNT_UFSTYPE_44BSD 0x00000020
64*4882a593Smuzhiyun #define UFS_MOUNT_UFSTYPE_SUN 0x00000040
65*4882a593Smuzhiyun #define UFS_MOUNT_UFSTYPE_NEXTSTEP 0x00000080
66*4882a593Smuzhiyun #define UFS_MOUNT_UFSTYPE_NEXTSTEP_CD 0x00000100
67*4882a593Smuzhiyun #define UFS_MOUNT_UFSTYPE_OPENSTEP 0x00000200
68*4882a593Smuzhiyun #define UFS_MOUNT_UFSTYPE_SUNx86 0x00000400
69*4882a593Smuzhiyun #define UFS_MOUNT_UFSTYPE_HP 0x00000800
70*4882a593Smuzhiyun #define UFS_MOUNT_UFSTYPE_UFS2 0x00001000
71*4882a593Smuzhiyun #define UFS_MOUNT_UFSTYPE_SUNOS 0x00002000
72*4882a593Smuzhiyun
73*4882a593Smuzhiyun #define ufs_clear_opt(o,opt) o &= ~UFS_MOUNT_##opt
74*4882a593Smuzhiyun #define ufs_set_opt(o,opt) o |= UFS_MOUNT_##opt
75*4882a593Smuzhiyun #define ufs_test_opt(o,opt) ((o) & UFS_MOUNT_##opt)
76*4882a593Smuzhiyun
77*4882a593Smuzhiyun /*
78*4882a593Smuzhiyun * Debug code
79*4882a593Smuzhiyun */
80*4882a593Smuzhiyun #ifdef CONFIG_UFS_DEBUG
81*4882a593Smuzhiyun # define UFSD(f, a...) { \
82*4882a593Smuzhiyun pr_debug("UFSD (%s, %d): %s:", \
83*4882a593Smuzhiyun __FILE__, __LINE__, __func__); \
84*4882a593Smuzhiyun pr_debug(f, ## a); \
85*4882a593Smuzhiyun }
86*4882a593Smuzhiyun #else
87*4882a593Smuzhiyun # define UFSD(f, a...) /**/
88*4882a593Smuzhiyun #endif
89*4882a593Smuzhiyun
90*4882a593Smuzhiyun /* balloc.c */
91*4882a593Smuzhiyun extern void ufs_free_fragments (struct inode *, u64, unsigned);
92*4882a593Smuzhiyun extern void ufs_free_blocks (struct inode *, u64, unsigned);
93*4882a593Smuzhiyun extern u64 ufs_new_fragments(struct inode *, void *, u64, u64,
94*4882a593Smuzhiyun unsigned, int *, struct page *);
95*4882a593Smuzhiyun
96*4882a593Smuzhiyun /* cylinder.c */
97*4882a593Smuzhiyun extern struct ufs_cg_private_info * ufs_load_cylinder (struct super_block *, unsigned);
98*4882a593Smuzhiyun extern void ufs_put_cylinder (struct super_block *, unsigned);
99*4882a593Smuzhiyun
100*4882a593Smuzhiyun /* dir.c */
101*4882a593Smuzhiyun extern const struct inode_operations ufs_dir_inode_operations;
102*4882a593Smuzhiyun extern int ufs_add_link (struct dentry *, struct inode *);
103*4882a593Smuzhiyun extern ino_t ufs_inode_by_name(struct inode *, const struct qstr *);
104*4882a593Smuzhiyun extern int ufs_make_empty(struct inode *, struct inode *);
105*4882a593Smuzhiyun extern struct ufs_dir_entry *ufs_find_entry(struct inode *, const struct qstr *, struct page **);
106*4882a593Smuzhiyun extern int ufs_delete_entry(struct inode *, struct ufs_dir_entry *, struct page *);
107*4882a593Smuzhiyun extern int ufs_empty_dir (struct inode *);
108*4882a593Smuzhiyun extern struct ufs_dir_entry *ufs_dotdot(struct inode *, struct page **);
109*4882a593Smuzhiyun extern void ufs_set_link(struct inode *dir, struct ufs_dir_entry *de,
110*4882a593Smuzhiyun struct page *page, struct inode *inode, bool update_times);
111*4882a593Smuzhiyun
112*4882a593Smuzhiyun /* file.c */
113*4882a593Smuzhiyun extern const struct inode_operations ufs_file_inode_operations;
114*4882a593Smuzhiyun extern const struct file_operations ufs_file_operations;
115*4882a593Smuzhiyun extern const struct address_space_operations ufs_aops;
116*4882a593Smuzhiyun
117*4882a593Smuzhiyun /* ialloc.c */
118*4882a593Smuzhiyun extern void ufs_free_inode (struct inode *inode);
119*4882a593Smuzhiyun extern struct inode * ufs_new_inode (struct inode *, umode_t);
120*4882a593Smuzhiyun
121*4882a593Smuzhiyun /* inode.c */
122*4882a593Smuzhiyun extern struct inode *ufs_iget(struct super_block *, unsigned long);
123*4882a593Smuzhiyun extern int ufs_write_inode (struct inode *, struct writeback_control *);
124*4882a593Smuzhiyun extern int ufs_sync_inode (struct inode *);
125*4882a593Smuzhiyun extern void ufs_evict_inode (struct inode *);
126*4882a593Smuzhiyun extern int ufs_setattr(struct dentry *dentry, struct iattr *attr);
127*4882a593Smuzhiyun
128*4882a593Smuzhiyun /* namei.c */
129*4882a593Smuzhiyun extern const struct file_operations ufs_dir_operations;
130*4882a593Smuzhiyun
131*4882a593Smuzhiyun /* super.c */
132*4882a593Smuzhiyun extern __printf(3, 4)
133*4882a593Smuzhiyun void ufs_warning(struct super_block *, const char *, const char *, ...);
134*4882a593Smuzhiyun extern __printf(3, 4)
135*4882a593Smuzhiyun void ufs_error(struct super_block *, const char *, const char *, ...);
136*4882a593Smuzhiyun extern __printf(3, 4)
137*4882a593Smuzhiyun void ufs_panic(struct super_block *, const char *, const char *, ...);
138*4882a593Smuzhiyun void ufs_mark_sb_dirty(struct super_block *sb);
139*4882a593Smuzhiyun
UFS_SB(struct super_block * sb)140*4882a593Smuzhiyun static inline struct ufs_sb_info *UFS_SB(struct super_block *sb)
141*4882a593Smuzhiyun {
142*4882a593Smuzhiyun return sb->s_fs_info;
143*4882a593Smuzhiyun }
144*4882a593Smuzhiyun
UFS_I(struct inode * inode)145*4882a593Smuzhiyun static inline struct ufs_inode_info *UFS_I(struct inode *inode)
146*4882a593Smuzhiyun {
147*4882a593Smuzhiyun return container_of(inode, struct ufs_inode_info, vfs_inode);
148*4882a593Smuzhiyun }
149*4882a593Smuzhiyun
150*4882a593Smuzhiyun /*
151*4882a593Smuzhiyun * Give cylinder group number for a file system block.
152*4882a593Smuzhiyun * Give cylinder group block number for a file system block.
153*4882a593Smuzhiyun */
154*4882a593Smuzhiyun /* #define ufs_dtog(d) ((d) / uspi->s_fpg) */
ufs_dtog(struct ufs_sb_private_info * uspi,u64 b)155*4882a593Smuzhiyun static inline u64 ufs_dtog(struct ufs_sb_private_info * uspi, u64 b)
156*4882a593Smuzhiyun {
157*4882a593Smuzhiyun do_div(b, uspi->s_fpg);
158*4882a593Smuzhiyun return b;
159*4882a593Smuzhiyun }
160*4882a593Smuzhiyun /* #define ufs_dtogd(d) ((d) % uspi->s_fpg) */
ufs_dtogd(struct ufs_sb_private_info * uspi,u64 b)161*4882a593Smuzhiyun static inline u32 ufs_dtogd(struct ufs_sb_private_info * uspi, u64 b)
162*4882a593Smuzhiyun {
163*4882a593Smuzhiyun return do_div(b, uspi->s_fpg);
164*4882a593Smuzhiyun }
165*4882a593Smuzhiyun
166*4882a593Smuzhiyun #endif /* _UFS_UFS_H */
167