X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lib%2Fext2fs%2Fvalid_blk.c;h=895e36ef0f5d818f3a54c55cfcfc49c8b06b8bb2;hb=c4ab66c526c2f9bdff2e9abb817287b585e2e95d;hp=6d6734eeb64d6959852456eb0add59c3c92810d4;hpb=5be8dc2143c7b3b21a9b8fb56797dd855ee87560;p=tools%2Fe2fsprogs.git diff --git a/lib/ext2fs/valid_blk.c b/lib/ext2fs/valid_blk.c index 6d6734e..895e36e 100644 --- a/lib/ext2fs/valid_blk.c +++ b/lib/ext2fs/valid_blk.c @@ -2,14 +2,14 @@ * valid_blk.c --- does the inode have valid blocks? * * Copyright 1997 by Theodore Ts'o - * + * * %Begin-Header% - * This file may be redistributed under the terms of the GNU Public - * License. + * This file may be redistributed under the terms of the GNU Library + * General Public License, version 2. * %End-Header% - * */ +#include "config.h" #include #if HAVE_UNISTD_H #include @@ -17,15 +17,14 @@ #include #include -#include - +#include "ext2_fs.h" #include "ext2fs.h" /* * This function returns 1 if the inode's block entries actually * contain block entries. */ -int ext2fs_inode_has_valid_blocks(struct ext2_inode *inode) +int ext2fs_inode_has_valid_blocks2(ext2_filsys fs, struct ext2_inode *inode) { /* * Only directories, regular files, and some symbolic links @@ -34,14 +33,29 @@ int ext2fs_inode_has_valid_blocks(struct ext2_inode *inode) if (!LINUX_S_ISDIR(inode->i_mode) && !LINUX_S_ISREG(inode->i_mode) && !LINUX_S_ISLNK(inode->i_mode)) return 0; - + /* * If the symbolic link is a "fast symlink", then the symlink * target is stored in the block entries. */ - if (LINUX_S_ISLNK (inode->i_mode) && inode->i_blocks == 0 && - inode->i_size < EXT2_N_BLOCKS * sizeof (unsigned long)) - return 0; - + if (LINUX_S_ISLNK (inode->i_mode)) { + if (ext2fs_file_acl_block(fs, inode) == 0) { + /* With no EA block, we can rely on i_blocks */ + if (inode->i_blocks == 0) + return 0; + } else { + /* With an EA block, life gets more tricky */ + if (inode->i_size >= EXT2_N_BLOCKS*4) + return 1; /* definitely using i_block[] */ + if (inode->i_size > 4 && inode->i_block[1] == 0) + return 1; /* definitely using i_block[] */ + return 0; /* Probably a fast symlink */ + } + } return 1; } + +int ext2fs_inode_has_valid_blocks(struct ext2_inode *inode) +{ + return ext2fs_inode_has_valid_blocks2(NULL, inode); +}