1 // SPDX-License-Identifier: GPL-2.0 1 // SPDX-License-Identifier: GPL-2.0 2 /* 2 /* 3 * linux/fs/hpfs/inode.c 3 * linux/fs/hpfs/inode.c 4 * 4 * 5 * Mikulas Patocka (mikulas@artax.karlin.mff. 5 * Mikulas Patocka (mikulas@artax.karlin.mff.cuni.cz), 1998-1999 6 * 6 * 7 * inode VFS functions 7 * inode VFS functions 8 */ 8 */ 9 9 10 #include <linux/slab.h> 10 #include <linux/slab.h> 11 #include <linux/user_namespace.h> 11 #include <linux/user_namespace.h> 12 #include "hpfs_fn.h" 12 #include "hpfs_fn.h" 13 13 14 void hpfs_init_inode(struct inode *i) 14 void hpfs_init_inode(struct inode *i) 15 { 15 { 16 struct super_block *sb = i->i_sb; 16 struct super_block *sb = i->i_sb; 17 struct hpfs_inode_info *hpfs_inode = h 17 struct hpfs_inode_info *hpfs_inode = hpfs_i(i); 18 18 19 i->i_uid = hpfs_sb(sb)->sb_uid; 19 i->i_uid = hpfs_sb(sb)->sb_uid; 20 i->i_gid = hpfs_sb(sb)->sb_gid; 20 i->i_gid = hpfs_sb(sb)->sb_gid; 21 i->i_mode = hpfs_sb(sb)->sb_mode; 21 i->i_mode = hpfs_sb(sb)->sb_mode; 22 i->i_size = -1; 22 i->i_size = -1; 23 i->i_blocks = -1; 23 i->i_blocks = -1; 24 24 25 hpfs_inode->i_dno = 0; 25 hpfs_inode->i_dno = 0; 26 hpfs_inode->i_n_secs = 0; 26 hpfs_inode->i_n_secs = 0; 27 hpfs_inode->i_file_sec = 0; 27 hpfs_inode->i_file_sec = 0; 28 hpfs_inode->i_disk_sec = 0; 28 hpfs_inode->i_disk_sec = 0; 29 hpfs_inode->i_dpos = 0; 29 hpfs_inode->i_dpos = 0; 30 hpfs_inode->i_dsubdno = 0; 30 hpfs_inode->i_dsubdno = 0; 31 hpfs_inode->i_ea_mode = 0; 31 hpfs_inode->i_ea_mode = 0; 32 hpfs_inode->i_ea_uid = 0; 32 hpfs_inode->i_ea_uid = 0; 33 hpfs_inode->i_ea_gid = 0; 33 hpfs_inode->i_ea_gid = 0; 34 hpfs_inode->i_ea_size = 0; 34 hpfs_inode->i_ea_size = 0; 35 35 36 hpfs_inode->i_rddir_off = NULL; 36 hpfs_inode->i_rddir_off = NULL; 37 hpfs_inode->i_dirty = 0; 37 hpfs_inode->i_dirty = 0; 38 38 39 inode_set_ctime(i, 0, 0); !! 39 i->i_ctime.tv_sec = i->i_ctime.tv_nsec = 0; 40 inode_set_mtime(i, 0, 0); !! 40 i->i_mtime.tv_sec = i->i_mtime.tv_nsec = 0; 41 inode_set_atime(i, 0, 0); !! 41 i->i_atime.tv_sec = i->i_atime.tv_nsec = 0; 42 } 42 } 43 43 44 void hpfs_read_inode(struct inode *i) 44 void hpfs_read_inode(struct inode *i) 45 { 45 { 46 struct buffer_head *bh; 46 struct buffer_head *bh; 47 struct fnode *fnode; 47 struct fnode *fnode; 48 struct super_block *sb = i->i_sb; 48 struct super_block *sb = i->i_sb; 49 struct hpfs_inode_info *hpfs_inode = h 49 struct hpfs_inode_info *hpfs_inode = hpfs_i(i); 50 void *ea; 50 void *ea; 51 int ea_size; 51 int ea_size; 52 52 53 if (!(fnode = hpfs_map_fnode(sb, i->i_ 53 if (!(fnode = hpfs_map_fnode(sb, i->i_ino, &bh))) { 54 /*i->i_mode |= S_IFREG; 54 /*i->i_mode |= S_IFREG; 55 i->i_mode &= ~0111; 55 i->i_mode &= ~0111; 56 i->i_op = &hpfs_file_iops; 56 i->i_op = &hpfs_file_iops; 57 i->i_fop = &hpfs_file_ops; 57 i->i_fop = &hpfs_file_ops; 58 clear_nlink(i);*/ 58 clear_nlink(i);*/ 59 make_bad_inode(i); 59 make_bad_inode(i); 60 return; 60 return; 61 } 61 } 62 if (hpfs_sb(i->i_sb)->sb_eas) { 62 if (hpfs_sb(i->i_sb)->sb_eas) { 63 if ((ea = hpfs_get_ea(i->i_sb, 63 if ((ea = hpfs_get_ea(i->i_sb, fnode, "UID", &ea_size))) { 64 if (ea_size == 2) { 64 if (ea_size == 2) { 65 i_uid_write(i, 65 i_uid_write(i, le16_to_cpu(*(__le16*)ea)); 66 hpfs_inode->i_ 66 hpfs_inode->i_ea_uid = 1; 67 } 67 } 68 kfree(ea); 68 kfree(ea); 69 } 69 } 70 if ((ea = hpfs_get_ea(i->i_sb, 70 if ((ea = hpfs_get_ea(i->i_sb, fnode, "GID", &ea_size))) { 71 if (ea_size == 2) { 71 if (ea_size == 2) { 72 i_gid_write(i, 72 i_gid_write(i, le16_to_cpu(*(__le16*)ea)); 73 hpfs_inode->i_ 73 hpfs_inode->i_ea_gid = 1; 74 } 74 } 75 kfree(ea); 75 kfree(ea); 76 } 76 } 77 if ((ea = hpfs_get_ea(i->i_sb, 77 if ((ea = hpfs_get_ea(i->i_sb, fnode, "SYMLINK", &ea_size))) { 78 kfree(ea); 78 kfree(ea); 79 i->i_mode = S_IFLNK | 79 i->i_mode = S_IFLNK | 0777; 80 i->i_op = &page_symlin 80 i->i_op = &page_symlink_inode_operations; 81 inode_nohighmem(i); 81 inode_nohighmem(i); 82 i->i_data.a_ops = &hpf 82 i->i_data.a_ops = &hpfs_symlink_aops; 83 set_nlink(i, 1); 83 set_nlink(i, 1); 84 i->i_size = ea_size; 84 i->i_size = ea_size; 85 i->i_blocks = 1; 85 i->i_blocks = 1; 86 brelse(bh); 86 brelse(bh); 87 return; 87 return; 88 } 88 } 89 if ((ea = hpfs_get_ea(i->i_sb, 89 if ((ea = hpfs_get_ea(i->i_sb, fnode, "MODE", &ea_size))) { 90 int rdev = 0; 90 int rdev = 0; 91 umode_t mode = hpfs_sb 91 umode_t mode = hpfs_sb(sb)->sb_mode; 92 if (ea_size == 2) { 92 if (ea_size == 2) { 93 mode = le16_to 93 mode = le16_to_cpu(*(__le16*)ea); 94 hpfs_inode->i_ 94 hpfs_inode->i_ea_mode = 1; 95 } 95 } 96 kfree(ea); 96 kfree(ea); 97 i->i_mode = mode; 97 i->i_mode = mode; 98 if (S_ISBLK(mode) || S 98 if (S_ISBLK(mode) || S_ISCHR(mode)) { 99 if ((ea = hpfs 99 if ((ea = hpfs_get_ea(i->i_sb, fnode, "DEV", &ea_size))) { 100 if (ea 100 if (ea_size == 4) 101 101 rdev = le32_to_cpu(*(__le32*)ea); 102 kfree( 102 kfree(ea); 103 } 103 } 104 } 104 } 105 if (S_ISBLK(mode) || S 105 if (S_ISBLK(mode) || S_ISCHR(mode) || S_ISFIFO(mode) || S_ISSOCK(mode)) { 106 brelse(bh); 106 brelse(bh); 107 set_nlink(i, 1 107 set_nlink(i, 1); 108 i->i_size = 0; 108 i->i_size = 0; 109 i->i_blocks = 109 i->i_blocks = 1; 110 init_special_i 110 init_special_inode(i, mode, 111 new_de 111 new_decode_dev(rdev)); 112 return; 112 return; 113 } 113 } 114 } 114 } 115 } 115 } 116 if (fnode_is_dir(fnode)) { 116 if (fnode_is_dir(fnode)) { 117 int n_dnodes, n_subdirs; 117 int n_dnodes, n_subdirs; 118 i->i_mode |= S_IFDIR; 118 i->i_mode |= S_IFDIR; 119 i->i_op = &hpfs_dir_iops; 119 i->i_op = &hpfs_dir_iops; 120 i->i_fop = &hpfs_dir_ops; 120 i->i_fop = &hpfs_dir_ops; 121 hpfs_inode->i_parent_dir = le3 121 hpfs_inode->i_parent_dir = le32_to_cpu(fnode->up); 122 hpfs_inode->i_dno = le32_to_cp 122 hpfs_inode->i_dno = le32_to_cpu(fnode->u.external[0].disk_secno); 123 if (hpfs_sb(sb)->sb_chk >= 2) 123 if (hpfs_sb(sb)->sb_chk >= 2) { 124 struct buffer_head *bh 124 struct buffer_head *bh0; 125 if (hpfs_map_fnode(sb, 125 if (hpfs_map_fnode(sb, hpfs_inode->i_parent_dir, &bh0)) brelse(bh0); 126 } 126 } 127 n_dnodes = 0; n_subdirs = 0; 127 n_dnodes = 0; n_subdirs = 0; 128 hpfs_count_dnodes(i->i_sb, hpf 128 hpfs_count_dnodes(i->i_sb, hpfs_inode->i_dno, &n_dnodes, &n_subdirs, NULL); 129 i->i_blocks = 4 * n_dnodes; 129 i->i_blocks = 4 * n_dnodes; 130 i->i_size = 2048 * n_dnodes; 130 i->i_size = 2048 * n_dnodes; 131 set_nlink(i, 2 + n_subdirs); 131 set_nlink(i, 2 + n_subdirs); 132 } else { 132 } else { 133 i->i_mode |= S_IFREG; 133 i->i_mode |= S_IFREG; 134 if (!hpfs_inode->i_ea_mode) i- 134 if (!hpfs_inode->i_ea_mode) i->i_mode &= ~0111; 135 i->i_op = &hpfs_file_iops; 135 i->i_op = &hpfs_file_iops; 136 i->i_fop = &hpfs_file_ops; 136 i->i_fop = &hpfs_file_ops; 137 set_nlink(i, 1); 137 set_nlink(i, 1); 138 i->i_size = le32_to_cpu(fnode- 138 i->i_size = le32_to_cpu(fnode->file_size); 139 i->i_blocks = ((i->i_size + 51 139 i->i_blocks = ((i->i_size + 511) >> 9) + 1; 140 i->i_data.a_ops = &hpfs_aops; 140 i->i_data.a_ops = &hpfs_aops; 141 hpfs_i(i)->mmu_private = i->i_ 141 hpfs_i(i)->mmu_private = i->i_size; 142 } 142 } 143 brelse(bh); 143 brelse(bh); 144 } 144 } 145 145 146 static void hpfs_write_inode_ea(struct inode * 146 static void hpfs_write_inode_ea(struct inode *i, struct fnode *fnode) 147 { 147 { 148 struct hpfs_inode_info *hpfs_inode = h 148 struct hpfs_inode_info *hpfs_inode = hpfs_i(i); 149 /*if (le32_to_cpu(fnode->acl_size_l) | 149 /*if (le32_to_cpu(fnode->acl_size_l) || le16_to_cpu(fnode->acl_size_s)) { 150 Some unknown structures lik 150 Some unknown structures like ACL may be in fnode, 151 we'd better not overwrite t 151 we'd better not overwrite them 152 hpfs_error(i->i_sb, "fnode %08 152 hpfs_error(i->i_sb, "fnode %08x has some unknown HPFS386 structures", i->i_ino); 153 } else*/ if (hpfs_sb(i->i_sb)->sb_eas 153 } else*/ if (hpfs_sb(i->i_sb)->sb_eas >= 2) { 154 __le32 ea; 154 __le32 ea; 155 if (!uid_eq(i->i_uid, hpfs_sb( 155 if (!uid_eq(i->i_uid, hpfs_sb(i->i_sb)->sb_uid) || hpfs_inode->i_ea_uid) { 156 ea = cpu_to_le32(i_uid 156 ea = cpu_to_le32(i_uid_read(i)); 157 hpfs_set_ea(i, fnode, 157 hpfs_set_ea(i, fnode, "UID", (char*)&ea, 2); 158 hpfs_inode->i_ea_uid = 158 hpfs_inode->i_ea_uid = 1; 159 } 159 } 160 if (!gid_eq(i->i_gid, hpfs_sb( 160 if (!gid_eq(i->i_gid, hpfs_sb(i->i_sb)->sb_gid) || hpfs_inode->i_ea_gid) { 161 ea = cpu_to_le32(i_gid 161 ea = cpu_to_le32(i_gid_read(i)); 162 hpfs_set_ea(i, fnode, 162 hpfs_set_ea(i, fnode, "GID", (char *)&ea, 2); 163 hpfs_inode->i_ea_gid = 163 hpfs_inode->i_ea_gid = 1; 164 } 164 } 165 if (!S_ISLNK(i->i_mode)) 165 if (!S_ISLNK(i->i_mode)) 166 if ((i->i_mode != ((hp 166 if ((i->i_mode != ((hpfs_sb(i->i_sb)->sb_mode & ~(S_ISDIR(i->i_mode) ? 0 : 0111)) 167 | (S_ISDIR(i->i_mode 167 | (S_ISDIR(i->i_mode) ? S_IFDIR : S_IFREG)) 168 && i->i_mode != ((hp 168 && i->i_mode != ((hpfs_sb(i->i_sb)->sb_mode & ~(S_ISDIR(i->i_mode) ? 0222 : 0333)) 169 | (S_ISDIR(i->i_mode 169 | (S_ISDIR(i->i_mode) ? S_IFDIR : S_IFREG))) || hpfs_inode->i_ea_mode) { 170 ea = cpu_to_le 170 ea = cpu_to_le32(i->i_mode); 171 /* sick, but l 171 /* sick, but legal */ 172 hpfs_set_ea(i, 172 hpfs_set_ea(i, fnode, "MODE", (char *)&ea, 2); 173 hpfs_inode->i_ 173 hpfs_inode->i_ea_mode = 1; 174 } 174 } 175 if (S_ISBLK(i->i_mode) || S_IS 175 if (S_ISBLK(i->i_mode) || S_ISCHR(i->i_mode)) { 176 ea = cpu_to_le32(new_e 176 ea = cpu_to_le32(new_encode_dev(i->i_rdev)); 177 hpfs_set_ea(i, fnode, 177 hpfs_set_ea(i, fnode, "DEV", (char *)&ea, 4); 178 } 178 } 179 } 179 } 180 } 180 } 181 181 182 void hpfs_write_inode(struct inode *i) 182 void hpfs_write_inode(struct inode *i) 183 { 183 { 184 struct hpfs_inode_info *hpfs_inode = h 184 struct hpfs_inode_info *hpfs_inode = hpfs_i(i); 185 struct inode *parent; 185 struct inode *parent; 186 if (i->i_ino == hpfs_sb(i->i_sb)->sb_r 186 if (i->i_ino == hpfs_sb(i->i_sb)->sb_root) return; 187 if (hpfs_inode->i_rddir_off && !atomic 187 if (hpfs_inode->i_rddir_off && !atomic_read(&i->i_count)) { 188 if (*hpfs_inode->i_rddir_off) 188 if (*hpfs_inode->i_rddir_off) 189 pr_err("write_inode: s 189 pr_err("write_inode: some position still there\n"); 190 kfree(hpfs_inode->i_rddir_off) 190 kfree(hpfs_inode->i_rddir_off); 191 hpfs_inode->i_rddir_off = NULL 191 hpfs_inode->i_rddir_off = NULL; 192 } 192 } 193 if (!i->i_nlink) { 193 if (!i->i_nlink) { 194 return; 194 return; 195 } 195 } 196 parent = iget_locked(i->i_sb, hpfs_ino 196 parent = iget_locked(i->i_sb, hpfs_inode->i_parent_dir); 197 if (parent) { 197 if (parent) { 198 hpfs_inode->i_dirty = 0; 198 hpfs_inode->i_dirty = 0; 199 if (parent->i_state & I_NEW) { 199 if (parent->i_state & I_NEW) { 200 hpfs_init_inode(parent 200 hpfs_init_inode(parent); 201 hpfs_read_inode(parent 201 hpfs_read_inode(parent); 202 unlock_new_inode(paren 202 unlock_new_inode(parent); 203 } 203 } 204 hpfs_write_inode_nolock(i); 204 hpfs_write_inode_nolock(i); 205 iput(parent); 205 iput(parent); 206 } 206 } 207 } 207 } 208 208 209 void hpfs_write_inode_nolock(struct inode *i) 209 void hpfs_write_inode_nolock(struct inode *i) 210 { 210 { 211 struct hpfs_inode_info *hpfs_inode = h 211 struct hpfs_inode_info *hpfs_inode = hpfs_i(i); 212 struct buffer_head *bh; 212 struct buffer_head *bh; 213 struct fnode *fnode; 213 struct fnode *fnode; 214 struct quad_buffer_head qbh; 214 struct quad_buffer_head qbh; 215 struct hpfs_dirent *de; 215 struct hpfs_dirent *de; 216 if (i->i_ino == hpfs_sb(i->i_sb)->sb_r 216 if (i->i_ino == hpfs_sb(i->i_sb)->sb_root) return; 217 if (!(fnode = hpfs_map_fnode(i->i_sb, 217 if (!(fnode = hpfs_map_fnode(i->i_sb, i->i_ino, &bh))) return; 218 if (i->i_ino != hpfs_sb(i->i_sb)->sb_r 218 if (i->i_ino != hpfs_sb(i->i_sb)->sb_root && i->i_nlink) { 219 if (!(de = map_fnode_dirent(i- 219 if (!(de = map_fnode_dirent(i->i_sb, i->i_ino, fnode, &qbh))) { 220 brelse(bh); 220 brelse(bh); 221 return; 221 return; 222 } 222 } 223 } else de = NULL; 223 } else de = NULL; 224 if (S_ISREG(i->i_mode)) { 224 if (S_ISREG(i->i_mode)) { 225 fnode->file_size = cpu_to_le32 225 fnode->file_size = cpu_to_le32(i->i_size); 226 if (de) de->file_size = cpu_to 226 if (de) de->file_size = cpu_to_le32(i->i_size); 227 } else if (S_ISDIR(i->i_mode)) { 227 } else if (S_ISDIR(i->i_mode)) { 228 fnode->file_size = cpu_to_le32 228 fnode->file_size = cpu_to_le32(0); 229 if (de) de->file_size = cpu_to 229 if (de) de->file_size = cpu_to_le32(0); 230 } 230 } 231 hpfs_write_inode_ea(i, fnode); 231 hpfs_write_inode_ea(i, fnode); 232 if (de) { 232 if (de) { 233 de->write_date = cpu_to_le32(g !! 233 de->write_date = cpu_to_le32(gmt_to_local(i->i_sb, i->i_mtime.tv_sec)); 234 de->read_date = cpu_to_le32(gm !! 234 de->read_date = cpu_to_le32(gmt_to_local(i->i_sb, i->i_atime.tv_sec)); 235 de->creation_date = cpu_to_le3 !! 235 de->creation_date = cpu_to_le32(gmt_to_local(i->i_sb, i->i_ctime.tv_sec)); 236 de->read_only = !(i->i_mode & 236 de->read_only = !(i->i_mode & 0222); 237 de->ea_size = cpu_to_le32(hpfs 237 de->ea_size = cpu_to_le32(hpfs_inode->i_ea_size); 238 hpfs_mark_4buffers_dirty(&qbh) 238 hpfs_mark_4buffers_dirty(&qbh); 239 hpfs_brelse4(&qbh); 239 hpfs_brelse4(&qbh); 240 } 240 } 241 if (S_ISDIR(i->i_mode)) { 241 if (S_ISDIR(i->i_mode)) { 242 if ((de = map_dirent(i, hpfs_i 242 if ((de = map_dirent(i, hpfs_inode->i_dno, "\001\001", 2, NULL, &qbh))) { 243 de->write_date = cpu_t !! 243 de->write_date = cpu_to_le32(gmt_to_local(i->i_sb, i->i_mtime.tv_sec)); 244 de->read_date = cpu_to !! 244 de->read_date = cpu_to_le32(gmt_to_local(i->i_sb, i->i_atime.tv_sec)); 245 de->creation_date = cp !! 245 de->creation_date = cpu_to_le32(gmt_to_local(i->i_sb, i->i_ctime.tv_sec)); 246 de->read_only = !(i->i 246 de->read_only = !(i->i_mode & 0222); 247 de->ea_size = cpu_to_l 247 de->ea_size = cpu_to_le32(/*hpfs_inode->i_ea_size*/0); 248 de->file_size = cpu_to 248 de->file_size = cpu_to_le32(0); 249 hpfs_mark_4buffers_dir 249 hpfs_mark_4buffers_dirty(&qbh); 250 hpfs_brelse4(&qbh); 250 hpfs_brelse4(&qbh); 251 } else 251 } else 252 hpfs_error(i->i_sb, 252 hpfs_error(i->i_sb, 253 "directory %08 253 "directory %08lx doesn't have '.' entry", 254 (unsigned long 254 (unsigned long)i->i_ino); 255 } 255 } 256 mark_buffer_dirty(bh); 256 mark_buffer_dirty(bh); 257 brelse(bh); 257 brelse(bh); 258 } 258 } 259 259 260 int hpfs_setattr(struct mnt_idmap *idmap, stru !! 260 int hpfs_setattr(struct user_namespace *mnt_userns, struct dentry *dentry, 261 struct iattr *attr) 261 struct iattr *attr) 262 { 262 { 263 struct inode *inode = d_inode(dentry); 263 struct inode *inode = d_inode(dentry); 264 int error = -EINVAL; 264 int error = -EINVAL; 265 265 266 hpfs_lock(inode->i_sb); 266 hpfs_lock(inode->i_sb); 267 if (inode->i_ino == hpfs_sb(inode->i_s 267 if (inode->i_ino == hpfs_sb(inode->i_sb)->sb_root) 268 goto out_unlock; 268 goto out_unlock; 269 if ((attr->ia_valid & ATTR_UID) && 269 if ((attr->ia_valid & ATTR_UID) && 270 from_kuid(&init_user_ns, attr->ia_ 270 from_kuid(&init_user_ns, attr->ia_uid) >= 0x10000) 271 goto out_unlock; 271 goto out_unlock; 272 if ((attr->ia_valid & ATTR_GID) && 272 if ((attr->ia_valid & ATTR_GID) && 273 from_kgid(&init_user_ns, attr->ia_ 273 from_kgid(&init_user_ns, attr->ia_gid) >= 0x10000) 274 goto out_unlock; 274 goto out_unlock; 275 if ((attr->ia_valid & ATTR_SIZE) && at 275 if ((attr->ia_valid & ATTR_SIZE) && attr->ia_size > inode->i_size) 276 goto out_unlock; 276 goto out_unlock; 277 277 278 error = setattr_prepare(&nop_mnt_idmap !! 278 error = setattr_prepare(&init_user_ns, dentry, attr); 279 if (error) 279 if (error) 280 goto out_unlock; 280 goto out_unlock; 281 281 282 if ((attr->ia_valid & ATTR_SIZE) && 282 if ((attr->ia_valid & ATTR_SIZE) && 283 attr->ia_size != i_size_read(inode 283 attr->ia_size != i_size_read(inode)) { 284 error = inode_newsize_ok(inode 284 error = inode_newsize_ok(inode, attr->ia_size); 285 if (error) 285 if (error) 286 goto out_unlock; 286 goto out_unlock; 287 287 288 truncate_setsize(inode, attr-> 288 truncate_setsize(inode, attr->ia_size); 289 hpfs_truncate(inode); 289 hpfs_truncate(inode); 290 } 290 } 291 291 292 setattr_copy(&nop_mnt_idmap, inode, at !! 292 setattr_copy(&init_user_ns, inode, attr); 293 293 294 hpfs_write_inode(inode); 294 hpfs_write_inode(inode); 295 295 296 out_unlock: 296 out_unlock: 297 hpfs_unlock(inode->i_sb); 297 hpfs_unlock(inode->i_sb); 298 return error; 298 return error; 299 } 299 } 300 300 301 void hpfs_write_if_changed(struct inode *inode 301 void hpfs_write_if_changed(struct inode *inode) 302 { 302 { 303 struct hpfs_inode_info *hpfs_inode = h 303 struct hpfs_inode_info *hpfs_inode = hpfs_i(inode); 304 304 305 if (hpfs_inode->i_dirty) 305 if (hpfs_inode->i_dirty) 306 hpfs_write_inode(inode); 306 hpfs_write_inode(inode); 307 } 307 } 308 308 309 void hpfs_evict_inode(struct inode *inode) 309 void hpfs_evict_inode(struct inode *inode) 310 { 310 { 311 truncate_inode_pages_final(&inode->i_d 311 truncate_inode_pages_final(&inode->i_data); 312 clear_inode(inode); 312 clear_inode(inode); 313 if (!inode->i_nlink) { 313 if (!inode->i_nlink) { 314 hpfs_lock(inode->i_sb); 314 hpfs_lock(inode->i_sb); 315 hpfs_remove_fnode(inode->i_sb, 315 hpfs_remove_fnode(inode->i_sb, inode->i_ino); 316 hpfs_unlock(inode->i_sb); 316 hpfs_unlock(inode->i_sb); 317 } 317 } 318 } 318 } 319 319
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.