From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752941AbbDDTNl (ORCPT ); Sat, 4 Apr 2015 15:13:41 -0400 Received: from mailhub.sw.ru ([195.214.232.25]:34551 "EHLO relay.sw.ru" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752522AbbDDTNj (ORCPT ); Sat, 4 Apr 2015 15:13:39 -0400 From: Dmitry Monakhov To: linux-kernel@vger.kernel.org Cc: linux-fsdevel@vger.kernel.org, viro@zeniv.linux.org.uk, Dmitry Monakhov Subject: [PATCH 00/16] fs: fixup racy check file->f_flags for xxx_write_iter Date: Sat, 4 Apr 2015 23:13:09 +0400 Message-Id: <1428174805-853-1-git-send-email-dmonakhov@openvz.org> X-Mailer: git-send-email 1.9.3 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org There are many places inside vfs/fs where code flow depends on file->f_flags, but this check is racy because one can change it via fcntl(,F_SETFL,) For example O_DIRECT usually flag checked twice: xxx_file_write_iter -> check O_DIRECT, and perform some optimizations ->__generic_file_write_iter -> check O_DIRECT, which may break things: for example http://www.spinics.net/lists/linux-ext4/msg45683.html For that reason some filesystems simply do not use __generic_file_write_iter() wihch result in code duplication. Right way to fix this is to save volatile flags inside kiocb->ki_flags similar to ->ki_pos Other private discussion: message-id:20141218105101.GD13705@quack.suse.cz TOC: ##First two patches introduce helpers and update generic code kiocb_flags-v1/0001-fs-save-file-f_flags-to-kiocb-ki_flags.patch kiocb_flags-v1/0002-vfs-check-kiocb-ki_flags-instead-filp-fl_flags.patch ## Switch filesystems to kiocb->ki_flags kiocb_flags-v1/0003-ext4-use-is_xxx_kiocb-instead-of-filp-fl_flags.patch kiocb_flags-v1/0004-9p-use-is_xxx_kiocb-instead-of-filp-fl_flags.patch kiocb_flags-v1/0005-btrfs-use-is_xxx_kiocb-instead-of-filp-fl_flags.patch kiocb_flags-v1/0006-ceph-use-is_xxx_kiocb-instead-of-filp-fl_flags.patch kiocb_flags-v1/0007-cifs-use-is_xxx_kiocb-instead-of-filp-fl_flags.patch kiocb_flags-v1/0008-gfs2-use-is_xxx_kiocb-instead-of-filp-fl_flags.patch kiocb_flags-v1/0009-nfs-use-is_xxx_kiocb-instead-of-filp-fl_flags.patch kiocb_flags-v1/0010-ntfs-use-is_xxx_kiocb-instead-of-filp-fl_flags.patch kiocb_flags-v1/0011-ocfs2-use-is_xxx_kiocb-instead-of-filp-fl_flags.patch kiocb_flags-v1/0012-udf-use-is_xxx_kiocb-instead-of-filp-fl_flags.patch kiocb_flags-v1/0013-xfs-use-is_xxx_kiocb-instead-of-filp-fl_flags.patch kiocb_flags-v1/0014-fuse-use-is_xxx_kiocb-instead-of-filp-fl_flags.patch ## Fix pipe and splice issues caused by race with fcntl(,F_SETFL,) kiocb_flags-v1/0015-pipe-use-is_xxx_kiocb-instead-of-filp-fl_flags.patch kiocb_flags-v1/0016-splice-fix-race-beween-splice_write-vs-fcntl-F_SETFL.patch Patch set survived basic run of xfstests