2 * QNX4 file system, Linux implementation.
6 * Using parts of the xiafs filesystem.
10 * 24-03-1998 by Richard Frowijn : first release.
13 #include <linux/config.h>
14 #include <linux/errno.h>
15 #include <linux/sched.h>
16 #include <linux/stat.h>
17 #include <linux/fcntl.h>
18 #include <linux/locks.h>
21 #include <linux/qnx4_fs.h>
23 #include <asm/segment.h>
24 #include <asm/system.h>
26 #define blocksize QNX4_BLOCK_SIZE
29 * The functions for qnx4 fs file synchronization.
32 #ifdef CONFIG_QNX4FS_RW
34 static int sync_block(struct inode
*inode
, unsigned short *block
, int wait
)
36 struct buffer_head
*bh
;
42 bh
= get_hash_table(inode
->i_dev
, *block
, blocksize
);
49 if (wait
&& buffer_req(bh
) && !buffer_uptodate(bh
)) {
53 if (wait
|| !buffer_uptodate(bh
) || !buffer_dirty(bh
)) {
57 ll_rw_block(WRITE
, 1, &bh
);
62 static int sync_iblock(struct inode
*inode
, unsigned short *iblock
,
63 struct buffer_head
**bh
, int wait
)
72 rc
= sync_block(inode
, iblock
, wait
);
75 *bh
= bread(inode
->i_dev
, tmp
, blocksize
);
86 static int sync_direct(struct inode
*inode
, int wait
)
91 for (i
= 0; i
< 7; i
++) {
92 rc
= sync_block(inode
,
93 (unsigned short *) inode
->u
.qnx4_i
.i_first_xtnt
.xtnt_blk
+ i
, wait
);
102 static int sync_indirect(struct inode
*inode
, unsigned short *iblock
, int wait
)
105 struct buffer_head
*ind_bh
;
108 rc
= sync_iblock(inode
, iblock
, &ind_bh
, wait
);
112 for (i
= 0; i
< 512; i
++) {
113 rc
= sync_block(inode
,
114 ((unsigned short *) ind_bh
->b_data
) + i
,
125 static int sync_dindirect(struct inode
*inode
, unsigned short *diblock
,
129 struct buffer_head
*dind_bh
;
132 rc
= sync_iblock(inode
, diblock
, &dind_bh
, wait
);
136 for (i
= 0; i
< 512; i
++) {
137 rc
= sync_indirect(inode
,
138 ((unsigned short *) dind_bh
->b_data
) + i
,
149 int qnx4_sync_file(struct file
*file
, struct dentry
*dentry
)
151 struct inode
*inode
= dentry
->d_inode
;
155 if (!(S_ISREG(inode
->i_mode
) || S_ISDIR(inode
->i_mode
) ||
156 S_ISLNK(inode
->i_mode
)))
159 for (wait
= 0; wait
<= 1; wait
++) {
160 err
|= sync_direct(inode
, wait
);
162 err
|= qnx4_sync_inode(inode
);
163 return (err
< 0) ? -EIO
: 0;