[PATCH] fcntl F_SETFL and read-only IS_APPEND files
[linux-2.6-block.git] / fs / fcntl.c
index 5f96786d1c73dc6c9ac27565b521835f6fe5ff12..dc4a7007f4e742c4e30563db78b34bd21d39ab58 100644 (file)
@@ -208,8 +208,11 @@ static int setfl(int fd, struct file * filp, unsigned long arg)
        struct inode * inode = filp->f_dentry->d_inode;
        int error = 0;
 
-       /* O_APPEND cannot be cleared if the file is marked as append-only */
-       if (!(arg & O_APPEND) && IS_APPEND(inode))
+       /*
+        * O_APPEND cannot be cleared if the file is marked as append-only
+        * and the file is open for write.
+        */
+       if (((arg ^ filp->f_flags) & O_APPEND) && IS_APPEND(inode))
                return -EPERM;
 
        /* O_NOATIME can only be set by the owner or superuser */