diff options
Diffstat (limited to 'e2fsprogs/ext2fs/valid_blk.c')
-rw-r--r-- | e2fsprogs/ext2fs/valid_blk.c | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/e2fsprogs/ext2fs/valid_blk.c b/e2fsprogs/ext2fs/valid_blk.c new file mode 100644 index 000000000..29ff27a7c --- /dev/null +++ b/e2fsprogs/ext2fs/valid_blk.c | |||
@@ -0,0 +1,56 @@ | |||
1 | /* | ||
2 | * valid_blk.c --- does the inode have valid blocks? | ||
3 | * | ||
4 | * Copyright 1997 by Theodore Ts'o | ||
5 | * | ||
6 | * %Begin-Header% | ||
7 | * This file may be redistributed under the terms of the GNU Public | ||
8 | * License. | ||
9 | * %End-Header% | ||
10 | * | ||
11 | */ | ||
12 | |||
13 | #include <stdio.h> | ||
14 | #if HAVE_UNISTD_H | ||
15 | #include <unistd.h> | ||
16 | #endif | ||
17 | #include <string.h> | ||
18 | #include <time.h> | ||
19 | |||
20 | #include "ext2_fs.h" | ||
21 | #include "ext2fs.h" | ||
22 | |||
23 | /* | ||
24 | * This function returns 1 if the inode's block entries actually | ||
25 | * contain block entries. | ||
26 | */ | ||
27 | int ext2fs_inode_has_valid_blocks(struct ext2_inode *inode) | ||
28 | { | ||
29 | /* | ||
30 | * Only directories, regular files, and some symbolic links | ||
31 | * have valid block entries. | ||
32 | */ | ||
33 | if (!LINUX_S_ISDIR(inode->i_mode) && !LINUX_S_ISREG(inode->i_mode) && | ||
34 | !LINUX_S_ISLNK(inode->i_mode)) | ||
35 | return 0; | ||
36 | |||
37 | /* | ||
38 | * If the symbolic link is a "fast symlink", then the symlink | ||
39 | * target is stored in the block entries. | ||
40 | */ | ||
41 | if (LINUX_S_ISLNK (inode->i_mode)) { | ||
42 | if (inode->i_file_acl == 0) { | ||
43 | /* With no EA block, we can rely on i_blocks */ | ||
44 | if (inode->i_blocks == 0) | ||
45 | return 0; | ||
46 | } else { | ||
47 | /* With an EA block, life gets more tricky */ | ||
48 | if (inode->i_size >= EXT2_N_BLOCKS*4) | ||
49 | return 1; /* definitely using i_block[] */ | ||
50 | if (inode->i_size > 4 && inode->i_block[1] == 0) | ||
51 | return 1; /* definitely using i_block[] */ | ||
52 | return 0; /* Probably a fast symlink */ | ||
53 | } | ||
54 | } | ||
55 | return 1; | ||
56 | } | ||