diff options
Diffstat (limited to 'fs/fcntl.c')
| -rw-r--r-- | fs/fcntl.c | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/fs/fcntl.c b/fs/fcntl.c index 5f96786d1c73..dc4a7007f4e7 100644 --- a/fs/fcntl.c +++ b/fs/fcntl.c | |||
| @@ -208,8 +208,11 @@ static int setfl(int fd, struct file * filp, unsigned long arg) | |||
| 208 | struct inode * inode = filp->f_dentry->d_inode; | 208 | struct inode * inode = filp->f_dentry->d_inode; |
| 209 | int error = 0; | 209 | int error = 0; |
| 210 | 210 | ||
| 211 | /* O_APPEND cannot be cleared if the file is marked as append-only */ | 211 | /* |
| 212 | if (!(arg & O_APPEND) && IS_APPEND(inode)) | 212 | * O_APPEND cannot be cleared if the file is marked as append-only |
| 213 | * and the file is open for write. | ||
| 214 | */ | ||
| 215 | if (((arg ^ filp->f_flags) & O_APPEND) && IS_APPEND(inode)) | ||
| 213 | return -EPERM; | 216 | return -EPERM; |
| 214 | 217 | ||
| 215 | /* O_NOATIME can only be set by the owner or superuser */ | 218 | /* O_NOATIME can only be set by the owner or superuser */ |
