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