1 // SPDX-License-Identifier: GPL-2.0
5 * Mikulas Patocka (mikulas@artax.karlin.mff.cuni.cz), 1998-1999
11 #include <linux/mpage.h>
13 #define BLOCKS(size) (((size) + 511) >> 9)
15 static int hpfs_file_release(struct inode
*inode
, struct file
*file
)
17 hpfs_lock(inode
->i_sb
);
18 hpfs_write_if_changed(inode
);
19 hpfs_unlock(inode
->i_sb
);
23 int hpfs_file_fsync(struct file
*file
, loff_t start
, loff_t end
, int datasync
)
25 struct inode
*inode
= file
->f_mapping
->host
;
28 ret
= file_write_and_wait_range(file
, start
, end
);
31 return sync_blockdev(inode
->i_sb
->s_bdev
);
35 * generic_file_read often calls bmap with non-existing sector,
36 * so we must ignore such errors.
39 static secno
hpfs_bmap(struct inode
*inode
, unsigned file_secno
, unsigned *n_secs
)
41 struct hpfs_inode_info
*hpfs_inode
= hpfs_i(inode
);
42 unsigned n
, disk_secno
;
44 struct buffer_head
*bh
;
45 if (BLOCKS(hpfs_i(inode
)->mmu_private
) <= file_secno
) return 0;
46 n
= file_secno
- hpfs_inode
->i_file_sec
;
47 if (n
< hpfs_inode
->i_n_secs
) {
48 *n_secs
= hpfs_inode
->i_n_secs
- n
;
49 return hpfs_inode
->i_disk_sec
+ n
;
51 if (!(fnode
= hpfs_map_fnode(inode
->i_sb
, inode
->i_ino
, &bh
))) return 0;
52 disk_secno
= hpfs_bplus_lookup(inode
->i_sb
, inode
, &fnode
->btree
, file_secno
, bh
);
53 if (disk_secno
== -1) return 0;
54 if (hpfs_chk_sectors(inode
->i_sb
, disk_secno
, 1, "bmap")) return 0;
55 n
= file_secno
- hpfs_inode
->i_file_sec
;
56 if (n
< hpfs_inode
->i_n_secs
) {
57 *n_secs
= hpfs_inode
->i_n_secs
- n
;
58 return hpfs_inode
->i_disk_sec
+ n
;
64 void hpfs_truncate(struct inode
*i
)
66 if (IS_IMMUTABLE(i
)) return /*-EPERM*/;
67 hpfs_lock_assert(i
->i_sb
);
69 hpfs_i(i
)->i_n_secs
= 0;
70 i
->i_blocks
= 1 + ((i
->i_size
+ 511) >> 9);
71 hpfs_i(i
)->mmu_private
= i
->i_size
;
72 hpfs_truncate_btree(i
->i_sb
, i
->i_ino
, 1, ((i
->i_size
+ 511) >> 9));
74 hpfs_i(i
)->i_n_secs
= 0;
77 static int hpfs_get_block(struct inode
*inode
, sector_t iblock
, struct buffer_head
*bh_result
, int create
)
82 hpfs_lock(inode
->i_sb
);
83 s
= hpfs_bmap(inode
, iblock
, &n_secs
);
85 if (bh_result
->b_size
>> 9 < n_secs
)
86 n_secs
= bh_result
->b_size
>> 9;
87 n_secs
= hpfs_search_hotfix_map_for_range(inode
->i_sb
, s
, n_secs
);
88 if (unlikely(!n_secs
)) {
89 s
= hpfs_search_hotfix_map(inode
->i_sb
, s
);
92 map_bh(bh_result
, inode
->i_sb
, s
);
93 bh_result
->b_size
= n_secs
<< 9;
96 if (!create
) goto ret_0
;
97 if (iblock
<<9 != hpfs_i(inode
)->mmu_private
) {
102 if ((s
= hpfs_add_sector_to_btree(inode
->i_sb
, inode
->i_ino
, 1, inode
->i_blocks
- 1)) == -1) {
103 hpfs_truncate_btree(inode
->i_sb
, inode
->i_ino
, 1, inode
->i_blocks
- 1);
108 hpfs_i(inode
)->mmu_private
+= 512;
109 set_buffer_new(bh_result
);
110 map_bh(bh_result
, inode
->i_sb
, hpfs_search_hotfix_map(inode
->i_sb
, s
));
114 hpfs_unlock(inode
->i_sb
);
118 static int hpfs_readpage(struct file
*file
, struct page
*page
)
120 return mpage_readpage(page
, hpfs_get_block
);
123 static int hpfs_writepage(struct page
*page
, struct writeback_control
*wbc
)
125 return block_write_full_page(page
, hpfs_get_block
, wbc
);
128 static int hpfs_readpages(struct file
*file
, struct address_space
*mapping
,
129 struct list_head
*pages
, unsigned nr_pages
)
131 return mpage_readpages(mapping
, pages
, nr_pages
, hpfs_get_block
);
134 static int hpfs_writepages(struct address_space
*mapping
,
135 struct writeback_control
*wbc
)
137 return mpage_writepages(mapping
, wbc
, hpfs_get_block
);
140 static void hpfs_write_failed(struct address_space
*mapping
, loff_t to
)
142 struct inode
*inode
= mapping
->host
;
144 hpfs_lock(inode
->i_sb
);
146 if (to
> inode
->i_size
) {
147 truncate_pagecache(inode
, inode
->i_size
);
148 hpfs_truncate(inode
);
151 hpfs_unlock(inode
->i_sb
);
154 static int hpfs_write_begin(struct file
*file
, struct address_space
*mapping
,
155 loff_t pos
, unsigned len
, unsigned flags
,
156 struct page
**pagep
, void **fsdata
)
161 ret
= cont_write_begin(file
, mapping
, pos
, len
, flags
, pagep
, fsdata
,
163 &hpfs_i(mapping
->host
)->mmu_private
);
165 hpfs_write_failed(mapping
, pos
+ len
);
170 static int hpfs_write_end(struct file
*file
, struct address_space
*mapping
,
171 loff_t pos
, unsigned len
, unsigned copied
,
172 struct page
*pagep
, void *fsdata
)
174 struct inode
*inode
= mapping
->host
;
176 err
= generic_write_end(file
, mapping
, pos
, len
, copied
, pagep
, fsdata
);
178 hpfs_write_failed(mapping
, pos
+ len
);
180 /* make sure we write it on close, if not earlier */
181 hpfs_lock(inode
->i_sb
);
182 hpfs_i(inode
)->i_dirty
= 1;
183 hpfs_unlock(inode
->i_sb
);
188 static sector_t
_hpfs_bmap(struct address_space
*mapping
, sector_t block
)
190 return generic_block_bmap(mapping
, block
, hpfs_get_block
);
193 static int hpfs_fiemap(struct inode
*inode
, struct fiemap_extent_info
*fieinfo
, u64 start
, u64 len
)
195 return generic_block_fiemap(inode
, fieinfo
, start
, len
, hpfs_get_block
);
198 const struct address_space_operations hpfs_aops
= {
199 .readpage
= hpfs_readpage
,
200 .writepage
= hpfs_writepage
,
201 .readpages
= hpfs_readpages
,
202 .writepages
= hpfs_writepages
,
203 .write_begin
= hpfs_write_begin
,
204 .write_end
= hpfs_write_end
,
208 const struct file_operations hpfs_file_ops
=
210 .llseek
= generic_file_llseek
,
211 .read_iter
= generic_file_read_iter
,
212 .write_iter
= generic_file_write_iter
,
213 .mmap
= generic_file_mmap
,
214 .release
= hpfs_file_release
,
215 .fsync
= hpfs_file_fsync
,
216 .splice_read
= generic_file_splice_read
,
217 .unlocked_ioctl
= hpfs_ioctl
,
218 .compat_ioctl
= compat_ptr_ioctl
,
221 const struct inode_operations hpfs_file_iops
=
223 .setattr
= hpfs_setattr
,
224 .fiemap
= hpfs_fiemap
,