Blame view
fs/hpfs/inode.c
8.57 KB
1da177e4c Linux-2.6.12-rc2 |
1 2 3 4 5 6 7 |
/* * linux/fs/hpfs/inode.c * * Mikulas Patocka (mikulas@artax.karlin.mff.cuni.cz), 1998-1999 * * inode VFS functions */ |
5a0e3ad6a include cleanup: ... |
8 |
#include <linux/slab.h> |
1da177e4c Linux-2.6.12-rc2 |
9 10 11 12 13 14 15 16 17 18 |
#include "hpfs_fn.h" void hpfs_init_inode(struct inode *i) { struct super_block *sb = i->i_sb; struct hpfs_inode_info *hpfs_inode = hpfs_i(i); i->i_uid = hpfs_sb(sb)->sb_uid; i->i_gid = hpfs_sb(sb)->sb_gid; i->i_mode = hpfs_sb(sb)->sb_mode; |
1da177e4c Linux-2.6.12-rc2 |
19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
i->i_size = -1; i->i_blocks = -1; hpfs_inode->i_dno = 0; hpfs_inode->i_n_secs = 0; hpfs_inode->i_file_sec = 0; hpfs_inode->i_disk_sec = 0; hpfs_inode->i_dpos = 0; hpfs_inode->i_dsubdno = 0; hpfs_inode->i_ea_mode = 0; hpfs_inode->i_ea_uid = 0; hpfs_inode->i_ea_gid = 0; hpfs_inode->i_ea_size = 0; hpfs_inode->i_rddir_off = NULL; hpfs_inode->i_dirty = 0; i->i_ctime.tv_sec = i->i_ctime.tv_nsec = 0; i->i_mtime.tv_sec = i->i_mtime.tv_nsec = 0; i->i_atime.tv_sec = i->i_atime.tv_nsec = 0; } void hpfs_read_inode(struct inode *i) { struct buffer_head *bh; struct fnode *fnode; struct super_block *sb = i->i_sb; struct hpfs_inode_info *hpfs_inode = hpfs_i(i); |
7e7742ee0 sanitize signedne... |
47 |
void *ea; |
1da177e4c Linux-2.6.12-rc2 |
48 49 50 51 52 53 54 |
int ea_size; if (!(fnode = hpfs_map_fnode(sb, i->i_ino, &bh))) { /*i->i_mode |= S_IFREG; i->i_mode &= ~0111; i->i_op = &hpfs_file_iops; i->i_fop = &hpfs_file_ops; |
6d6b77f16 filesystems: add ... |
55 |
clear_nlink(i);*/ |
1da177e4c Linux-2.6.12-rc2 |
56 57 58 59 60 61 |
make_bad_inode(i); return; } if (hpfs_sb(i->i_sb)->sb_eas) { if ((ea = hpfs_get_ea(i->i_sb, fnode, "UID", &ea_size))) { if (ea_size == 2) { |
2ef103128 [PATCH] hpfs endi... |
62 |
i->i_uid = le16_to_cpu(*(__le16*)ea); |
1da177e4c Linux-2.6.12-rc2 |
63 64 65 66 67 68 |
hpfs_inode->i_ea_uid = 1; } kfree(ea); } if ((ea = hpfs_get_ea(i->i_sb, fnode, "GID", &ea_size))) { if (ea_size == 2) { |
2ef103128 [PATCH] hpfs endi... |
69 |
i->i_gid = le16_to_cpu(*(__le16*)ea); |
1da177e4c Linux-2.6.12-rc2 |
70 71 72 73 74 75 76 77 78 |
hpfs_inode->i_ea_gid = 1; } kfree(ea); } if ((ea = hpfs_get_ea(i->i_sb, fnode, "SYMLINK", &ea_size))) { kfree(ea); i->i_mode = S_IFLNK | 0777; i->i_op = &page_symlink_inode_operations; i->i_data.a_ops = &hpfs_symlink_aops; |
bfe868486 filesystems: add ... |
79 |
set_nlink(i, 1); |
1da177e4c Linux-2.6.12-rc2 |
80 81 82 83 84 85 86 87 88 |
i->i_size = ea_size; i->i_blocks = 1; brelse(bh); return; } if ((ea = hpfs_get_ea(i->i_sb, fnode, "MODE", &ea_size))) { int rdev = 0; umode_t mode = hpfs_sb(sb)->sb_mode; if (ea_size == 2) { |
2ef103128 [PATCH] hpfs endi... |
89 |
mode = le16_to_cpu(*(__le16*)ea); |
1da177e4c Linux-2.6.12-rc2 |
90 91 92 93 94 95 96 |
hpfs_inode->i_ea_mode = 1; } kfree(ea); i->i_mode = mode; if (S_ISBLK(mode) || S_ISCHR(mode)) { if ((ea = hpfs_get_ea(i->i_sb, fnode, "DEV", &ea_size))) { if (ea_size == 4) |
2ef103128 [PATCH] hpfs endi... |
97 |
rdev = le32_to_cpu(*(__le32*)ea); |
1da177e4c Linux-2.6.12-rc2 |
98 99 100 101 102 |
kfree(ea); } } if (S_ISBLK(mode) || S_ISCHR(mode) || S_ISFIFO(mode) || S_ISSOCK(mode)) { brelse(bh); |
bfe868486 filesystems: add ... |
103 |
set_nlink(i, 1); |
1da177e4c Linux-2.6.12-rc2 |
104 105 106 107 108 109 110 111 112 |
i->i_size = 0; i->i_blocks = 1; init_special_inode(i, mode, new_decode_dev(rdev)); return; } } } if (fnode->dirflag) { |
7e7742ee0 sanitize signedne... |
113 |
int n_dnodes, n_subdirs; |
1da177e4c Linux-2.6.12-rc2 |
114 115 116 |
i->i_mode |= S_IFDIR; i->i_op = &hpfs_dir_iops; i->i_fop = &hpfs_dir_ops; |
0b69760be HPFS: Fix endiani... |
117 118 |
hpfs_inode->i_parent_dir = le32_to_cpu(fnode->up); hpfs_inode->i_dno = le32_to_cpu(fnode->u.external[0].disk_secno); |
1da177e4c Linux-2.6.12-rc2 |
119 120 121 122 123 124 125 126 |
if (hpfs_sb(sb)->sb_chk >= 2) { struct buffer_head *bh0; if (hpfs_map_fnode(sb, hpfs_inode->i_parent_dir, &bh0)) brelse(bh0); } n_dnodes = 0; n_subdirs = 0; hpfs_count_dnodes(i->i_sb, hpfs_inode->i_dno, &n_dnodes, &n_subdirs, NULL); i->i_blocks = 4 * n_dnodes; i->i_size = 2048 * n_dnodes; |
bfe868486 filesystems: add ... |
127 |
set_nlink(i, 2 + n_subdirs); |
1da177e4c Linux-2.6.12-rc2 |
128 129 130 131 132 |
} else { i->i_mode |= S_IFREG; if (!hpfs_inode->i_ea_mode) i->i_mode &= ~0111; i->i_op = &hpfs_file_iops; i->i_fop = &hpfs_file_ops; |
bfe868486 filesystems: add ... |
133 |
set_nlink(i, 1); |
0b69760be HPFS: Fix endiani... |
134 |
i->i_size = le32_to_cpu(fnode->file_size); |
1da177e4c Linux-2.6.12-rc2 |
135 136 137 138 139 140 141 142 143 144 |
i->i_blocks = ((i->i_size + 511) >> 9) + 1; i->i_data.a_ops = &hpfs_aops; hpfs_i(i)->mmu_private = i->i_size; } brelse(bh); } static void hpfs_write_inode_ea(struct inode *i, struct fnode *fnode) { struct hpfs_inode_info *hpfs_inode = hpfs_i(i); |
0b69760be HPFS: Fix endiani... |
145 |
/*if (le32_to_cpu(fnode->acl_size_l) || le16_to_cpu(fnode->acl_size_s)) { |
1da177e4c Linux-2.6.12-rc2 |
146 147 148 149 |
Some unknown structures like ACL may be in fnode, we'd better not overwrite them hpfs_error(i->i_sb, "fnode %08x has some unknown HPFS386 stuctures", i->i_ino); } else*/ if (hpfs_sb(i->i_sb)->sb_eas >= 2) { |
2ef103128 [PATCH] hpfs endi... |
150 |
__le32 ea; |
1da177e4c Linux-2.6.12-rc2 |
151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 |
if ((i->i_uid != hpfs_sb(i->i_sb)->sb_uid) || hpfs_inode->i_ea_uid) { ea = cpu_to_le32(i->i_uid); hpfs_set_ea(i, fnode, "UID", (char*)&ea, 2); hpfs_inode->i_ea_uid = 1; } if ((i->i_gid != hpfs_sb(i->i_sb)->sb_gid) || hpfs_inode->i_ea_gid) { ea = cpu_to_le32(i->i_gid); hpfs_set_ea(i, fnode, "GID", (char *)&ea, 2); hpfs_inode->i_ea_gid = 1; } if (!S_ISLNK(i->i_mode)) if ((i->i_mode != ((hpfs_sb(i->i_sb)->sb_mode & ~(S_ISDIR(i->i_mode) ? 0 : 0111)) | (S_ISDIR(i->i_mode) ? S_IFDIR : S_IFREG)) && i->i_mode != ((hpfs_sb(i->i_sb)->sb_mode & ~(S_ISDIR(i->i_mode) ? 0222 : 0333)) | (S_ISDIR(i->i_mode) ? S_IFDIR : S_IFREG))) || hpfs_inode->i_ea_mode) { ea = cpu_to_le32(i->i_mode); |
2ef103128 [PATCH] hpfs endi... |
167 |
/* sick, but legal */ |
1da177e4c Linux-2.6.12-rc2 |
168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 |
hpfs_set_ea(i, fnode, "MODE", (char *)&ea, 2); hpfs_inode->i_ea_mode = 1; } if (S_ISBLK(i->i_mode) || S_ISCHR(i->i_mode)) { ea = cpu_to_le32(new_encode_dev(i->i_rdev)); hpfs_set_ea(i, fnode, "DEV", (char *)&ea, 4); } } } void hpfs_write_inode(struct inode *i) { struct hpfs_inode_info *hpfs_inode = hpfs_i(i); struct inode *parent; if (i->i_ino == hpfs_sb(i->i_sb)->sb_root) return; if (hpfs_inode->i_rddir_off && !atomic_read(&i->i_count)) { if (*hpfs_inode->i_rddir_off) printk("HPFS: write_inode: some position still there "); kfree(hpfs_inode->i_rddir_off); hpfs_inode->i_rddir_off = NULL; } |
1da177e4c Linux-2.6.12-rc2 |
189 |
if (!i->i_nlink) { |
1da177e4c Linux-2.6.12-rc2 |
190 191 192 193 194 195 196 197 198 199 |
return; } parent = iget_locked(i->i_sb, hpfs_inode->i_parent_dir); if (parent) { hpfs_inode->i_dirty = 0; if (parent->i_state & I_NEW) { hpfs_init_inode(parent); hpfs_read_inode(parent); unlock_new_inode(parent); } |
1da177e4c Linux-2.6.12-rc2 |
200 |
hpfs_write_inode_nolock(i); |
1da177e4c Linux-2.6.12-rc2 |
201 |
iput(parent); |
1da177e4c Linux-2.6.12-rc2 |
202 |
} |
1da177e4c Linux-2.6.12-rc2 |
203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 |
} void hpfs_write_inode_nolock(struct inode *i) { struct hpfs_inode_info *hpfs_inode = hpfs_i(i); struct buffer_head *bh; struct fnode *fnode; struct quad_buffer_head qbh; struct hpfs_dirent *de; if (i->i_ino == hpfs_sb(i->i_sb)->sb_root) return; if (!(fnode = hpfs_map_fnode(i->i_sb, i->i_ino, &bh))) return; if (i->i_ino != hpfs_sb(i->i_sb)->sb_root && i->i_nlink) { if (!(de = map_fnode_dirent(i->i_sb, i->i_ino, fnode, &qbh))) { brelse(bh); return; } } else de = NULL; if (S_ISREG(i->i_mode)) { |
0b69760be HPFS: Fix endiani... |
221 222 |
fnode->file_size = cpu_to_le32(i->i_size); if (de) de->file_size = cpu_to_le32(i->i_size); |
1da177e4c Linux-2.6.12-rc2 |
223 |
} else if (S_ISDIR(i->i_mode)) { |
0b69760be HPFS: Fix endiani... |
224 225 |
fnode->file_size = cpu_to_le32(0); if (de) de->file_size = cpu_to_le32(0); |
1da177e4c Linux-2.6.12-rc2 |
226 227 228 |
} hpfs_write_inode_ea(i, fnode); if (de) { |
0b69760be HPFS: Fix endiani... |
229 230 231 |
de->write_date = cpu_to_le32(gmt_to_local(i->i_sb, i->i_mtime.tv_sec)); de->read_date = cpu_to_le32(gmt_to_local(i->i_sb, i->i_atime.tv_sec)); de->creation_date = cpu_to_le32(gmt_to_local(i->i_sb, i->i_ctime.tv_sec)); |
1da177e4c Linux-2.6.12-rc2 |
232 |
de->read_only = !(i->i_mode & 0222); |
0b69760be HPFS: Fix endiani... |
233 |
de->ea_size = cpu_to_le32(hpfs_inode->i_ea_size); |
1da177e4c Linux-2.6.12-rc2 |
234 235 236 237 238 |
hpfs_mark_4buffers_dirty(&qbh); hpfs_brelse4(&qbh); } if (S_ISDIR(i->i_mode)) { if ((de = map_dirent(i, hpfs_inode->i_dno, "\001\001", 2, NULL, &qbh))) { |
0b69760be HPFS: Fix endiani... |
239 240 241 |
de->write_date = cpu_to_le32(gmt_to_local(i->i_sb, i->i_mtime.tv_sec)); de->read_date = cpu_to_le32(gmt_to_local(i->i_sb, i->i_atime.tv_sec)); de->creation_date = cpu_to_le32(gmt_to_local(i->i_sb, i->i_ctime.tv_sec)); |
1da177e4c Linux-2.6.12-rc2 |
242 |
de->read_only = !(i->i_mode & 0222); |
0b69760be HPFS: Fix endiani... |
243 244 |
de->ea_size = cpu_to_le32(/*hpfs_inode->i_ea_size*/0); de->file_size = cpu_to_le32(0); |
1da177e4c Linux-2.6.12-rc2 |
245 246 |
hpfs_mark_4buffers_dirty(&qbh); hpfs_brelse4(&qbh); |
18debbbcc [PATCH] hpfs: fix... |
247 248 249 250 |
} else hpfs_error(i->i_sb, "directory %08lx doesn't have '.' entry", (unsigned long)i->i_ino); |
1da177e4c Linux-2.6.12-rc2 |
251 252 253 254 |
} mark_buffer_dirty(bh); brelse(bh); } |
ca30bc995 [PATCH] hpfs: cle... |
255 |
int hpfs_setattr(struct dentry *dentry, struct iattr *attr) |
1da177e4c Linux-2.6.12-rc2 |
256 257 |
{ struct inode *inode = dentry->d_inode; |
ca30bc995 [PATCH] hpfs: cle... |
258 |
int error = -EINVAL; |
9a311b96c hpfs: remove the BKL |
259 |
hpfs_lock(inode->i_sb); |
ca30bc995 [PATCH] hpfs: cle... |
260 261 |
if (inode->i_ino == hpfs_sb(inode->i_sb)->sb_root) goto out_unlock; |
48f10e8ce HPFS: Restrict ui... |
262 263 264 265 |
if ((attr->ia_valid & ATTR_UID) && attr->ia_uid >= 0x10000) goto out_unlock; if ((attr->ia_valid & ATTR_GID) && attr->ia_gid >= 0x10000) goto out_unlock; |
ca30bc995 [PATCH] hpfs: cle... |
266 267 268 269 270 271 |
if ((attr->ia_valid & ATTR_SIZE) && attr->ia_size > inode->i_size) goto out_unlock; error = inode_change_ok(inode, attr); if (error) goto out_unlock; |
1025774ce remove inode_setattr |
272 273 274 275 |
if ((attr->ia_valid & ATTR_SIZE) && attr->ia_size != i_size_read(inode)) { error = vmtruncate(inode, attr->ia_size); if (error) |
274052ef0 hpfs_setattr erro... |
276 |
goto out_unlock; |
1025774ce remove inode_setattr |
277 278 279 |
} setattr_copy(inode, attr); |
ca30bc995 [PATCH] hpfs: cle... |
280 281 282 283 |
hpfs_write_inode(inode); out_unlock: |
9a311b96c hpfs: remove the BKL |
284 |
hpfs_unlock(inode->i_sb); |
1da177e4c Linux-2.6.12-rc2 |
285 286 287 288 289 290 291 292 293 294 |
return error; } void hpfs_write_if_changed(struct inode *inode) { struct hpfs_inode_info *hpfs_inode = hpfs_i(inode); if (hpfs_inode->i_dirty) hpfs_write_inode(inode); } |
ea5440092 switch hpfs to ->... |
295 |
void hpfs_evict_inode(struct inode *inode) |
1da177e4c Linux-2.6.12-rc2 |
296 |
{ |
fef266580 [PATCH] update fi... |
297 |
truncate_inode_pages(&inode->i_data, 0); |
ea5440092 switch hpfs to ->... |
298 299 |
end_writeback(inode); if (!inode->i_nlink) { |
9a311b96c hpfs: remove the BKL |
300 |
hpfs_lock(inode->i_sb); |
ea5440092 switch hpfs to ->... |
301 |
hpfs_remove_fnode(inode->i_sb, inode->i_ino); |
9a311b96c hpfs: remove the BKL |
302 |
hpfs_unlock(inode->i_sb); |
ea5440092 switch hpfs to ->... |
303 |
} |
1da177e4c Linux-2.6.12-rc2 |
304 |
} |