18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * inode.c 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Copyright (C) 2001 Will Dyson <will_dyson@pobox.com> 68c2ecf20Sopenharmony_ci */ 78c2ecf20Sopenharmony_ci 88c2ecf20Sopenharmony_ci#include <linux/fs.h> 98c2ecf20Sopenharmony_ci 108c2ecf20Sopenharmony_ci#include "befs.h" 118c2ecf20Sopenharmony_ci#include "inode.h" 128c2ecf20Sopenharmony_ci 138c2ecf20Sopenharmony_ci/* 148c2ecf20Sopenharmony_ci * Validates the correctness of the befs inode 158c2ecf20Sopenharmony_ci * Returns BEFS_OK if the inode should be used, otherwise 168c2ecf20Sopenharmony_ci * returns BEFS_BAD_INODE 178c2ecf20Sopenharmony_ci */ 188c2ecf20Sopenharmony_ciint 198c2ecf20Sopenharmony_cibefs_check_inode(struct super_block *sb, befs_inode *raw_inode, 208c2ecf20Sopenharmony_ci befs_blocknr_t inode) 218c2ecf20Sopenharmony_ci{ 228c2ecf20Sopenharmony_ci u32 magic1 = fs32_to_cpu(sb, raw_inode->magic1); 238c2ecf20Sopenharmony_ci befs_inode_addr ino_num = fsrun_to_cpu(sb, raw_inode->inode_num); 248c2ecf20Sopenharmony_ci u32 flags = fs32_to_cpu(sb, raw_inode->flags); 258c2ecf20Sopenharmony_ci 268c2ecf20Sopenharmony_ci /* check magic header. */ 278c2ecf20Sopenharmony_ci if (magic1 != BEFS_INODE_MAGIC1) { 288c2ecf20Sopenharmony_ci befs_error(sb, 298c2ecf20Sopenharmony_ci "Inode has a bad magic header - inode = %lu", 308c2ecf20Sopenharmony_ci (unsigned long)inode); 318c2ecf20Sopenharmony_ci return BEFS_BAD_INODE; 328c2ecf20Sopenharmony_ci } 338c2ecf20Sopenharmony_ci 348c2ecf20Sopenharmony_ci /* 358c2ecf20Sopenharmony_ci * Sanity check2: inodes store their own block address. Check it. 368c2ecf20Sopenharmony_ci */ 378c2ecf20Sopenharmony_ci if (inode != iaddr2blockno(sb, &ino_num)) { 388c2ecf20Sopenharmony_ci befs_error(sb, "inode blocknr field disagrees with vfs " 398c2ecf20Sopenharmony_ci "VFS: %lu, Inode %lu", (unsigned long) 408c2ecf20Sopenharmony_ci inode, (unsigned long)iaddr2blockno(sb, &ino_num)); 418c2ecf20Sopenharmony_ci return BEFS_BAD_INODE; 428c2ecf20Sopenharmony_ci } 438c2ecf20Sopenharmony_ci 448c2ecf20Sopenharmony_ci /* 458c2ecf20Sopenharmony_ci * check flag 468c2ecf20Sopenharmony_ci */ 478c2ecf20Sopenharmony_ci 488c2ecf20Sopenharmony_ci if (!(flags & BEFS_INODE_IN_USE)) { 498c2ecf20Sopenharmony_ci befs_error(sb, "inode is not used - inode = %lu", 508c2ecf20Sopenharmony_ci (unsigned long)inode); 518c2ecf20Sopenharmony_ci return BEFS_BAD_INODE; 528c2ecf20Sopenharmony_ci } 538c2ecf20Sopenharmony_ci 548c2ecf20Sopenharmony_ci return BEFS_OK; 558c2ecf20Sopenharmony_ci} 56