Commit 17973f5a authored by Micah Cowan's avatar Micah Cowan Committed by Linus Torvalds

Only send SIGXFSZ when exceeding rlimits.

Some users have been having problems with utilities like cp or dd dumping
core when they try to copy a file that's too large for the destination
filesystem (typically, > 4gb).  Apparently, some defunct standards required
SIGXFSZ to be sent in such circumstances, but SUS only requires/allows it
for when a written file exceeds the process's resource limits.  I'd like to
limit SIGXFSZs to the bare minimum required by SUS.

Patch sent per http://lkml.org/lkml/2007/4/10/302Signed-off-by: default avatarMicah Cowan <micahcowan@ubuntu.com>
Acked-by: default avatarAlan Cox <alan@redhat.com>
Cc: <reiserfs-dev@namesys.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 1e3e8d91
...@@ -203,7 +203,6 @@ ncp_file_write(struct file *file, const char __user *buf, size_t count, loff_t * ...@@ -203,7 +203,6 @@ ncp_file_write(struct file *file, const char __user *buf, size_t count, loff_t *
if (pos + count > MAX_NON_LFS && !(file->f_flags&O_LARGEFILE)) { if (pos + count > MAX_NON_LFS && !(file->f_flags&O_LARGEFILE)) {
if (pos >= MAX_NON_LFS) { if (pos >= MAX_NON_LFS) {
send_sig(SIGXFSZ, current, 0);
return -EFBIG; return -EFBIG;
} }
if (count > MAX_NON_LFS - (u32)pos) { if (count > MAX_NON_LFS - (u32)pos) {
...@@ -212,7 +211,6 @@ ncp_file_write(struct file *file, const char __user *buf, size_t count, loff_t * ...@@ -212,7 +211,6 @@ ncp_file_write(struct file *file, const char __user *buf, size_t count, loff_t *
} }
if (pos >= inode->i_sb->s_maxbytes) { if (pos >= inode->i_sb->s_maxbytes) {
if (count || pos > inode->i_sb->s_maxbytes) { if (count || pos > inode->i_sb->s_maxbytes) {
send_sig(SIGXFSZ, current, 0);
return -EFBIG; return -EFBIG;
} }
} }
......
...@@ -1305,7 +1305,6 @@ static ssize_t reiserfs_file_write(struct file *file, /* the file we are going t ...@@ -1305,7 +1305,6 @@ static ssize_t reiserfs_file_write(struct file *file, /* the file we are going t
if (get_inode_item_key_version (inode) == KEY_FORMAT_3_5 && if (get_inode_item_key_version (inode) == KEY_FORMAT_3_5 &&
*ppos + count > MAX_NON_LFS) { *ppos + count > MAX_NON_LFS) {
if (*ppos >= MAX_NON_LFS) { if (*ppos >= MAX_NON_LFS) {
send_sig(SIGXFSZ, current, 0);
return -EFBIG; return -EFBIG;
} }
if (count > MAX_NON_LFS - (unsigned long)*ppos) if (count > MAX_NON_LFS - (unsigned long)*ppos)
......
...@@ -1967,7 +1967,6 @@ inline int generic_write_checks(struct file *file, loff_t *pos, size_t *count, i ...@@ -1967,7 +1967,6 @@ inline int generic_write_checks(struct file *file, loff_t *pos, size_t *count, i
if (unlikely(*pos + *count > MAX_NON_LFS && if (unlikely(*pos + *count > MAX_NON_LFS &&
!(file->f_flags & O_LARGEFILE))) { !(file->f_flags & O_LARGEFILE))) {
if (*pos >= MAX_NON_LFS) { if (*pos >= MAX_NON_LFS) {
send_sig(SIGXFSZ, current, 0);
return -EFBIG; return -EFBIG;
} }
if (*count > MAX_NON_LFS - (unsigned long)*pos) { if (*count > MAX_NON_LFS - (unsigned long)*pos) {
...@@ -1985,7 +1984,6 @@ inline int generic_write_checks(struct file *file, loff_t *pos, size_t *count, i ...@@ -1985,7 +1984,6 @@ inline int generic_write_checks(struct file *file, loff_t *pos, size_t *count, i
if (likely(!isblk)) { if (likely(!isblk)) {
if (unlikely(*pos >= inode->i_sb->s_maxbytes)) { if (unlikely(*pos >= inode->i_sb->s_maxbytes)) {
if (*count || *pos > inode->i_sb->s_maxbytes) { if (*count || *pos > inode->i_sb->s_maxbytes) {
send_sig(SIGXFSZ, current, 0);
return -EFBIG; return -EFBIG;
} }
/* zero-length writes at ->s_maxbytes are OK */ /* zero-length writes at ->s_maxbytes are OK */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment