On 3/3/15 4:38 AM, Jan Kara wrote: > Currently XFS calls file_remove_privs() without holding i_mutex. This is > wrong because that function can end up messing with file permissions and > security xattrs for which we need i_mutex held. > > Fix the problem by grabbing iolock exclusively when we will need to > change anything in permissions / xattrs. > > Signed-off-by: Jan Kara <jack@xxxxxxx> This seems like it stands alone, modulo the file_remove_privs function renaming... should it just be pulled into XFS by Dave? I guess that would require the renaming patch to be rebased... Thanks, -Eric > --- > fs/xfs/xfs_file.c | 11 ++++++++++- > 1 file changed, 10 insertions(+), 1 deletion(-) > > diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c > index fa81a43702ee..3d601e92bd44 100644 > --- a/fs/xfs/xfs_file.c > +++ b/fs/xfs/xfs_file.c > @@ -563,6 +563,13 @@ restart: > if (error) > return error; > > + /* For changing security info in file_remove_privs() we need i_mutex */ > + if (*iolock == XFS_IOLOCK_SHARED && !IS_NOSEC(inode)) { > + xfs_rw_iunlock(ip, *iolock); > + *iolock = XFS_IOLOCK_EXCL; > + xfs_rw_ilock(ip, *iolock); > + goto restart; > + } > /* > * If the offset is beyond the size of the file, we need to zero any > * blocks that fall between the existing EOF and the start of this > @@ -601,7 +608,9 @@ restart: > * setgid bits if the process is not being run by root. This keeps > * people from modifying setuid and setgid binaries. > */ > - return file_remove_privs(file); > + if (!IS_NOSEC(inode)) > + return file_remove_privs(file); > + return 0; > } > > /* > -- To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html