.. | .. |
---|
28 | 28 | nid_t ino; |
---|
29 | 29 | struct inode *inode; |
---|
30 | 30 | bool nid_free = false; |
---|
| 31 | + bool encrypt = false; |
---|
31 | 32 | int xattr_size = 0; |
---|
32 | 33 | int err; |
---|
33 | 34 | |
---|
.. | .. |
---|
69 | 70 | F2FS_I(inode)->i_projid = make_kprojid(&init_user_ns, |
---|
70 | 71 | F2FS_DEF_PROJID); |
---|
71 | 72 | |
---|
| 73 | + err = fscrypt_prepare_new_inode(dir, inode, &encrypt); |
---|
| 74 | + if (err) |
---|
| 75 | + goto fail_drop; |
---|
| 76 | + |
---|
72 | 77 | err = dquot_initialize(inode); |
---|
73 | 78 | if (err) |
---|
74 | 79 | goto fail_drop; |
---|
75 | 80 | |
---|
76 | 81 | set_inode_flag(inode, FI_NEW_INODE); |
---|
77 | 82 | |
---|
78 | | - if (f2fs_may_encrypt(dir, inode)) |
---|
| 83 | + if (encrypt) |
---|
79 | 84 | f2fs_set_encrypted_inode(inode); |
---|
80 | 85 | |
---|
81 | 86 | if (f2fs_sb_has_extra_attr(sbi)) { |
---|
.. | .. |
---|
86 | 91 | if (test_opt(sbi, INLINE_XATTR)) |
---|
87 | 92 | set_inode_flag(inode, FI_INLINE_XATTR); |
---|
88 | 93 | |
---|
89 | | - if (test_opt(sbi, INLINE_DATA) && f2fs_may_inline_data(inode)) |
---|
90 | | - set_inode_flag(inode, FI_INLINE_DATA); |
---|
91 | 94 | if (f2fs_may_inline_dentry(inode)) |
---|
92 | 95 | set_inode_flag(inode, FI_INLINE_DENTRY); |
---|
93 | 96 | |
---|
.. | .. |
---|
101 | 104 | xattr_size = DEFAULT_INLINE_XATTR_ADDRS; |
---|
102 | 105 | } |
---|
103 | 106 | F2FS_I(inode)->i_inline_xattr_size = xattr_size; |
---|
104 | | - |
---|
105 | | - f2fs_init_extent_tree(inode, NULL); |
---|
106 | | - |
---|
107 | | - stat_inc_inline_xattr(inode); |
---|
108 | | - stat_inc_inline_inode(inode); |
---|
109 | | - stat_inc_inline_dir(inode); |
---|
110 | 107 | |
---|
111 | 108 | F2FS_I(inode)->i_flags = |
---|
112 | 109 | f2fs_mask_flags(mode, F2FS_I(dir)->i_flags & F2FS_FL_INHERITED); |
---|
.. | .. |
---|
124 | 121 | set_compress_context(inode); |
---|
125 | 122 | } |
---|
126 | 123 | |
---|
| 124 | + /* Should enable inline_data after compression set */ |
---|
| 125 | + if (test_opt(sbi, INLINE_DATA) && f2fs_may_inline_data(inode)) |
---|
| 126 | + set_inode_flag(inode, FI_INLINE_DATA); |
---|
| 127 | + |
---|
| 128 | + stat_inc_inline_xattr(inode); |
---|
| 129 | + stat_inc_inline_inode(inode); |
---|
| 130 | + stat_inc_inline_dir(inode); |
---|
| 131 | + |
---|
127 | 132 | f2fs_set_inode_flags(inode); |
---|
| 133 | + |
---|
| 134 | + f2fs_init_extent_tree(inode); |
---|
128 | 135 | |
---|
129 | 136 | trace_f2fs_new_inode(inode, 0); |
---|
130 | 137 | return inode; |
---|
.. | .. |
---|
148 | 155 | return ERR_PTR(err); |
---|
149 | 156 | } |
---|
150 | 157 | |
---|
151 | | -static inline int is_extension_exist(const unsigned char *s, const char *sub) |
---|
| 158 | +static inline int is_extension_exist(const unsigned char *s, const char *sub, |
---|
| 159 | + bool tmp_ext) |
---|
152 | 160 | { |
---|
153 | 161 | size_t slen = strlen(s); |
---|
154 | 162 | size_t sublen = strlen(sub); |
---|
.. | .. |
---|
163 | 171 | */ |
---|
164 | 172 | if (slen < sublen + 2) |
---|
165 | 173 | return 0; |
---|
| 174 | + |
---|
| 175 | + if (!tmp_ext) { |
---|
| 176 | + /* file has no temp extension */ |
---|
| 177 | + if (s[slen - sublen - 1] != '.') |
---|
| 178 | + return 0; |
---|
| 179 | + return !strncasecmp(s + slen - sublen, sub, sublen); |
---|
| 180 | + } |
---|
166 | 181 | |
---|
167 | 182 | for (i = 1; i < slen - sublen; i++) { |
---|
168 | 183 | if (s[i] != '.') |
---|
.. | .. |
---|
183 | 198 | __u8 (*extlist)[F2FS_EXTENSION_LEN] = sbi->raw_super->extension_list; |
---|
184 | 199 | int i, cold_count, hot_count; |
---|
185 | 200 | |
---|
186 | | - down_read(&sbi->sb_lock); |
---|
| 201 | + f2fs_down_read(&sbi->sb_lock); |
---|
187 | 202 | |
---|
188 | 203 | cold_count = le32_to_cpu(sbi->raw_super->extension_count); |
---|
189 | 204 | hot_count = sbi->raw_super->hot_ext_count; |
---|
190 | 205 | |
---|
191 | 206 | for (i = 0; i < cold_count + hot_count; i++) { |
---|
192 | | - if (is_extension_exist(name, extlist[i])) |
---|
| 207 | + if (is_extension_exist(name, extlist[i], true)) |
---|
193 | 208 | break; |
---|
194 | 209 | } |
---|
195 | 210 | |
---|
196 | | - up_read(&sbi->sb_lock); |
---|
| 211 | + f2fs_up_read(&sbi->sb_lock); |
---|
197 | 212 | |
---|
198 | 213 | if (i == cold_count + hot_count) |
---|
199 | 214 | return; |
---|
.. | .. |
---|
284 | 299 | !f2fs_may_compress(inode)) |
---|
285 | 300 | return; |
---|
286 | 301 | |
---|
287 | | - down_read(&sbi->sb_lock); |
---|
| 302 | + f2fs_down_read(&sbi->sb_lock); |
---|
288 | 303 | |
---|
289 | 304 | cold_count = le32_to_cpu(sbi->raw_super->extension_count); |
---|
290 | 305 | hot_count = sbi->raw_super->hot_ext_count; |
---|
291 | 306 | |
---|
292 | 307 | for (i = cold_count; i < cold_count + hot_count; i++) { |
---|
293 | | - if (is_extension_exist(name, extlist[i])) { |
---|
294 | | - up_read(&sbi->sb_lock); |
---|
| 308 | + if (is_extension_exist(name, extlist[i], false)) { |
---|
| 309 | + f2fs_up_read(&sbi->sb_lock); |
---|
295 | 310 | return; |
---|
296 | 311 | } |
---|
297 | 312 | } |
---|
298 | 313 | |
---|
299 | | - up_read(&sbi->sb_lock); |
---|
| 314 | + f2fs_up_read(&sbi->sb_lock); |
---|
300 | 315 | |
---|
301 | 316 | ext = F2FS_OPTION(sbi).extensions; |
---|
302 | 317 | |
---|
303 | 318 | for (i = 0; i < ext_cnt; i++) { |
---|
304 | | - if (!is_extension_exist(name, ext[i])) |
---|
| 319 | + if (!is_extension_exist(name, ext[i], false)) |
---|
305 | 320 | continue; |
---|
306 | 321 | |
---|
| 322 | + /* Do not use inline_data with compression */ |
---|
| 323 | + stat_dec_inline_inode(inode); |
---|
| 324 | + clear_inode_flag(inode, FI_INLINE_DATA); |
---|
307 | 325 | set_compress_context(inode); |
---|
308 | 326 | return; |
---|
309 | 327 | } |
---|
.. | .. |
---|
414 | 432 | struct qstr dotdot = QSTR_INIT("..", 2); |
---|
415 | 433 | struct page *page; |
---|
416 | 434 | unsigned long ino = f2fs_inode_by_name(d_inode(child), &dotdot, &page); |
---|
| 435 | + |
---|
417 | 436 | if (!ino) { |
---|
418 | 437 | if (IS_ERR(page)) |
---|
419 | 438 | return ERR_CAST(page); |
---|
.. | .. |
---|
492 | 511 | } |
---|
493 | 512 | |
---|
494 | 513 | err = f2fs_prepare_lookup(dir, dentry, &fname); |
---|
495 | | - generic_set_encrypted_ci_d_ops(dir, dentry); |
---|
| 514 | + generic_set_encrypted_ci_d_ops(dentry); |
---|
496 | 515 | if (err == -ENOENT) |
---|
497 | 516 | goto out_splice; |
---|
498 | 517 | if (err) |
---|
.. | .. |
---|
570 | 589 | |
---|
571 | 590 | trace_f2fs_unlink_enter(dir, dentry); |
---|
572 | 591 | |
---|
573 | | - if (unlikely(f2fs_cp_error(sbi))) |
---|
574 | | - return -EIO; |
---|
| 592 | + if (unlikely(f2fs_cp_error(sbi))) { |
---|
| 593 | + err = -EIO; |
---|
| 594 | + goto fail; |
---|
| 595 | + } |
---|
575 | 596 | |
---|
576 | 597 | err = dquot_initialize(dir); |
---|
577 | 598 | if (err) |
---|
578 | | - return err; |
---|
| 599 | + goto fail; |
---|
579 | 600 | err = dquot_initialize(inode); |
---|
580 | 601 | if (err) |
---|
581 | | - return err; |
---|
| 602 | + goto fail; |
---|
582 | 603 | |
---|
583 | 604 | de = f2fs_find_entry(dir, &dentry->d_name, &page); |
---|
584 | 605 | if (!de) { |
---|
.. | .. |
---|
597 | 618 | goto fail; |
---|
598 | 619 | } |
---|
599 | 620 | f2fs_delete_entry(de, page, dir, inode); |
---|
| 621 | + f2fs_unlock_op(sbi); |
---|
| 622 | + |
---|
600 | 623 | #ifdef CONFIG_UNICODE |
---|
601 | 624 | /* VFS negative dentries are incompatible with Encoding and |
---|
602 | 625 | * Case-insensitiveness. Eventually we'll want avoid |
---|
603 | 626 | * invalidating the dentries here, alongside with returning the |
---|
604 | | - * negative dentries at f2fs_lookup(), when it is better |
---|
| 627 | + * negative dentries at f2fs_lookup(), when it is better |
---|
605 | 628 | * supported by the VFS for the CI case. |
---|
606 | 629 | */ |
---|
607 | 630 | if (IS_CASEFOLDED(dir)) |
---|
608 | 631 | d_invalidate(dentry); |
---|
609 | 632 | #endif |
---|
610 | | - f2fs_unlock_op(sbi); |
---|
611 | | - |
---|
612 | 633 | if (IS_DIRSYNC(dir)) |
---|
613 | 634 | f2fs_sync_fs(sbi->sb, 1); |
---|
614 | 635 | fail: |
---|
.. | .. |
---|
621 | 642 | struct delayed_call *done) |
---|
622 | 643 | { |
---|
623 | 644 | const char *link = page_get_link(dentry, inode, done); |
---|
| 645 | + |
---|
624 | 646 | if (!IS_ERR(link) && !*link) { |
---|
625 | 647 | /* this is broken symlink case */ |
---|
626 | 648 | do_delayed_call(done); |
---|
.. | .. |
---|
706 | 728 | f2fs_handle_failed_inode(inode); |
---|
707 | 729 | out_free_encrypted_link: |
---|
708 | 730 | if (disk_link.name != (unsigned char *)symname) |
---|
709 | | - kvfree(disk_link.name); |
---|
| 731 | + kfree(disk_link.name); |
---|
710 | 732 | return err; |
---|
711 | 733 | } |
---|
712 | 734 | |
---|
.. | .. |
---|
758 | 780 | static int f2fs_rmdir(struct inode *dir, struct dentry *dentry) |
---|
759 | 781 | { |
---|
760 | 782 | struct inode *inode = d_inode(dentry); |
---|
| 783 | + |
---|
761 | 784 | if (f2fs_empty_dir(inode)) |
---|
762 | 785 | return f2fs_unlink(dir, dentry); |
---|
763 | 786 | return -ENOTEMPTY; |
---|
.. | .. |
---|
994 | 1017 | new_page = NULL; |
---|
995 | 1018 | |
---|
996 | 1019 | new_inode->i_ctime = current_time(new_inode); |
---|
997 | | - down_write(&F2FS_I(new_inode)->i_sem); |
---|
| 1020 | + f2fs_down_write(&F2FS_I(new_inode)->i_sem); |
---|
998 | 1021 | if (old_dir_entry) |
---|
999 | 1022 | f2fs_i_links_write(new_inode, false); |
---|
1000 | 1023 | f2fs_i_links_write(new_inode, false); |
---|
1001 | | - up_write(&F2FS_I(new_inode)->i_sem); |
---|
| 1024 | + f2fs_up_write(&F2FS_I(new_inode)->i_sem); |
---|
1002 | 1025 | |
---|
1003 | 1026 | if (!new_inode->i_nlink) |
---|
1004 | 1027 | f2fs_add_orphan_inode(new_inode); |
---|
.. | .. |
---|
1019 | 1042 | f2fs_i_links_write(new_dir, true); |
---|
1020 | 1043 | } |
---|
1021 | 1044 | |
---|
1022 | | - down_write(&F2FS_I(old_inode)->i_sem); |
---|
| 1045 | + f2fs_down_write(&F2FS_I(old_inode)->i_sem); |
---|
1023 | 1046 | if (!old_dir_entry || whiteout) |
---|
1024 | 1047 | file_lost_pino(old_inode); |
---|
1025 | 1048 | else |
---|
1026 | 1049 | /* adjust dir's i_pino to pass fsck check */ |
---|
1027 | 1050 | f2fs_i_pino_write(old_inode, new_dir->i_ino); |
---|
1028 | | - up_write(&F2FS_I(old_inode)->i_sem); |
---|
| 1051 | + f2fs_up_write(&F2FS_I(old_inode)->i_sem); |
---|
1029 | 1052 | |
---|
1030 | 1053 | old_inode->i_ctime = current_time(old_inode); |
---|
1031 | 1054 | f2fs_mark_inode_dirty_sync(old_inode, false); |
---|
.. | .. |
---|
1185 | 1208 | /* update directory entry info of old dir inode */ |
---|
1186 | 1209 | f2fs_set_link(old_dir, old_entry, old_page, new_inode); |
---|
1187 | 1210 | |
---|
1188 | | - down_write(&F2FS_I(old_inode)->i_sem); |
---|
| 1211 | + f2fs_down_write(&F2FS_I(old_inode)->i_sem); |
---|
1189 | 1212 | if (!old_dir_entry) |
---|
1190 | 1213 | file_lost_pino(old_inode); |
---|
1191 | 1214 | else |
---|
1192 | 1215 | /* adjust dir's i_pino to pass fsck check */ |
---|
1193 | 1216 | f2fs_i_pino_write(old_inode, new_dir->i_ino); |
---|
1194 | | - up_write(&F2FS_I(old_inode)->i_sem); |
---|
| 1217 | + f2fs_up_write(&F2FS_I(old_inode)->i_sem); |
---|
1195 | 1218 | |
---|
1196 | 1219 | old_dir->i_ctime = current_time(old_dir); |
---|
1197 | 1220 | if (old_nlink) { |
---|
1198 | | - down_write(&F2FS_I(old_dir)->i_sem); |
---|
| 1221 | + f2fs_down_write(&F2FS_I(old_dir)->i_sem); |
---|
1199 | 1222 | f2fs_i_links_write(old_dir, old_nlink > 0); |
---|
1200 | | - up_write(&F2FS_I(old_dir)->i_sem); |
---|
| 1223 | + f2fs_up_write(&F2FS_I(old_dir)->i_sem); |
---|
1201 | 1224 | } |
---|
1202 | 1225 | f2fs_mark_inode_dirty_sync(old_dir, false); |
---|
1203 | 1226 | |
---|
1204 | 1227 | /* update directory entry info of new dir inode */ |
---|
1205 | 1228 | f2fs_set_link(new_dir, new_entry, new_page, old_inode); |
---|
1206 | 1229 | |
---|
1207 | | - down_write(&F2FS_I(new_inode)->i_sem); |
---|
| 1230 | + f2fs_down_write(&F2FS_I(new_inode)->i_sem); |
---|
1208 | 1231 | if (!new_dir_entry) |
---|
1209 | 1232 | file_lost_pino(new_inode); |
---|
1210 | 1233 | else |
---|
1211 | 1234 | /* adjust dir's i_pino to pass fsck check */ |
---|
1212 | 1235 | f2fs_i_pino_write(new_inode, old_dir->i_ino); |
---|
1213 | | - up_write(&F2FS_I(new_inode)->i_sem); |
---|
| 1236 | + f2fs_up_write(&F2FS_I(new_inode)->i_sem); |
---|
1214 | 1237 | |
---|
1215 | 1238 | new_dir->i_ctime = current_time(new_dir); |
---|
1216 | 1239 | if (new_nlink) { |
---|
1217 | | - down_write(&F2FS_I(new_dir)->i_sem); |
---|
| 1240 | + f2fs_down_write(&F2FS_I(new_dir)->i_sem); |
---|
1218 | 1241 | f2fs_i_links_write(new_dir, new_nlink > 0); |
---|
1219 | | - up_write(&F2FS_I(new_dir)->i_sem); |
---|
| 1242 | + f2fs_up_write(&F2FS_I(new_dir)->i_sem); |
---|
1220 | 1243 | } |
---|
1221 | 1244 | f2fs_mark_inode_dirty_sync(new_dir, false); |
---|
1222 | 1245 | |
---|
.. | .. |
---|
1303 | 1326 | } |
---|
1304 | 1327 | |
---|
1305 | 1328 | const struct inode_operations f2fs_encrypted_symlink_inode_operations = { |
---|
1306 | | - .get_link = f2fs_encrypted_get_link, |
---|
| 1329 | + .get_link = f2fs_encrypted_get_link, |
---|
1307 | 1330 | .getattr = f2fs_encrypted_symlink_getattr, |
---|
1308 | 1331 | .setattr = f2fs_setattr, |
---|
1309 | 1332 | .listxattr = f2fs_listxattr, |
---|
.. | .. |
---|
1329 | 1352 | }; |
---|
1330 | 1353 | |
---|
1331 | 1354 | const struct inode_operations f2fs_symlink_inode_operations = { |
---|
1332 | | - .get_link = f2fs_get_link, |
---|
| 1355 | + .get_link = f2fs_get_link, |
---|
1333 | 1356 | .getattr = f2fs_getattr, |
---|
1334 | 1357 | .setattr = f2fs_setattr, |
---|
1335 | 1358 | .listxattr = f2fs_listxattr, |
---|
.. | .. |
---|
1337 | 1360 | |
---|
1338 | 1361 | const struct inode_operations f2fs_special_inode_operations = { |
---|
1339 | 1362 | .getattr = f2fs_getattr, |
---|
1340 | | - .setattr = f2fs_setattr, |
---|
| 1363 | + .setattr = f2fs_setattr, |
---|
1341 | 1364 | .get_acl = f2fs_get_acl, |
---|
1342 | 1365 | .set_acl = f2fs_set_acl, |
---|
1343 | 1366 | .listxattr = f2fs_listxattr, |
---|