xref: /kernel/linux/linux-6.6/fs/hpfs/inode.c (revision 62306a36)
162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci *  linux/fs/hpfs/inode.c
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci *  Mikulas Patocka (mikulas@artax.karlin.mff.cuni.cz), 1998-1999
662306a36Sopenharmony_ci *
762306a36Sopenharmony_ci *  inode VFS functions
862306a36Sopenharmony_ci */
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci#include <linux/slab.h>
1162306a36Sopenharmony_ci#include <linux/user_namespace.h>
1262306a36Sopenharmony_ci#include "hpfs_fn.h"
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_civoid hpfs_init_inode(struct inode *i)
1562306a36Sopenharmony_ci{
1662306a36Sopenharmony_ci	struct super_block *sb = i->i_sb;
1762306a36Sopenharmony_ci	struct hpfs_inode_info *hpfs_inode = hpfs_i(i);
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_ci	i->i_uid = hpfs_sb(sb)->sb_uid;
2062306a36Sopenharmony_ci	i->i_gid = hpfs_sb(sb)->sb_gid;
2162306a36Sopenharmony_ci	i->i_mode = hpfs_sb(sb)->sb_mode;
2262306a36Sopenharmony_ci	i->i_size = -1;
2362306a36Sopenharmony_ci	i->i_blocks = -1;
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_ci	hpfs_inode->i_dno = 0;
2662306a36Sopenharmony_ci	hpfs_inode->i_n_secs = 0;
2762306a36Sopenharmony_ci	hpfs_inode->i_file_sec = 0;
2862306a36Sopenharmony_ci	hpfs_inode->i_disk_sec = 0;
2962306a36Sopenharmony_ci	hpfs_inode->i_dpos = 0;
3062306a36Sopenharmony_ci	hpfs_inode->i_dsubdno = 0;
3162306a36Sopenharmony_ci	hpfs_inode->i_ea_mode = 0;
3262306a36Sopenharmony_ci	hpfs_inode->i_ea_uid = 0;
3362306a36Sopenharmony_ci	hpfs_inode->i_ea_gid = 0;
3462306a36Sopenharmony_ci	hpfs_inode->i_ea_size = 0;
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_ci	hpfs_inode->i_rddir_off = NULL;
3762306a36Sopenharmony_ci	hpfs_inode->i_dirty = 0;
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_ci	inode_set_ctime(i, 0, 0);
4062306a36Sopenharmony_ci	i->i_mtime.tv_sec = i->i_mtime.tv_nsec = 0;
4162306a36Sopenharmony_ci	i->i_atime.tv_sec = i->i_atime.tv_nsec = 0;
4262306a36Sopenharmony_ci}
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_civoid hpfs_read_inode(struct inode *i)
4562306a36Sopenharmony_ci{
4662306a36Sopenharmony_ci	struct buffer_head *bh;
4762306a36Sopenharmony_ci	struct fnode *fnode;
4862306a36Sopenharmony_ci	struct super_block *sb = i->i_sb;
4962306a36Sopenharmony_ci	struct hpfs_inode_info *hpfs_inode = hpfs_i(i);
5062306a36Sopenharmony_ci	void *ea;
5162306a36Sopenharmony_ci	int ea_size;
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_ci	if (!(fnode = hpfs_map_fnode(sb, i->i_ino, &bh))) {
5462306a36Sopenharmony_ci		/*i->i_mode |= S_IFREG;
5562306a36Sopenharmony_ci		i->i_mode &= ~0111;
5662306a36Sopenharmony_ci		i->i_op = &hpfs_file_iops;
5762306a36Sopenharmony_ci		i->i_fop = &hpfs_file_ops;
5862306a36Sopenharmony_ci		clear_nlink(i);*/
5962306a36Sopenharmony_ci		make_bad_inode(i);
6062306a36Sopenharmony_ci		return;
6162306a36Sopenharmony_ci	}
6262306a36Sopenharmony_ci	if (hpfs_sb(i->i_sb)->sb_eas) {
6362306a36Sopenharmony_ci		if ((ea = hpfs_get_ea(i->i_sb, fnode, "UID", &ea_size))) {
6462306a36Sopenharmony_ci			if (ea_size == 2) {
6562306a36Sopenharmony_ci				i_uid_write(i, le16_to_cpu(*(__le16*)ea));
6662306a36Sopenharmony_ci				hpfs_inode->i_ea_uid = 1;
6762306a36Sopenharmony_ci			}
6862306a36Sopenharmony_ci			kfree(ea);
6962306a36Sopenharmony_ci		}
7062306a36Sopenharmony_ci		if ((ea = hpfs_get_ea(i->i_sb, fnode, "GID", &ea_size))) {
7162306a36Sopenharmony_ci			if (ea_size == 2) {
7262306a36Sopenharmony_ci				i_gid_write(i, le16_to_cpu(*(__le16*)ea));
7362306a36Sopenharmony_ci				hpfs_inode->i_ea_gid = 1;
7462306a36Sopenharmony_ci			}
7562306a36Sopenharmony_ci			kfree(ea);
7662306a36Sopenharmony_ci		}
7762306a36Sopenharmony_ci		if ((ea = hpfs_get_ea(i->i_sb, fnode, "SYMLINK", &ea_size))) {
7862306a36Sopenharmony_ci			kfree(ea);
7962306a36Sopenharmony_ci			i->i_mode = S_IFLNK | 0777;
8062306a36Sopenharmony_ci			i->i_op = &page_symlink_inode_operations;
8162306a36Sopenharmony_ci			inode_nohighmem(i);
8262306a36Sopenharmony_ci			i->i_data.a_ops = &hpfs_symlink_aops;
8362306a36Sopenharmony_ci			set_nlink(i, 1);
8462306a36Sopenharmony_ci			i->i_size = ea_size;
8562306a36Sopenharmony_ci			i->i_blocks = 1;
8662306a36Sopenharmony_ci			brelse(bh);
8762306a36Sopenharmony_ci			return;
8862306a36Sopenharmony_ci		}
8962306a36Sopenharmony_ci		if ((ea = hpfs_get_ea(i->i_sb, fnode, "MODE", &ea_size))) {
9062306a36Sopenharmony_ci			int rdev = 0;
9162306a36Sopenharmony_ci			umode_t mode = hpfs_sb(sb)->sb_mode;
9262306a36Sopenharmony_ci			if (ea_size == 2) {
9362306a36Sopenharmony_ci				mode = le16_to_cpu(*(__le16*)ea);
9462306a36Sopenharmony_ci				hpfs_inode->i_ea_mode = 1;
9562306a36Sopenharmony_ci			}
9662306a36Sopenharmony_ci			kfree(ea);
9762306a36Sopenharmony_ci			i->i_mode = mode;
9862306a36Sopenharmony_ci			if (S_ISBLK(mode) || S_ISCHR(mode)) {
9962306a36Sopenharmony_ci				if ((ea = hpfs_get_ea(i->i_sb, fnode, "DEV", &ea_size))) {
10062306a36Sopenharmony_ci					if (ea_size == 4)
10162306a36Sopenharmony_ci						rdev = le32_to_cpu(*(__le32*)ea);
10262306a36Sopenharmony_ci					kfree(ea);
10362306a36Sopenharmony_ci				}
10462306a36Sopenharmony_ci			}
10562306a36Sopenharmony_ci			if (S_ISBLK(mode) || S_ISCHR(mode) || S_ISFIFO(mode) || S_ISSOCK(mode)) {
10662306a36Sopenharmony_ci				brelse(bh);
10762306a36Sopenharmony_ci				set_nlink(i, 1);
10862306a36Sopenharmony_ci				i->i_size = 0;
10962306a36Sopenharmony_ci				i->i_blocks = 1;
11062306a36Sopenharmony_ci				init_special_inode(i, mode,
11162306a36Sopenharmony_ci					new_decode_dev(rdev));
11262306a36Sopenharmony_ci				return;
11362306a36Sopenharmony_ci			}
11462306a36Sopenharmony_ci		}
11562306a36Sopenharmony_ci	}
11662306a36Sopenharmony_ci	if (fnode_is_dir(fnode)) {
11762306a36Sopenharmony_ci		int n_dnodes, n_subdirs;
11862306a36Sopenharmony_ci		i->i_mode |= S_IFDIR;
11962306a36Sopenharmony_ci		i->i_op = &hpfs_dir_iops;
12062306a36Sopenharmony_ci		i->i_fop = &hpfs_dir_ops;
12162306a36Sopenharmony_ci		hpfs_inode->i_parent_dir = le32_to_cpu(fnode->up);
12262306a36Sopenharmony_ci		hpfs_inode->i_dno = le32_to_cpu(fnode->u.external[0].disk_secno);
12362306a36Sopenharmony_ci		if (hpfs_sb(sb)->sb_chk >= 2) {
12462306a36Sopenharmony_ci			struct buffer_head *bh0;
12562306a36Sopenharmony_ci			if (hpfs_map_fnode(sb, hpfs_inode->i_parent_dir, &bh0)) brelse(bh0);
12662306a36Sopenharmony_ci		}
12762306a36Sopenharmony_ci		n_dnodes = 0; n_subdirs = 0;
12862306a36Sopenharmony_ci		hpfs_count_dnodes(i->i_sb, hpfs_inode->i_dno, &n_dnodes, &n_subdirs, NULL);
12962306a36Sopenharmony_ci		i->i_blocks = 4 * n_dnodes;
13062306a36Sopenharmony_ci		i->i_size = 2048 * n_dnodes;
13162306a36Sopenharmony_ci		set_nlink(i, 2 + n_subdirs);
13262306a36Sopenharmony_ci	} else {
13362306a36Sopenharmony_ci		i->i_mode |= S_IFREG;
13462306a36Sopenharmony_ci		if (!hpfs_inode->i_ea_mode) i->i_mode &= ~0111;
13562306a36Sopenharmony_ci		i->i_op = &hpfs_file_iops;
13662306a36Sopenharmony_ci		i->i_fop = &hpfs_file_ops;
13762306a36Sopenharmony_ci		set_nlink(i, 1);
13862306a36Sopenharmony_ci		i->i_size = le32_to_cpu(fnode->file_size);
13962306a36Sopenharmony_ci		i->i_blocks = ((i->i_size + 511) >> 9) + 1;
14062306a36Sopenharmony_ci		i->i_data.a_ops = &hpfs_aops;
14162306a36Sopenharmony_ci		hpfs_i(i)->mmu_private = i->i_size;
14262306a36Sopenharmony_ci	}
14362306a36Sopenharmony_ci	brelse(bh);
14462306a36Sopenharmony_ci}
14562306a36Sopenharmony_ci
14662306a36Sopenharmony_cistatic void hpfs_write_inode_ea(struct inode *i, struct fnode *fnode)
14762306a36Sopenharmony_ci{
14862306a36Sopenharmony_ci	struct hpfs_inode_info *hpfs_inode = hpfs_i(i);
14962306a36Sopenharmony_ci	/*if (le32_to_cpu(fnode->acl_size_l) || le16_to_cpu(fnode->acl_size_s)) {
15062306a36Sopenharmony_ci		   Some unknown structures like ACL may be in fnode,
15162306a36Sopenharmony_ci		   we'd better not overwrite them
15262306a36Sopenharmony_ci		hpfs_error(i->i_sb, "fnode %08x has some unknown HPFS386 structures", i->i_ino);
15362306a36Sopenharmony_ci	} else*/ if (hpfs_sb(i->i_sb)->sb_eas >= 2) {
15462306a36Sopenharmony_ci		__le32 ea;
15562306a36Sopenharmony_ci		if (!uid_eq(i->i_uid, hpfs_sb(i->i_sb)->sb_uid) || hpfs_inode->i_ea_uid) {
15662306a36Sopenharmony_ci			ea = cpu_to_le32(i_uid_read(i));
15762306a36Sopenharmony_ci			hpfs_set_ea(i, fnode, "UID", (char*)&ea, 2);
15862306a36Sopenharmony_ci			hpfs_inode->i_ea_uid = 1;
15962306a36Sopenharmony_ci		}
16062306a36Sopenharmony_ci		if (!gid_eq(i->i_gid, hpfs_sb(i->i_sb)->sb_gid) || hpfs_inode->i_ea_gid) {
16162306a36Sopenharmony_ci			ea = cpu_to_le32(i_gid_read(i));
16262306a36Sopenharmony_ci			hpfs_set_ea(i, fnode, "GID", (char *)&ea, 2);
16362306a36Sopenharmony_ci			hpfs_inode->i_ea_gid = 1;
16462306a36Sopenharmony_ci		}
16562306a36Sopenharmony_ci		if (!S_ISLNK(i->i_mode))
16662306a36Sopenharmony_ci			if ((i->i_mode != ((hpfs_sb(i->i_sb)->sb_mode & ~(S_ISDIR(i->i_mode) ? 0 : 0111))
16762306a36Sopenharmony_ci			  | (S_ISDIR(i->i_mode) ? S_IFDIR : S_IFREG))
16862306a36Sopenharmony_ci			  && i->i_mode != ((hpfs_sb(i->i_sb)->sb_mode & ~(S_ISDIR(i->i_mode) ? 0222 : 0333))
16962306a36Sopenharmony_ci			  | (S_ISDIR(i->i_mode) ? S_IFDIR : S_IFREG))) || hpfs_inode->i_ea_mode) {
17062306a36Sopenharmony_ci				ea = cpu_to_le32(i->i_mode);
17162306a36Sopenharmony_ci				/* sick, but legal */
17262306a36Sopenharmony_ci				hpfs_set_ea(i, fnode, "MODE", (char *)&ea, 2);
17362306a36Sopenharmony_ci				hpfs_inode->i_ea_mode = 1;
17462306a36Sopenharmony_ci			}
17562306a36Sopenharmony_ci		if (S_ISBLK(i->i_mode) || S_ISCHR(i->i_mode)) {
17662306a36Sopenharmony_ci			ea = cpu_to_le32(new_encode_dev(i->i_rdev));
17762306a36Sopenharmony_ci			hpfs_set_ea(i, fnode, "DEV", (char *)&ea, 4);
17862306a36Sopenharmony_ci		}
17962306a36Sopenharmony_ci	}
18062306a36Sopenharmony_ci}
18162306a36Sopenharmony_ci
18262306a36Sopenharmony_civoid hpfs_write_inode(struct inode *i)
18362306a36Sopenharmony_ci{
18462306a36Sopenharmony_ci	struct hpfs_inode_info *hpfs_inode = hpfs_i(i);
18562306a36Sopenharmony_ci	struct inode *parent;
18662306a36Sopenharmony_ci	if (i->i_ino == hpfs_sb(i->i_sb)->sb_root) return;
18762306a36Sopenharmony_ci	if (hpfs_inode->i_rddir_off && !atomic_read(&i->i_count)) {
18862306a36Sopenharmony_ci		if (*hpfs_inode->i_rddir_off)
18962306a36Sopenharmony_ci			pr_err("write_inode: some position still there\n");
19062306a36Sopenharmony_ci		kfree(hpfs_inode->i_rddir_off);
19162306a36Sopenharmony_ci		hpfs_inode->i_rddir_off = NULL;
19262306a36Sopenharmony_ci	}
19362306a36Sopenharmony_ci	if (!i->i_nlink) {
19462306a36Sopenharmony_ci		return;
19562306a36Sopenharmony_ci	}
19662306a36Sopenharmony_ci	parent = iget_locked(i->i_sb, hpfs_inode->i_parent_dir);
19762306a36Sopenharmony_ci	if (parent) {
19862306a36Sopenharmony_ci		hpfs_inode->i_dirty = 0;
19962306a36Sopenharmony_ci		if (parent->i_state & I_NEW) {
20062306a36Sopenharmony_ci			hpfs_init_inode(parent);
20162306a36Sopenharmony_ci			hpfs_read_inode(parent);
20262306a36Sopenharmony_ci			unlock_new_inode(parent);
20362306a36Sopenharmony_ci		}
20462306a36Sopenharmony_ci		hpfs_write_inode_nolock(i);
20562306a36Sopenharmony_ci		iput(parent);
20662306a36Sopenharmony_ci	}
20762306a36Sopenharmony_ci}
20862306a36Sopenharmony_ci
20962306a36Sopenharmony_civoid hpfs_write_inode_nolock(struct inode *i)
21062306a36Sopenharmony_ci{
21162306a36Sopenharmony_ci	struct hpfs_inode_info *hpfs_inode = hpfs_i(i);
21262306a36Sopenharmony_ci	struct buffer_head *bh;
21362306a36Sopenharmony_ci	struct fnode *fnode;
21462306a36Sopenharmony_ci	struct quad_buffer_head qbh;
21562306a36Sopenharmony_ci	struct hpfs_dirent *de;
21662306a36Sopenharmony_ci	if (i->i_ino == hpfs_sb(i->i_sb)->sb_root) return;
21762306a36Sopenharmony_ci	if (!(fnode = hpfs_map_fnode(i->i_sb, i->i_ino, &bh))) return;
21862306a36Sopenharmony_ci	if (i->i_ino != hpfs_sb(i->i_sb)->sb_root && i->i_nlink) {
21962306a36Sopenharmony_ci		if (!(de = map_fnode_dirent(i->i_sb, i->i_ino, fnode, &qbh))) {
22062306a36Sopenharmony_ci			brelse(bh);
22162306a36Sopenharmony_ci			return;
22262306a36Sopenharmony_ci		}
22362306a36Sopenharmony_ci	} else de = NULL;
22462306a36Sopenharmony_ci	if (S_ISREG(i->i_mode)) {
22562306a36Sopenharmony_ci		fnode->file_size = cpu_to_le32(i->i_size);
22662306a36Sopenharmony_ci		if (de) de->file_size = cpu_to_le32(i->i_size);
22762306a36Sopenharmony_ci	} else if (S_ISDIR(i->i_mode)) {
22862306a36Sopenharmony_ci		fnode->file_size = cpu_to_le32(0);
22962306a36Sopenharmony_ci		if (de) de->file_size = cpu_to_le32(0);
23062306a36Sopenharmony_ci	}
23162306a36Sopenharmony_ci	hpfs_write_inode_ea(i, fnode);
23262306a36Sopenharmony_ci	if (de) {
23362306a36Sopenharmony_ci		de->write_date = cpu_to_le32(gmt_to_local(i->i_sb, i->i_mtime.tv_sec));
23462306a36Sopenharmony_ci		de->read_date = cpu_to_le32(gmt_to_local(i->i_sb, i->i_atime.tv_sec));
23562306a36Sopenharmony_ci		de->creation_date = cpu_to_le32(gmt_to_local(i->i_sb, inode_get_ctime(i).tv_sec));
23662306a36Sopenharmony_ci		de->read_only = !(i->i_mode & 0222);
23762306a36Sopenharmony_ci		de->ea_size = cpu_to_le32(hpfs_inode->i_ea_size);
23862306a36Sopenharmony_ci		hpfs_mark_4buffers_dirty(&qbh);
23962306a36Sopenharmony_ci		hpfs_brelse4(&qbh);
24062306a36Sopenharmony_ci	}
24162306a36Sopenharmony_ci	if (S_ISDIR(i->i_mode)) {
24262306a36Sopenharmony_ci		if ((de = map_dirent(i, hpfs_inode->i_dno, "\001\001", 2, NULL, &qbh))) {
24362306a36Sopenharmony_ci			de->write_date = cpu_to_le32(gmt_to_local(i->i_sb, i->i_mtime.tv_sec));
24462306a36Sopenharmony_ci			de->read_date = cpu_to_le32(gmt_to_local(i->i_sb, i->i_atime.tv_sec));
24562306a36Sopenharmony_ci			de->creation_date = cpu_to_le32(gmt_to_local(i->i_sb, inode_get_ctime(i).tv_sec));
24662306a36Sopenharmony_ci			de->read_only = !(i->i_mode & 0222);
24762306a36Sopenharmony_ci			de->ea_size = cpu_to_le32(/*hpfs_inode->i_ea_size*/0);
24862306a36Sopenharmony_ci			de->file_size = cpu_to_le32(0);
24962306a36Sopenharmony_ci			hpfs_mark_4buffers_dirty(&qbh);
25062306a36Sopenharmony_ci			hpfs_brelse4(&qbh);
25162306a36Sopenharmony_ci		} else
25262306a36Sopenharmony_ci			hpfs_error(i->i_sb,
25362306a36Sopenharmony_ci				"directory %08lx doesn't have '.' entry",
25462306a36Sopenharmony_ci				(unsigned long)i->i_ino);
25562306a36Sopenharmony_ci	}
25662306a36Sopenharmony_ci	mark_buffer_dirty(bh);
25762306a36Sopenharmony_ci	brelse(bh);
25862306a36Sopenharmony_ci}
25962306a36Sopenharmony_ci
26062306a36Sopenharmony_ciint hpfs_setattr(struct mnt_idmap *idmap, struct dentry *dentry,
26162306a36Sopenharmony_ci		 struct iattr *attr)
26262306a36Sopenharmony_ci{
26362306a36Sopenharmony_ci	struct inode *inode = d_inode(dentry);
26462306a36Sopenharmony_ci	int error = -EINVAL;
26562306a36Sopenharmony_ci
26662306a36Sopenharmony_ci	hpfs_lock(inode->i_sb);
26762306a36Sopenharmony_ci	if (inode->i_ino == hpfs_sb(inode->i_sb)->sb_root)
26862306a36Sopenharmony_ci		goto out_unlock;
26962306a36Sopenharmony_ci	if ((attr->ia_valid & ATTR_UID) &&
27062306a36Sopenharmony_ci	    from_kuid(&init_user_ns, attr->ia_uid) >= 0x10000)
27162306a36Sopenharmony_ci		goto out_unlock;
27262306a36Sopenharmony_ci	if ((attr->ia_valid & ATTR_GID) &&
27362306a36Sopenharmony_ci	    from_kgid(&init_user_ns, attr->ia_gid) >= 0x10000)
27462306a36Sopenharmony_ci		goto out_unlock;
27562306a36Sopenharmony_ci	if ((attr->ia_valid & ATTR_SIZE) && attr->ia_size > inode->i_size)
27662306a36Sopenharmony_ci		goto out_unlock;
27762306a36Sopenharmony_ci
27862306a36Sopenharmony_ci	error = setattr_prepare(&nop_mnt_idmap, dentry, attr);
27962306a36Sopenharmony_ci	if (error)
28062306a36Sopenharmony_ci		goto out_unlock;
28162306a36Sopenharmony_ci
28262306a36Sopenharmony_ci	if ((attr->ia_valid & ATTR_SIZE) &&
28362306a36Sopenharmony_ci	    attr->ia_size != i_size_read(inode)) {
28462306a36Sopenharmony_ci		error = inode_newsize_ok(inode, attr->ia_size);
28562306a36Sopenharmony_ci		if (error)
28662306a36Sopenharmony_ci			goto out_unlock;
28762306a36Sopenharmony_ci
28862306a36Sopenharmony_ci		truncate_setsize(inode, attr->ia_size);
28962306a36Sopenharmony_ci		hpfs_truncate(inode);
29062306a36Sopenharmony_ci	}
29162306a36Sopenharmony_ci
29262306a36Sopenharmony_ci	setattr_copy(&nop_mnt_idmap, inode, attr);
29362306a36Sopenharmony_ci
29462306a36Sopenharmony_ci	hpfs_write_inode(inode);
29562306a36Sopenharmony_ci
29662306a36Sopenharmony_ci out_unlock:
29762306a36Sopenharmony_ci	hpfs_unlock(inode->i_sb);
29862306a36Sopenharmony_ci	return error;
29962306a36Sopenharmony_ci}
30062306a36Sopenharmony_ci
30162306a36Sopenharmony_civoid hpfs_write_if_changed(struct inode *inode)
30262306a36Sopenharmony_ci{
30362306a36Sopenharmony_ci	struct hpfs_inode_info *hpfs_inode = hpfs_i(inode);
30462306a36Sopenharmony_ci
30562306a36Sopenharmony_ci	if (hpfs_inode->i_dirty)
30662306a36Sopenharmony_ci		hpfs_write_inode(inode);
30762306a36Sopenharmony_ci}
30862306a36Sopenharmony_ci
30962306a36Sopenharmony_civoid hpfs_evict_inode(struct inode *inode)
31062306a36Sopenharmony_ci{
31162306a36Sopenharmony_ci	truncate_inode_pages_final(&inode->i_data);
31262306a36Sopenharmony_ci	clear_inode(inode);
31362306a36Sopenharmony_ci	if (!inode->i_nlink) {
31462306a36Sopenharmony_ci		hpfs_lock(inode->i_sb);
31562306a36Sopenharmony_ci		hpfs_remove_fnode(inode->i_sb, inode->i_ino);
31662306a36Sopenharmony_ci		hpfs_unlock(inode->i_sb);
31762306a36Sopenharmony_ci	}
31862306a36Sopenharmony_ci}
319