X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lib%2Fext2fs%2Fvalid_blk.c;h=9047f41fd0b98aec9c3e08694a583ea69a37cc29;hb=3fcd8fe8acb269598390b35bbf6e4247d10bc64e;hp=c6a7c22e6a88629a8d87a405076a5846bf8e63ea;hpb=9f8046fc6dfc13eee2f5c363214e60b533872cac;p=tools%2Fe2fsprogs.git diff --git a/lib/ext2fs/valid_blk.c b/lib/ext2fs/valid_blk.c index c6a7c22..9047f41 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 @@ -33,14 +33,24 @@ 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(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; }