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