소스 검색

Merge tag 'for-f2fs-v4.13-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/jaegeuk/f2fs

Pull f2fs fixes from Jaegeuk Kim:
 "We've filed some bug fixes:

   - missing f2fs case in terms of stale SGID bit, introduced by Jan

   - build error for seq_file.h

   - avoid cpu lockup

   - wrong inode_unlock in error case"

* tag 'for-f2fs-v4.13-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/jaegeuk/f2fs:
  f2fs: avoid cpu lockup
  f2fs: include seq_file.h for sysfs.c
  f2fs: Don't clear SGID when inheriting ACLs
  f2fs: remove extra inode_unlock() in error path
Linus Torvalds 8 년 전
부모
커밋
465b0dbb38
4개의 변경된 파일13개의 추가작업 그리고 5개의 파일을 삭제
  1. 1 1
      fs/f2fs/acl.c
  2. 10 0
      fs/f2fs/checkpoint.c
  3. 1 4
      fs/f2fs/file.c
  4. 1 0
      fs/f2fs/sysfs.c

+ 1 - 1
fs/f2fs/acl.c

@@ -211,7 +211,7 @@ static int __f2fs_set_acl(struct inode *inode, int type,
 	switch (type) {
 	switch (type) {
 	case ACL_TYPE_ACCESS:
 	case ACL_TYPE_ACCESS:
 		name_index = F2FS_XATTR_INDEX_POSIX_ACL_ACCESS;
 		name_index = F2FS_XATTR_INDEX_POSIX_ACL_ACCESS;
-		if (acl) {
+		if (acl && !ipage) {
 			error = posix_acl_update_mode(inode, &inode->i_mode, &acl);
 			error = posix_acl_update_mode(inode, &inode->i_mode, &acl);
 			if (error)
 			if (error)
 				return error;
 				return error;

+ 10 - 0
fs/f2fs/checkpoint.c

@@ -879,6 +879,7 @@ int sync_dirty_inodes(struct f2fs_sb_info *sbi, enum inode_type type)
 	struct inode *inode;
 	struct inode *inode;
 	struct f2fs_inode_info *fi;
 	struct f2fs_inode_info *fi;
 	bool is_dir = (type == DIR_INODE);
 	bool is_dir = (type == DIR_INODE);
+	unsigned long ino = 0;
 
 
 	trace_f2fs_sync_dirty_inodes_enter(sbi->sb, is_dir,
 	trace_f2fs_sync_dirty_inodes_enter(sbi->sb, is_dir,
 				get_pages(sbi, is_dir ?
 				get_pages(sbi, is_dir ?
@@ -901,8 +902,17 @@ retry:
 	inode = igrab(&fi->vfs_inode);
 	inode = igrab(&fi->vfs_inode);
 	spin_unlock(&sbi->inode_lock[type]);
 	spin_unlock(&sbi->inode_lock[type]);
 	if (inode) {
 	if (inode) {
+		unsigned long cur_ino = inode->i_ino;
+
 		filemap_fdatawrite(inode->i_mapping);
 		filemap_fdatawrite(inode->i_mapping);
 		iput(inode);
 		iput(inode);
+		/* We need to give cpu to another writers. */
+		if (ino == cur_ino) {
+			congestion_wait(BLK_RW_ASYNC, HZ/50);
+			cond_resched();
+		} else {
+			ino = cur_ino;
+		}
 	} else {
 	} else {
 		/*
 		/*
 		 * We should submit bio, since it exists several
 		 * We should submit bio, since it exists several

+ 1 - 4
fs/f2fs/file.c

@@ -1538,7 +1538,6 @@ static int f2fs_ioc_setflags(struct file *filp, unsigned long arg)
 
 
 	/* Is it quota file? Do not allow user to mess with it */
 	/* Is it quota file? Do not allow user to mess with it */
 	if (IS_NOQUOTA(inode)) {
 	if (IS_NOQUOTA(inode)) {
-		inode_unlock(inode);
 		ret = -EPERM;
 		ret = -EPERM;
 		goto unlock_out;
 		goto unlock_out;
 	}
 	}
@@ -1549,9 +1548,8 @@ static int f2fs_ioc_setflags(struct file *filp, unsigned long arg)
 
 
 	if ((flags ^ oldflags) & (FS_APPEND_FL | FS_IMMUTABLE_FL)) {
 	if ((flags ^ oldflags) & (FS_APPEND_FL | FS_IMMUTABLE_FL)) {
 		if (!capable(CAP_LINUX_IMMUTABLE)) {
 		if (!capable(CAP_LINUX_IMMUTABLE)) {
-			inode_unlock(inode);
 			ret = -EPERM;
 			ret = -EPERM;
-			goto out;
+			goto unlock_out;
 		}
 		}
 	}
 	}
 
 
@@ -1564,7 +1562,6 @@ static int f2fs_ioc_setflags(struct file *filp, unsigned long arg)
 	f2fs_mark_inode_dirty_sync(inode, false);
 	f2fs_mark_inode_dirty_sync(inode, false);
 unlock_out:
 unlock_out:
 	inode_unlock(inode);
 	inode_unlock(inode);
-out:
 	mnt_drop_write_file(filp);
 	mnt_drop_write_file(filp);
 	return ret;
 	return ret;
 }
 }

+ 1 - 0
fs/f2fs/sysfs.c

@@ -11,6 +11,7 @@
  */
  */
 #include <linux/proc_fs.h>
 #include <linux/proc_fs.h>
 #include <linux/f2fs_fs.h>
 #include <linux/f2fs_fs.h>
+#include <linux/seq_file.h>
 
 
 #include "f2fs.h"
 #include "f2fs.h"
 #include "segment.h"
 #include "segment.h"