valid_blk.c revision efc6f628e15de95bcd13e4f0ee223cb42115d520
1656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* 2656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * valid_blk.c --- does the inode have valid blocks? 3656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 4656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Copyright 1997 by Theodore Ts'o 5656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 6656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * %Begin-Header% 7656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * This file may be redistributed under the terms of the GNU Public 8656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * License. 9656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * %End-Header% 10656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 11656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 12656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 13656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <stdio.h> 14656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if HAVE_UNISTD_H 15656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <unistd.h> 16656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 17656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <string.h> 18656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <time.h> 19656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 20656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "ext2_fs.h" 21656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "ext2fs.h" 22656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 23656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* 24656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * This function returns 1 if the inode's block entries actually 25656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * contain block entries. 26656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 27656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint ext2fs_inode_has_valid_blocks(struct ext2_inode *inode) 28656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ 29656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* 30656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Only directories, regular files, and some symbolic links 31656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * have valid block entries. 32656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 33656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!LINUX_S_ISDIR(inode->i_mode) && !LINUX_S_ISREG(inode->i_mode) && 34656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project !LINUX_S_ISLNK(inode->i_mode)) 35656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0; 36656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 37656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* 38656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * If the symbolic link is a "fast symlink", then the symlink 39656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * target is stored in the block entries. 40656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 41656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (LINUX_S_ISLNK (inode->i_mode)) { 42656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (inode->i_file_acl == 0) { 43656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* With no EA block, we can rely on i_blocks */ 44656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (inode->i_blocks == 0) 45656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0; 46656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } else { 47656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* With an EA block, life gets more tricky */ 48656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (inode->i_size >= EXT2_N_BLOCKS*4) 49656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 1; /* definitely using i_block[] */ 50656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (inode->i_size > 4 && inode->i_block[1] == 0) 51656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 1; /* definitely using i_block[] */ 52656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0; /* Probably a fast symlink */ 53656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 54656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 55656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 1; 56656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} 57656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project