namei.c (5298d4bfe80f6ae6ae2777bcd1357b0022d98573) namei.c (e4544b63a7ee49e7fbebf35ece0a6acd3b9617ae)
1// SPDX-License-Identifier: GPL-2.0
2/*
3 * fs/f2fs/namei.c
4 *
5 * Copyright (c) 2012 Samsung Electronics Co., Ltd.
6 * http://www.samsung.com/
7 */
8#include <linux/fs.h>

--- 182 unchanged lines hidden (view full) ---

191 * Set file's temperature for hot/cold data separation
192 */
193static inline void set_file_temperature(struct f2fs_sb_info *sbi, struct inode *inode,
194 const unsigned char *name)
195{
196 __u8 (*extlist)[F2FS_EXTENSION_LEN] = sbi->raw_super->extension_list;
197 int i, cold_count, hot_count;
198
1// SPDX-License-Identifier: GPL-2.0
2/*
3 * fs/f2fs/namei.c
4 *
5 * Copyright (c) 2012 Samsung Electronics Co., Ltd.
6 * http://www.samsung.com/
7 */
8#include <linux/fs.h>

--- 182 unchanged lines hidden (view full) ---

191 * Set file's temperature for hot/cold data separation
192 */
193static inline void set_file_temperature(struct f2fs_sb_info *sbi, struct inode *inode,
194 const unsigned char *name)
195{
196 __u8 (*extlist)[F2FS_EXTENSION_LEN] = sbi->raw_super->extension_list;
197 int i, cold_count, hot_count;
198
199 down_read(&sbi->sb_lock);
199 f2fs_down_read(&sbi->sb_lock);
200
201 cold_count = le32_to_cpu(sbi->raw_super->extension_count);
202 hot_count = sbi->raw_super->hot_ext_count;
203
204 for (i = 0; i < cold_count + hot_count; i++) {
205 if (is_extension_exist(name, extlist[i], true))
206 break;
207 }
208
200
201 cold_count = le32_to_cpu(sbi->raw_super->extension_count);
202 hot_count = sbi->raw_super->hot_ext_count;
203
204 for (i = 0; i < cold_count + hot_count; i++) {
205 if (is_extension_exist(name, extlist[i], true))
206 break;
207 }
208
209 up_read(&sbi->sb_lock);
209 f2fs_up_read(&sbi->sb_lock);
210
211 if (i == cold_count + hot_count)
212 return;
213
214 if (i < cold_count)
215 file_set_cold(inode);
216 else
217 file_set_hot(inode);

--- 76 unchanged lines hidden (view full) ---

294 int i, cold_count, hot_count;
295
296 if (!f2fs_sb_has_compression(sbi) ||
297 F2FS_I(inode)->i_flags & F2FS_NOCOMP_FL ||
298 !f2fs_may_compress(inode) ||
299 (!ext_cnt && !noext_cnt))
300 return;
301
210
211 if (i == cold_count + hot_count)
212 return;
213
214 if (i < cold_count)
215 file_set_cold(inode);
216 else
217 file_set_hot(inode);

--- 76 unchanged lines hidden (view full) ---

294 int i, cold_count, hot_count;
295
296 if (!f2fs_sb_has_compression(sbi) ||
297 F2FS_I(inode)->i_flags & F2FS_NOCOMP_FL ||
298 !f2fs_may_compress(inode) ||
299 (!ext_cnt && !noext_cnt))
300 return;
301
302 down_read(&sbi->sb_lock);
302 f2fs_down_read(&sbi->sb_lock);
303
304 cold_count = le32_to_cpu(sbi->raw_super->extension_count);
305 hot_count = sbi->raw_super->hot_ext_count;
306
307 for (i = cold_count; i < cold_count + hot_count; i++) {
308 if (is_extension_exist(name, extlist[i], false)) {
303
304 cold_count = le32_to_cpu(sbi->raw_super->extension_count);
305 hot_count = sbi->raw_super->hot_ext_count;
306
307 for (i = cold_count; i < cold_count + hot_count; i++) {
308 if (is_extension_exist(name, extlist[i], false)) {
309 up_read(&sbi->sb_lock);
309 f2fs_up_read(&sbi->sb_lock);
310 return;
311 }
312 }
313
310 return;
311 }
312 }
313
314 up_read(&sbi->sb_lock);
314 f2fs_up_read(&sbi->sb_lock);
315
316 for (i = 0; i < noext_cnt; i++) {
317 if (is_extension_exist(name, noext[i], false)) {
318 f2fs_disable_compressed_file(inode);
319 return;
320 }
321 }
322

--- 233 unchanged lines hidden (view full) ---

556 (S_ISDIR(inode->i_mode) || S_ISLNK(inode->i_mode)) &&
557 !fscrypt_has_permitted_context(dir, inode)) {
558 f2fs_warn(F2FS_I_SB(inode), "Inconsistent encryption contexts: %lu/%lu",
559 dir->i_ino, inode->i_ino);
560 err = -EPERM;
561 goto out_iput;
562 }
563out_splice:
315
316 for (i = 0; i < noext_cnt; i++) {
317 if (is_extension_exist(name, noext[i], false)) {
318 f2fs_disable_compressed_file(inode);
319 return;
320 }
321 }
322

--- 233 unchanged lines hidden (view full) ---

556 (S_ISDIR(inode->i_mode) || S_ISLNK(inode->i_mode)) &&
557 !fscrypt_has_permitted_context(dir, inode)) {
558 f2fs_warn(F2FS_I_SB(inode), "Inconsistent encryption contexts: %lu/%lu",
559 dir->i_ino, inode->i_ino);
560 err = -EPERM;
561 goto out_iput;
562 }
563out_splice:
564#if IS_ENABLED(CONFIG_UNICODE)
564#ifdef CONFIG_UNICODE
565 if (!inode && IS_CASEFOLDED(dir)) {
566 /* Eventually we want to call d_add_ci(dentry, NULL)
567 * for negative dentries in the encoding case as
568 * well. For now, prevent the negative dentry
569 * from being cached.
570 */
571 trace_f2fs_lookup_end(dir, dentry, ino, err);
572 return NULL;

--- 44 unchanged lines hidden (view full) ---

617 f2fs_lock_op(sbi);
618 err = f2fs_acquire_orphan_inode(sbi);
619 if (err) {
620 f2fs_unlock_op(sbi);
621 f2fs_put_page(page, 0);
622 goto fail;
623 }
624 f2fs_delete_entry(de, page, dir, inode);
565 if (!inode && IS_CASEFOLDED(dir)) {
566 /* Eventually we want to call d_add_ci(dentry, NULL)
567 * for negative dentries in the encoding case as
568 * well. For now, prevent the negative dentry
569 * from being cached.
570 */
571 trace_f2fs_lookup_end(dir, dentry, ino, err);
572 return NULL;

--- 44 unchanged lines hidden (view full) ---

617 f2fs_lock_op(sbi);
618 err = f2fs_acquire_orphan_inode(sbi);
619 if (err) {
620 f2fs_unlock_op(sbi);
621 f2fs_put_page(page, 0);
622 goto fail;
623 }
624 f2fs_delete_entry(de, page, dir, inode);
625#if IS_ENABLED(CONFIG_UNICODE)
625#ifdef CONFIG_UNICODE
626 /* VFS negative dentries are incompatible with Encoding and
627 * Case-insensitiveness. Eventually we'll want avoid
628 * invalidating the dentries here, alongside with returning the
629 * negative dentries at f2fs_lookup(), when it is better
630 * supported by the VFS for the CI case.
631 */
632 if (IS_CASEFOLDED(dir))
633 d_invalidate(dentry);

--- 384 unchanged lines hidden (view full) ---

1018 err = f2fs_acquire_orphan_inode(sbi);
1019 if (err)
1020 goto put_out_dir;
1021
1022 f2fs_set_link(new_dir, new_entry, new_page, old_inode);
1023 new_page = NULL;
1024
1025 new_inode->i_ctime = current_time(new_inode);
626 /* VFS negative dentries are incompatible with Encoding and
627 * Case-insensitiveness. Eventually we'll want avoid
628 * invalidating the dentries here, alongside with returning the
629 * negative dentries at f2fs_lookup(), when it is better
630 * supported by the VFS for the CI case.
631 */
632 if (IS_CASEFOLDED(dir))
633 d_invalidate(dentry);

--- 384 unchanged lines hidden (view full) ---

1018 err = f2fs_acquire_orphan_inode(sbi);
1019 if (err)
1020 goto put_out_dir;
1021
1022 f2fs_set_link(new_dir, new_entry, new_page, old_inode);
1023 new_page = NULL;
1024
1025 new_inode->i_ctime = current_time(new_inode);
1026 down_write(&F2FS_I(new_inode)->i_sem);
1026 f2fs_down_write(&F2FS_I(new_inode)->i_sem);
1027 if (old_dir_entry)
1028 f2fs_i_links_write(new_inode, false);
1029 f2fs_i_links_write(new_inode, false);
1027 if (old_dir_entry)
1028 f2fs_i_links_write(new_inode, false);
1029 f2fs_i_links_write(new_inode, false);
1030 up_write(&F2FS_I(new_inode)->i_sem);
1030 f2fs_up_write(&F2FS_I(new_inode)->i_sem);
1031
1032 if (!new_inode->i_nlink)
1033 f2fs_add_orphan_inode(new_inode);
1034 else
1035 f2fs_release_orphan_inode(sbi);
1036 } else {
1037 f2fs_balance_fs(sbi, true);
1038

--- 4 unchanged lines hidden (view full) ---

1043 f2fs_unlock_op(sbi);
1044 goto out_dir;
1045 }
1046
1047 if (old_dir_entry)
1048 f2fs_i_links_write(new_dir, true);
1049 }
1050
1031
1032 if (!new_inode->i_nlink)
1033 f2fs_add_orphan_inode(new_inode);
1034 else
1035 f2fs_release_orphan_inode(sbi);
1036 } else {
1037 f2fs_balance_fs(sbi, true);
1038

--- 4 unchanged lines hidden (view full) ---

1043 f2fs_unlock_op(sbi);
1044 goto out_dir;
1045 }
1046
1047 if (old_dir_entry)
1048 f2fs_i_links_write(new_dir, true);
1049 }
1050
1051 down_write(&F2FS_I(old_inode)->i_sem);
1051 f2fs_down_write(&F2FS_I(old_inode)->i_sem);
1052 if (!old_dir_entry || whiteout)
1053 file_lost_pino(old_inode);
1054 else
1055 /* adjust dir's i_pino to pass fsck check */
1056 f2fs_i_pino_write(old_inode, new_dir->i_ino);
1052 if (!old_dir_entry || whiteout)
1053 file_lost_pino(old_inode);
1054 else
1055 /* adjust dir's i_pino to pass fsck check */
1056 f2fs_i_pino_write(old_inode, new_dir->i_ino);
1057 up_write(&F2FS_I(old_inode)->i_sem);
1057 f2fs_up_write(&F2FS_I(old_inode)->i_sem);
1058
1059 old_inode->i_ctime = current_time(old_inode);
1060 f2fs_mark_inode_dirty_sync(old_inode, false);
1061
1062 f2fs_delete_entry(old_entry, old_page, old_dir, NULL);
1063 old_page = NULL;
1064
1065 if (whiteout) {

--- 143 unchanged lines hidden (view full) ---

1209
1210 /* update ".." directory entry info of new dentry */
1211 if (new_dir_entry)
1212 f2fs_set_link(new_inode, new_dir_entry, new_dir_page, old_dir);
1213
1214 /* update directory entry info of old dir inode */
1215 f2fs_set_link(old_dir, old_entry, old_page, new_inode);
1216
1058
1059 old_inode->i_ctime = current_time(old_inode);
1060 f2fs_mark_inode_dirty_sync(old_inode, false);
1061
1062 f2fs_delete_entry(old_entry, old_page, old_dir, NULL);
1063 old_page = NULL;
1064
1065 if (whiteout) {

--- 143 unchanged lines hidden (view full) ---

1209
1210 /* update ".." directory entry info of new dentry */
1211 if (new_dir_entry)
1212 f2fs_set_link(new_inode, new_dir_entry, new_dir_page, old_dir);
1213
1214 /* update directory entry info of old dir inode */
1215 f2fs_set_link(old_dir, old_entry, old_page, new_inode);
1216
1217 down_write(&F2FS_I(old_inode)->i_sem);
1217 f2fs_down_write(&F2FS_I(old_inode)->i_sem);
1218 if (!old_dir_entry)
1219 file_lost_pino(old_inode);
1220 else
1221 /* adjust dir's i_pino to pass fsck check */
1222 f2fs_i_pino_write(old_inode, new_dir->i_ino);
1218 if (!old_dir_entry)
1219 file_lost_pino(old_inode);
1220 else
1221 /* adjust dir's i_pino to pass fsck check */
1222 f2fs_i_pino_write(old_inode, new_dir->i_ino);
1223 up_write(&F2FS_I(old_inode)->i_sem);
1223 f2fs_up_write(&F2FS_I(old_inode)->i_sem);
1224
1225 old_dir->i_ctime = current_time(old_dir);
1226 if (old_nlink) {
1224
1225 old_dir->i_ctime = current_time(old_dir);
1226 if (old_nlink) {
1227 down_write(&F2FS_I(old_dir)->i_sem);
1227 f2fs_down_write(&F2FS_I(old_dir)->i_sem);
1228 f2fs_i_links_write(old_dir, old_nlink > 0);
1228 f2fs_i_links_write(old_dir, old_nlink > 0);
1229 up_write(&F2FS_I(old_dir)->i_sem);
1229 f2fs_up_write(&F2FS_I(old_dir)->i_sem);
1230 }
1231 f2fs_mark_inode_dirty_sync(old_dir, false);
1232
1233 /* update directory entry info of new dir inode */
1234 f2fs_set_link(new_dir, new_entry, new_page, old_inode);
1235
1230 }
1231 f2fs_mark_inode_dirty_sync(old_dir, false);
1232
1233 /* update directory entry info of new dir inode */
1234 f2fs_set_link(new_dir, new_entry, new_page, old_inode);
1235
1236 down_write(&F2FS_I(new_inode)->i_sem);
1236 f2fs_down_write(&F2FS_I(new_inode)->i_sem);
1237 if (!new_dir_entry)
1238 file_lost_pino(new_inode);
1239 else
1240 /* adjust dir's i_pino to pass fsck check */
1241 f2fs_i_pino_write(new_inode, old_dir->i_ino);
1237 if (!new_dir_entry)
1238 file_lost_pino(new_inode);
1239 else
1240 /* adjust dir's i_pino to pass fsck check */
1241 f2fs_i_pino_write(new_inode, old_dir->i_ino);
1242 up_write(&F2FS_I(new_inode)->i_sem);
1242 f2fs_up_write(&F2FS_I(new_inode)->i_sem);
1243
1244 new_dir->i_ctime = current_time(new_dir);
1245 if (new_nlink) {
1243
1244 new_dir->i_ctime = current_time(new_dir);
1245 if (new_nlink) {
1246 down_write(&F2FS_I(new_dir)->i_sem);
1246 f2fs_down_write(&F2FS_I(new_dir)->i_sem);
1247 f2fs_i_links_write(new_dir, new_nlink > 0);
1247 f2fs_i_links_write(new_dir, new_nlink > 0);
1248 up_write(&F2FS_I(new_dir)->i_sem);
1248 f2fs_up_write(&F2FS_I(new_dir)->i_sem);
1249 }
1250 f2fs_mark_inode_dirty_sync(new_dir, false);
1251
1252 if (F2FS_OPTION(sbi).fsync_mode == FSYNC_MODE_STRICT) {
1253 f2fs_add_ino_entry(sbi, old_dir->i_ino, TRANS_DIR_INO);
1254 f2fs_add_ino_entry(sbi, new_dir->i_ino, TRANS_DIR_INO);
1255 }
1256

--- 121 unchanged lines hidden ---
1249 }
1250 f2fs_mark_inode_dirty_sync(new_dir, false);
1251
1252 if (F2FS_OPTION(sbi).fsync_mode == FSYNC_MODE_STRICT) {
1253 f2fs_add_ino_entry(sbi, old_dir->i_ino, TRANS_DIR_INO);
1254 f2fs_add_ino_entry(sbi, new_dir->i_ino, TRANS_DIR_INO);
1255 }
1256

--- 121 unchanged lines hidden ---