^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * linux/fs/hpfs/file.c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Mikulas Patocka (mikulas@artax.karlin.mff.cuni.cz), 1998-1999
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) * file VFS functions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include "hpfs_fn.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include <linux/mpage.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include <linux/fiemap.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #define BLOCKS(size) (((size) + 511) >> 9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) static int hpfs_file_release(struct inode *inode, struct file *file)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) hpfs_lock(inode->i_sb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) hpfs_write_if_changed(inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) hpfs_unlock(inode->i_sb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) int hpfs_file_fsync(struct file *file, loff_t start, loff_t end, int datasync)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) struct inode *inode = file->f_mapping->host;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) ret = file_write_and_wait_range(file, start, end);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) return sync_blockdev(inode->i_sb->s_bdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) * generic_file_read often calls bmap with non-existing sector,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) * so we must ignore such errors.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) static secno hpfs_bmap(struct inode *inode, unsigned file_secno, unsigned *n_secs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) struct hpfs_inode_info *hpfs_inode = hpfs_i(inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) unsigned n, disk_secno;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) struct fnode *fnode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) struct buffer_head *bh;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) if (BLOCKS(hpfs_i(inode)->mmu_private) <= file_secno) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) n = file_secno - hpfs_inode->i_file_sec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) if (n < hpfs_inode->i_n_secs) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) *n_secs = hpfs_inode->i_n_secs - n;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) return hpfs_inode->i_disk_sec + n;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) if (!(fnode = hpfs_map_fnode(inode->i_sb, inode->i_ino, &bh))) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) disk_secno = hpfs_bplus_lookup(inode->i_sb, inode, &fnode->btree, file_secno, bh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) if (disk_secno == -1) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) if (hpfs_chk_sectors(inode->i_sb, disk_secno, 1, "bmap")) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) n = file_secno - hpfs_inode->i_file_sec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) if (n < hpfs_inode->i_n_secs) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) *n_secs = hpfs_inode->i_n_secs - n;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) return hpfs_inode->i_disk_sec + n;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) *n_secs = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) return disk_secno;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) void hpfs_truncate(struct inode *i)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) if (IS_IMMUTABLE(i)) return /*-EPERM*/;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) hpfs_lock_assert(i->i_sb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) hpfs_i(i)->i_n_secs = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) i->i_blocks = 1 + ((i->i_size + 511) >> 9);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) hpfs_i(i)->mmu_private = i->i_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) hpfs_truncate_btree(i->i_sb, i->i_ino, 1, ((i->i_size + 511) >> 9));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) hpfs_write_inode(i);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) hpfs_i(i)->i_n_secs = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) static int hpfs_get_block(struct inode *inode, sector_t iblock, struct buffer_head *bh_result, int create)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) int r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) secno s;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) unsigned n_secs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) hpfs_lock(inode->i_sb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) s = hpfs_bmap(inode, iblock, &n_secs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) if (s) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) if (bh_result->b_size >> 9 < n_secs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) n_secs = bh_result->b_size >> 9;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) n_secs = hpfs_search_hotfix_map_for_range(inode->i_sb, s, n_secs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) if (unlikely(!n_secs)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) s = hpfs_search_hotfix_map(inode->i_sb, s);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) n_secs = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) map_bh(bh_result, inode->i_sb, s);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) bh_result->b_size = n_secs << 9;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) goto ret_0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) if (!create) goto ret_0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) if (iblock<<9 != hpfs_i(inode)->mmu_private) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) BUG();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) r = -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) goto ret_r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) if ((s = hpfs_add_sector_to_btree(inode->i_sb, inode->i_ino, 1, inode->i_blocks - 1)) == -1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) hpfs_truncate_btree(inode->i_sb, inode->i_ino, 1, inode->i_blocks - 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) r = -ENOSPC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) goto ret_r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) inode->i_blocks++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) hpfs_i(inode)->mmu_private += 512;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) set_buffer_new(bh_result);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) map_bh(bh_result, inode->i_sb, hpfs_search_hotfix_map(inode->i_sb, s));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) ret_0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) r = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) ret_r:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) hpfs_unlock(inode->i_sb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) return r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) static int hpfs_readpage(struct file *file, struct page *page)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) return mpage_readpage(page, hpfs_get_block);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) static int hpfs_writepage(struct page *page, struct writeback_control *wbc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) return block_write_full_page(page, hpfs_get_block, wbc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) static void hpfs_readahead(struct readahead_control *rac)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) mpage_readahead(rac, hpfs_get_block);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) static int hpfs_writepages(struct address_space *mapping,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) struct writeback_control *wbc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) return mpage_writepages(mapping, wbc, hpfs_get_block);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) static void hpfs_write_failed(struct address_space *mapping, loff_t to)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) struct inode *inode = mapping->host;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) hpfs_lock(inode->i_sb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) if (to > inode->i_size) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) truncate_pagecache(inode, inode->i_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) hpfs_truncate(inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) hpfs_unlock(inode->i_sb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) static int hpfs_write_begin(struct file *file, struct address_space *mapping,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) loff_t pos, unsigned len, unsigned flags,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) struct page **pagep, void **fsdata)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) *pagep = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) ret = cont_write_begin(file, mapping, pos, len, flags, pagep, fsdata,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) hpfs_get_block,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) &hpfs_i(mapping->host)->mmu_private);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) if (unlikely(ret))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) hpfs_write_failed(mapping, pos + len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) static int hpfs_write_end(struct file *file, struct address_space *mapping,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) loff_t pos, unsigned len, unsigned copied,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) struct page *pagep, void *fsdata)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) struct inode *inode = mapping->host;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) err = generic_write_end(file, mapping, pos, len, copied, pagep, fsdata);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) if (err < len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) hpfs_write_failed(mapping, pos + len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) if (!(err < 0)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) /* make sure we write it on close, if not earlier */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) hpfs_lock(inode->i_sb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) hpfs_i(inode)->i_dirty = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) hpfs_unlock(inode->i_sb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) static sector_t _hpfs_bmap(struct address_space *mapping, sector_t block)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) return generic_block_bmap(mapping, block, hpfs_get_block);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) static int hpfs_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo, u64 start, u64 len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) return generic_block_fiemap(inode, fieinfo, start, len, hpfs_get_block);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) const struct address_space_operations hpfs_aops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) .readpage = hpfs_readpage,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) .writepage = hpfs_writepage,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) .readahead = hpfs_readahead,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) .writepages = hpfs_writepages,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) .write_begin = hpfs_write_begin,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) .write_end = hpfs_write_end,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) .bmap = _hpfs_bmap
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) const struct file_operations hpfs_file_ops =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) .llseek = generic_file_llseek,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) .read_iter = generic_file_read_iter,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) .write_iter = generic_file_write_iter,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) .mmap = generic_file_mmap,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) .release = hpfs_file_release,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) .fsync = hpfs_file_fsync,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) .splice_read = generic_file_splice_read,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) .unlocked_ioctl = hpfs_ioctl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) .compat_ioctl = compat_ptr_ioctl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) const struct inode_operations hpfs_file_iops =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) .setattr = hpfs_setattr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) .fiemap = hpfs_fiemap,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) };