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

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

183
184out_put:
185 f2fs_put_page(page, 0);
186out:
187 if (file_enc_name(inode))
188 name = "<encrypted>";
189 else
190 name = raw_inode->i_name;
1// SPDX-License-Identifier: GPL-2.0
2/*
3 * fs/f2fs/recovery.c
4 *
5 * Copyright (c) 2012 Samsung Electronics Co., Ltd.
6 * http://www.samsung.com/
7 */
8#include <linux/fs.h>

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

183
184out_put:
185 f2fs_put_page(page, 0);
186out:
187 if (file_enc_name(inode))
188 name = "<encrypted>";
189 else
190 name = raw_inode->i_name;
191 f2fs_msg(inode->i_sb, KERN_NOTICE,
192 "%s: ino = %x, name = %s, dir = %lx, err = %d",
193 __func__, ino_of_node(ipage), name,
194 IS_ERR(dir) ? 0 : dir->i_ino, err);
191 f2fs_notice(F2FS_I_SB(inode), "%s: ino = %x, name = %s, dir = %lx, err = %d",
192 __func__, ino_of_node(ipage), name,
193 IS_ERR(dir) ? 0 : dir->i_ino, err);
195 return err;
196}
197
198static int recover_quota_data(struct inode *inode, struct page *page)
199{
200 struct f2fs_inode *raw = F2FS_INODE(page);
201 struct iattr attr;
202 uid_t i_uid = le32_to_cpu(raw->i_uid);

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

287
288 f2fs_mark_inode_dirty_sync(inode, true);
289
290 if (file_enc_name(inode))
291 name = "<encrypted>";
292 else
293 name = F2FS_INODE(page)->i_name;
294
194 return err;
195}
196
197static int recover_quota_data(struct inode *inode, struct page *page)
198{
199 struct f2fs_inode *raw = F2FS_INODE(page);
200 struct iattr attr;
201 uid_t i_uid = le32_to_cpu(raw->i_uid);

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

286
287 f2fs_mark_inode_dirty_sync(inode, true);
288
289 if (file_enc_name(inode))
290 name = "<encrypted>";
291 else
292 name = F2FS_INODE(page)->i_name;
293
295 f2fs_msg(inode->i_sb, KERN_NOTICE,
296 "recover_inode: ino = %x, name = %s, inline = %x",
297 ino_of_node(page), name, raw->i_inline);
294 f2fs_notice(F2FS_I_SB(inode), "recover_inode: ino = %x, name = %s, inline = %x",
295 ino_of_node(page), name, raw->i_inline);
298 return 0;
299}
300
301static int find_fsync_dnodes(struct f2fs_sb_info *sbi, struct list_head *head,
302 bool check_only)
303{
304 struct curseg_info *curseg;
305 struct page *page = NULL;

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

366 entry->blkaddr = blkaddr;
367
368 if (IS_INODE(page) && is_dent_dnode(page))
369 entry->last_dentry = blkaddr;
370next:
371 /* sanity check in order to detect looped node chain */
372 if (++loop_cnt >= free_blocks ||
373 blkaddr == next_blkaddr_of_node(page)) {
296 return 0;
297}
298
299static int find_fsync_dnodes(struct f2fs_sb_info *sbi, struct list_head *head,
300 bool check_only)
301{
302 struct curseg_info *curseg;
303 struct page *page = NULL;

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

364 entry->blkaddr = blkaddr;
365
366 if (IS_INODE(page) && is_dent_dnode(page))
367 entry->last_dentry = blkaddr;
368next:
369 /* sanity check in order to detect looped node chain */
370 if (++loop_cnt >= free_blocks ||
371 blkaddr == next_blkaddr_of_node(page)) {
374 f2fs_msg(sbi->sb, KERN_NOTICE,
375 "%s: detect looped node chain, "
376 "blkaddr:%u, next:%u",
377 __func__, blkaddr, next_blkaddr_of_node(page));
372 f2fs_notice(sbi, "%s: detect looped node chain, blkaddr:%u, next:%u",
373 __func__, blkaddr,
374 next_blkaddr_of_node(page));
378 f2fs_put_page(page, 1);
379 err = -EINVAL;
380 break;
381 }
382
383 /* check next segment */
384 blkaddr = next_blkaddr_of_node(page);
385 f2fs_put_page(page, 1);

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

548
549 err = f2fs_get_node_info(sbi, dn.nid, &ni);
550 if (err)
551 goto err;
552
553 f2fs_bug_on(sbi, ni.ino != ino_of_node(page));
554
555 if (ofs_of_node(dn.node_page) != ofs_of_node(page)) {
375 f2fs_put_page(page, 1);
376 err = -EINVAL;
377 break;
378 }
379
380 /* check next segment */
381 blkaddr = next_blkaddr_of_node(page);
382 f2fs_put_page(page, 1);

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

545
546 err = f2fs_get_node_info(sbi, dn.nid, &ni);
547 if (err)
548 goto err;
549
550 f2fs_bug_on(sbi, ni.ino != ino_of_node(page));
551
552 if (ofs_of_node(dn.node_page) != ofs_of_node(page)) {
556 f2fs_msg(sbi->sb, KERN_WARNING,
557 "Inconsistent ofs_of_node, ino:%lu, ofs:%u, %u",
558 inode->i_ino, ofs_of_node(dn.node_page),
559 ofs_of_node(page));
553 f2fs_warn(sbi, "Inconsistent ofs_of_node, ino:%lu, ofs:%u, %u",
554 inode->i_ino, ofs_of_node(dn.node_page),
555 ofs_of_node(page));
560 err = -EFAULT;
561 goto err;
562 }
563
564 for (; start < end; start++, dn.ofs_in_node++) {
565 block_t src, dest;
566
567 src = datablock_addr(dn.inode, dn.node_page, dn.ofs_in_node);

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

637
638 copy_node_footer(dn.node_page, page);
639 fill_node_footer(dn.node_page, dn.nid, ni.ino,
640 ofs_of_node(page), false);
641 set_page_dirty(dn.node_page);
642err:
643 f2fs_put_dnode(&dn);
644out:
556 err = -EFAULT;
557 goto err;
558 }
559
560 for (; start < end; start++, dn.ofs_in_node++) {
561 block_t src, dest;
562
563 src = datablock_addr(dn.inode, dn.node_page, dn.ofs_in_node);

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

633
634 copy_node_footer(dn.node_page, page);
635 fill_node_footer(dn.node_page, dn.nid, ni.ino,
636 ofs_of_node(page), false);
637 set_page_dirty(dn.node_page);
638err:
639 f2fs_put_dnode(&dn);
640out:
645 f2fs_msg(sbi->sb, KERN_NOTICE,
646 "recover_data: ino = %lx (i_size: %s) recovered = %d, err = %d",
647 inode->i_ino,
648 file_keep_isize(inode) ? "keep" : "recover",
649 recovered, err);
641 f2fs_notice(sbi, "recover_data: ino = %lx (i_size: %s) recovered = %d, err = %d",
642 inode->i_ino, file_keep_isize(inode) ? "keep" : "recover",
643 recovered, err);
650 return err;
651}
652
653static int recover_data(struct f2fs_sb_info *sbi, struct list_head *inode_list,
654 struct list_head *tmp_inode_list, struct list_head *dir_list)
655{
656 struct curseg_info *curseg;
657 struct page *page = NULL;

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

729 int ret = 0;
730 unsigned long s_flags = sbi->sb->s_flags;
731 bool need_writecp = false;
732#ifdef CONFIG_QUOTA
733 int quota_enabled;
734#endif
735
736 if (s_flags & SB_RDONLY) {
644 return err;
645}
646
647static int recover_data(struct f2fs_sb_info *sbi, struct list_head *inode_list,
648 struct list_head *tmp_inode_list, struct list_head *dir_list)
649{
650 struct curseg_info *curseg;
651 struct page *page = NULL;

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

723 int ret = 0;
724 unsigned long s_flags = sbi->sb->s_flags;
725 bool need_writecp = false;
726#ifdef CONFIG_QUOTA
727 int quota_enabled;
728#endif
729
730 if (s_flags & SB_RDONLY) {
737 f2fs_msg(sbi->sb, KERN_INFO,
738 "recover fsync data on readonly fs");
731 f2fs_info(sbi, "recover fsync data on readonly fs");
739 sbi->sb->s_flags &= ~SB_RDONLY;
740 }
741
742#ifdef CONFIG_QUOTA
743 /* Needed for iput() to work correctly and not trash data */
744 sbi->sb->s_flags |= SB_ACTIVE;
745 /* Turn on quotas so that they are updated correctly */
746 quota_enabled = f2fs_enable_quota_files(sbi, s_flags & SB_RDONLY);

--- 77 unchanged lines hidden ---
732 sbi->sb->s_flags &= ~SB_RDONLY;
733 }
734
735#ifdef CONFIG_QUOTA
736 /* Needed for iput() to work correctly and not trash data */
737 sbi->sb->s_flags |= SB_ACTIVE;
738 /* Turn on quotas so that they are updated correctly */
739 quota_enabled = f2fs_enable_quota_files(sbi, s_flags & SB_RDONLY);

--- 77 unchanged lines hidden ---