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/errno.h>
14 #include <linux/time.h>
15 #include <linux/stat.h>
16 #include <linux/fcntl.h>
17 #include <linux/smp_lock.h>
18 #include <linux/buffer_head.h>
21 #include <linux/qnx4_fs.h>
23 #include <asm/system.h>
26 * The functions for qnx4 fs file synchronization.
29 #ifdef CONFIG_QNX4FS_RW
31 static int sync_block(struct inode
*inode
, unsigned short *block
, int wait
)
33 struct buffer_head
*bh
;
39 bh
= sb_find_get_block(inode
->i_sb
, *block
);
46 if (wait
&& buffer_req(bh
) && !buffer_uptodate(bh
)) {
50 if (wait
|| !buffer_uptodate(bh
) || !buffer_dirty(bh
)) {
54 ll_rw_block(WRITE
, 1, &bh
);
55 atomic_dec(&bh
->b_count
);
60 static int sync_iblock(struct inode
*inode
, unsigned short *iblock
,
61 struct buffer_head
**bh
, int wait
)
70 rc
= sync_block(inode
, iblock
, wait
);
73 *bh
= sb_bread(inode
->i_sb
, tmp
);
85 static int sync_direct(struct inode
*inode
, int wait
)
90 for (i
= 0; i
< 7; i
++) {
91 rc
= sync_block(inode
,
92 (unsigned short *) qnx4_raw_inode(inode
)->di_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
,
150 int qnx4_sync_file(struct file
*file
, struct dentry
*dentry
, int unused
)
152 struct inode
*inode
= dentry
->d_inode
;
156 if (!(S_ISREG(inode
->i_mode
) || S_ISDIR(inode
->i_mode
) ||
157 S_ISLNK(inode
->i_mode
)))
161 for (wait
= 0; wait
<= 1; wait
++) {
162 err
|= sync_direct(inode
, wait
);
164 err
|= qnx4_sync_inode(inode
);
166 return (err
< 0) ? -EIO
: 0;