Bug #65445 [Com]: filesize() fails for files with high inode number

From: Date: Fri, 16 Aug 2013 16:15:14 +0000
Subject: Bug #65445 [Com]: filesize() fails for files with high inode number
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-180945@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=65445&edit=1

 ID:                 65445
 Comment by:         michal at michal dot waw dot pl
 Reported by:        michal at michal dot waw dot pl
 Summary:            filesize() fails for files with high inode number
 Status:             Open
 Type:               Bug
 Package:            Filesystem function related
 Operating System:   Linux
 PHP Version:        5.5.1
 Block user comment: N
 Private report:     N

 New Comment:

Source of the problem lies in lack of support for files larger than 2GB.

From what I read in different places enabling LFS in PHP is not possible, as it requires doing so in
Apache and many libraries.

The easiest solution for me is to force XFS to not use inode numbers greater than 2^32
("inode32" mount option).

Still I hope one day PHP will have LFS enabled.


Previous Comments:
------------------------------------------------------------------------
[2013-08-16 10:52:04] michal at michal dot waw dot pl

It is a problem with stat(2) C function. For files with inode >= 2^32 it returns error:

errno: 75 (Value too large for defined data type)

------------------------------------------------------------------------
[2013-08-13 21:33:24] michal at michal dot waw dot pl

This is 32bit system.

Here is the output:
stat64("DSC_5196_fx-1553725666.JPG", {st_mode=S_IFREG|0644, st_size=1907383, ...}) = 0
write(1, "\nWarning: filesize(): stat faile"..., 96) = 96

Please tell me if I can help in any way.

------------------------------------------------------------------------
[2013-08-13 21:02:02] johannes@php.net

Are you using a 32 or 64 it system?
Could you please run the following on command line to see whether the syscall for stat succeeds or
fails so we can narrow the search:

$ strace php -nr 'filesize("DSC_5196_fx-1553725666.JPG");'

The relevant output is towards the end something like

stat("DSC_5196_fx-1553725666.JPG", 0x7fff38d27f80) = -1 ENOENT (No such file or directory)
write(1, "\nWarning: filesize(): stat faile"..., 96

or

stat("DSC_5196_fx-1553725666.JPG", {st_mode=S_IFREG|0644, st_size=0, ...}) = 0

thanks.

------------------------------------------------------------------------
[2013-08-13 20:27:21] michal at michal dot waw dot pl

Description:
------------
I have a file for which filesize() can't return value. "stat" result for this file:

Original file:
  File: 'DSC_5196_fx-1553725666.JPG'
  Size: 1907383         Blocks: 3728       IO Block: 4096   regular file
Device: 803h/2051d      Inode: 5905591363  Links: 1
Access: (0644/-rw-r--r--)  Uid: (   51/    http)   Gid: (   51/    http)
Access: 2013-08-13 00:47:28.107477918 +0200
Modify: 2013-08-12 21:38:27.219913208 +0200
Change: 2013-08-13 00:47:08.931478654 +0200
 Birth: -

I've made an exact copy, in same dir, same permissions:

Copy:
  File: 'DSC_5196_fx-1553725666_X.JPG'
  Size: 1907383         Blocks: 3728       IO Block: 4096   regular file
Device: 803h/2051d      Inode: 144         Links: 1
Access: (0644/-rw-r--r--)  Uid: (   51/    http)   Gid: (   51/    http)
Access: 2013-08-13 00:45:48.000000000 +0200
Modify: 2013-08-12 21:38:27.000000000 +0200
Change: 2013-08-13 00:47:28.199477914 +0200
 Birth: -

filesize() works for this new file.

I can't find any other difference between these two files.

I checked that filesize() works for files with inode number less or equal to 4126207367and
doesn't work for files with inode number equal or greater than 4358705632. I didn't find
files with inode number in between but I'm still looking.

To me it seems that filesize() has problem with inode number higher than 2^32.

Test script:
---------------
<html>
<body>
<pre>
<?

$f1 =
'/home/services/httpd/html.galeria.michal.waw.pl/gallery/var/albums/988_Rok-2013/Sobota/DSC_5196_fx-1553725666.JPG';
$f2 =
'/home/services/httpd/html.galeria.michal.waw.pl/gallery/var/albums/988_Rok-2013/Sobota/DSC_5196_fx-1553725666_X.JPG';

print $f1.": ".filesize($f1)."\n";
print $f2.": ".filesize($f2)."\n";

?>
</pre>
</body>
</html>

Expected result:
----------------
I expected to see sizes of both files.

Actual result:
--------------
Warning: filesize(): stat failed for
/home/services/httpd/html.galeria.XXX/gallery/var/albums/988_Rok-2013/333_Rydzewo-04-06.08.2013/Sobota/DSC_5196_fx-1553725666.JPG
in /home/services/httpd/html.galeria.michal.waw.pl/gallery3-3.0.x/test.php on line 13
/home/services/httpd/html.galeria.XXX/gallery/var/albums/988_Rok-2013/333_Rydzewo-04-06.08.2013/Sobota/DSC_5196_fx-1553725666.JPG:

/home/services/httpd/html.galeria.XXX/gallery/var/albums/988_Rok-2013/333_Rydzewo-04-06.08.2013/Sobota/DSC_5196_fx-1553725666_X.JPG:
1907383


------------------------------------------------------------------------



-- 
Edit this bug report at https://bugs.php.net/bug.php?id=65445&edit=1


Thread (7 messages)

« previous php.bugs (#180945) next »