If ->f_pos is positioned exactly at sb->s_maxbytes, a non-zero-length
write to the file doesn't write anything, and write() returns zero.

Consequently applications which try to append to a file which
is s_maxbytes in length hang up, because write() just keeps
on returning zero.

We need to return -EFBIG if ->f_pos is at s_maxbytes and
the length is non-zero.

--- linux-2.4.5-pre4/mm/filemap.c       Mon May 21 20:03:03 2001
+++ linux-akpm/mm/filemap.c     Tue May 22 22:34:41 2001
@@ -2571,11 +2571,13 @@
         *      Linus frestrict idea will clean these up nicely..
         */
         
-       if (pos > inode->i_sb->s_maxbytes)
-       {
-               send_sig(SIGXFSZ, current, 0);
-               err = -EFBIG;
-               goto out;       
+       if (pos >= inode->i_sb->s_maxbytes) {
+               if (count || pos > inode->i_sb->s_maxbytes) {
+                       send_sig(SIGXFSZ, current, 0);
+                       err = -EFBIG;
+                       goto out;
+               }
+               /* zero-length writes at ->s_maxbytes are OK */
        }
 
        if (pos + count > inode->i_sb->s_maxbytes)
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to