mirror of
https://github.com/Fishwaldo/linux-bl808.git
synced 2025-06-17 20:25:19 +00:00
Some locking and page fault bug fixes from Jan Kara, some ext4
encryption fixes from me, and Li Xi's Project Quota commits. -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 iQEcBAABCAAGBQJWnwkiAAoJEPL5WVaVDYGjyAAH/1dj1nNL9h+d12V3zXbvoPkg 5RFw/2QfMZ+GE3Lln9gxTBDSyo/9m8hUK8eg0WpIRtGX9NbKcyrWEGJa2XF++43k tVpKGyN6cqkwPu4M6EPIK9yRvuALGB5PJE/u0q1lu9VoIAgtin3F/bAQK/iHnrUg M3+lVDtKcmbhqCdocaLLZD6Q4xlQI3wJne99pYt+Dtx95aOQY9v9SV030i7sOnEt R5JrhmfkgNqVTB8Zz0IxOp5LQlOkuyvtnZ44yYgJH8ckCUnDQI2hbksSqcMamJ1Y QJWBzRhVXU9gs1nCRy/Xh48mSk+nvZW9aglk+Syzbzg5C63SgwYcqvbCBqJJEdc= =HjkT -----END PGP SIGNATURE----- Merge tag 'ext4_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tytso/ext4 Pull ext4 updates from Ted Ts'o: "Some locking and page fault bug fixes from Jan Kara, some ext4 encryption fixes from me, and Li Xi's Project Quota commits" * tag 'ext4_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tytso/ext4: fs: clean up the flags definition in uapi/linux/fs.h ext4: add FS_IOC_FSSETXATTR/FS_IOC_FSGETXATTR interface support ext4: add project quota support ext4: adds project ID support ext4 crypto: simplify interfaces to directory entry insert functions ext4 crypto: add missing locking for keyring_key access ext4: use pre-zeroed blocks for DAX page faults ext4: implement allocation of pre-zeroed blocks ext4: provide ext4_issue_zeroout() ext4: get rid of EXT4_GET_BLOCKS_NO_LOCK flag ext4: document lock ordering ext4: fix races of writeback with punch hole and zero range ext4: fix races between buffered IO and collapse / insert range ext4: move unlocked dio protection from ext4_alloc_file_blocks() ext4: fix races between page faults and hole punching
This commit is contained in:
commit
391f2a16b7
14 changed files with 895 additions and 276 deletions
|
@ -80,6 +80,36 @@ static void ext4_destroy_lazyinit_thread(void);
|
|||
static void ext4_unregister_li_request(struct super_block *sb);
|
||||
static void ext4_clear_request_list(void);
|
||||
|
||||
/*
|
||||
* Lock ordering
|
||||
*
|
||||
* Note the difference between i_mmap_sem (EXT4_I(inode)->i_mmap_sem) and
|
||||
* i_mmap_rwsem (inode->i_mmap_rwsem)!
|
||||
*
|
||||
* page fault path:
|
||||
* mmap_sem -> sb_start_pagefault -> i_mmap_sem (r) -> transaction start ->
|
||||
* page lock -> i_data_sem (rw)
|
||||
*
|
||||
* buffered write path:
|
||||
* sb_start_write -> i_mutex -> mmap_sem
|
||||
* sb_start_write -> i_mutex -> transaction start -> page lock ->
|
||||
* i_data_sem (rw)
|
||||
*
|
||||
* truncate:
|
||||
* sb_start_write -> i_mutex -> EXT4_STATE_DIOREAD_LOCK (w) -> i_mmap_sem (w) ->
|
||||
* i_mmap_rwsem (w) -> page lock
|
||||
* sb_start_write -> i_mutex -> EXT4_STATE_DIOREAD_LOCK (w) -> i_mmap_sem (w) ->
|
||||
* transaction start -> i_data_sem (rw)
|
||||
*
|
||||
* direct IO:
|
||||
* sb_start_write -> i_mutex -> EXT4_STATE_DIOREAD_LOCK (r) -> mmap_sem
|
||||
* sb_start_write -> i_mutex -> EXT4_STATE_DIOREAD_LOCK (r) ->
|
||||
* transaction start -> i_data_sem (rw)
|
||||
*
|
||||
* writepages:
|
||||
* transaction start -> page lock(s) -> i_data_sem (rw)
|
||||
*/
|
||||
|
||||
#if !defined(CONFIG_EXT2_FS) && !defined(CONFIG_EXT2_FS_MODULE) && defined(CONFIG_EXT4_USE_FOR_EXT2)
|
||||
static struct file_system_type ext2_fs_type = {
|
||||
.owner = THIS_MODULE,
|
||||
|
@ -958,6 +988,7 @@ static void init_once(void *foo)
|
|||
INIT_LIST_HEAD(&ei->i_orphan);
|
||||
init_rwsem(&ei->xattr_sem);
|
||||
init_rwsem(&ei->i_data_sem);
|
||||
init_rwsem(&ei->i_mmap_sem);
|
||||
inode_init_once(&ei->vfs_inode);
|
||||
}
|
||||
|
||||
|
@ -1066,8 +1097,8 @@ static int bdev_try_to_free_page(struct super_block *sb, struct page *page,
|
|||
}
|
||||
|
||||
#ifdef CONFIG_QUOTA
|
||||
#define QTYPE2NAME(t) ((t) == USRQUOTA ? "user" : "group")
|
||||
#define QTYPE2MOPT(on, t) ((t) == USRQUOTA?((on)##USRJQUOTA):((on)##GRPJQUOTA))
|
||||
static char *quotatypes[] = INITQFNAMES;
|
||||
#define QTYPE2NAME(t) (quotatypes[t])
|
||||
|
||||
static int ext4_write_dquot(struct dquot *dquot);
|
||||
static int ext4_acquire_dquot(struct dquot *dquot);
|
||||
|
@ -1100,6 +1131,7 @@ static const struct dquot_operations ext4_quota_operations = {
|
|||
.write_info = ext4_write_info,
|
||||
.alloc_dquot = dquot_alloc,
|
||||
.destroy_dquot = dquot_destroy,
|
||||
.get_projid = ext4_get_projid,
|
||||
};
|
||||
|
||||
static const struct quotactl_ops ext4_qctl_operations = {
|
||||
|
@ -2526,6 +2558,12 @@ static int ext4_feature_set_ok(struct super_block *sb, int readonly)
|
|||
"without CONFIG_QUOTA");
|
||||
return 0;
|
||||
}
|
||||
if (ext4_has_feature_project(sb) && !readonly) {
|
||||
ext4_msg(sb, KERN_ERR,
|
||||
"Filesystem with project quota feature cannot be mounted RDWR "
|
||||
"without CONFIG_QUOTA");
|
||||
return 0;
|
||||
}
|
||||
#endif /* CONFIG_QUOTA */
|
||||
return 1;
|
||||
}
|
||||
|
@ -3654,7 +3692,7 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent)
|
|||
sb->s_qcop = &dquot_quotactl_sysfile_ops;
|
||||
else
|
||||
sb->s_qcop = &ext4_qctl_operations;
|
||||
sb->s_quota_types = QTYPE_MASK_USR | QTYPE_MASK_GRP;
|
||||
sb->s_quota_types = QTYPE_MASK_USR | QTYPE_MASK_GRP | QTYPE_MASK_PRJ;
|
||||
#endif
|
||||
memcpy(sb->s_uuid, es->s_uuid, sizeof(es->s_uuid));
|
||||
|
||||
|
@ -4790,6 +4828,48 @@ restore_opts:
|
|||
return err;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_QUOTA
|
||||
static int ext4_statfs_project(struct super_block *sb,
|
||||
kprojid_t projid, struct kstatfs *buf)
|
||||
{
|
||||
struct kqid qid;
|
||||
struct dquot *dquot;
|
||||
u64 limit;
|
||||
u64 curblock;
|
||||
|
||||
qid = make_kqid_projid(projid);
|
||||
dquot = dqget(sb, qid);
|
||||
if (IS_ERR(dquot))
|
||||
return PTR_ERR(dquot);
|
||||
spin_lock(&dq_data_lock);
|
||||
|
||||
limit = (dquot->dq_dqb.dqb_bsoftlimit ?
|
||||
dquot->dq_dqb.dqb_bsoftlimit :
|
||||
dquot->dq_dqb.dqb_bhardlimit) >> sb->s_blocksize_bits;
|
||||
if (limit && buf->f_blocks > limit) {
|
||||
curblock = dquot->dq_dqb.dqb_curspace >> sb->s_blocksize_bits;
|
||||
buf->f_blocks = limit;
|
||||
buf->f_bfree = buf->f_bavail =
|
||||
(buf->f_blocks > curblock) ?
|
||||
(buf->f_blocks - curblock) : 0;
|
||||
}
|
||||
|
||||
limit = dquot->dq_dqb.dqb_isoftlimit ?
|
||||
dquot->dq_dqb.dqb_isoftlimit :
|
||||
dquot->dq_dqb.dqb_ihardlimit;
|
||||
if (limit && buf->f_files > limit) {
|
||||
buf->f_files = limit;
|
||||
buf->f_ffree =
|
||||
(buf->f_files > dquot->dq_dqb.dqb_curinodes) ?
|
||||
(buf->f_files - dquot->dq_dqb.dqb_curinodes) : 0;
|
||||
}
|
||||
|
||||
spin_unlock(&dq_data_lock);
|
||||
dqput(dquot);
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
static int ext4_statfs(struct dentry *dentry, struct kstatfs *buf)
|
||||
{
|
||||
struct super_block *sb = dentry->d_sb;
|
||||
|
@ -4822,6 +4902,11 @@ static int ext4_statfs(struct dentry *dentry, struct kstatfs *buf)
|
|||
buf->f_fsid.val[0] = fsid & 0xFFFFFFFFUL;
|
||||
buf->f_fsid.val[1] = (fsid >> 32) & 0xFFFFFFFFUL;
|
||||
|
||||
#ifdef CONFIG_QUOTA
|
||||
if (ext4_test_inode_flag(dentry->d_inode, EXT4_INODE_PROJINHERIT) &&
|
||||
sb_has_quota_limits_enabled(sb, PRJQUOTA))
|
||||
ext4_statfs_project(sb, EXT4_I(dentry->d_inode)->i_projid, buf);
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -4986,7 +5071,8 @@ static int ext4_quota_enable(struct super_block *sb, int type, int format_id,
|
|||
struct inode *qf_inode;
|
||||
unsigned long qf_inums[EXT4_MAXQUOTAS] = {
|
||||
le32_to_cpu(EXT4_SB(sb)->s_es->s_usr_quota_inum),
|
||||
le32_to_cpu(EXT4_SB(sb)->s_es->s_grp_quota_inum)
|
||||
le32_to_cpu(EXT4_SB(sb)->s_es->s_grp_quota_inum),
|
||||
le32_to_cpu(EXT4_SB(sb)->s_es->s_prj_quota_inum)
|
||||
};
|
||||
|
||||
BUG_ON(!ext4_has_feature_quota(sb));
|
||||
|
@ -5014,7 +5100,8 @@ static int ext4_enable_quotas(struct super_block *sb)
|
|||
int type, err = 0;
|
||||
unsigned long qf_inums[EXT4_MAXQUOTAS] = {
|
||||
le32_to_cpu(EXT4_SB(sb)->s_es->s_usr_quota_inum),
|
||||
le32_to_cpu(EXT4_SB(sb)->s_es->s_grp_quota_inum)
|
||||
le32_to_cpu(EXT4_SB(sb)->s_es->s_grp_quota_inum),
|
||||
le32_to_cpu(EXT4_SB(sb)->s_es->s_prj_quota_inum)
|
||||
};
|
||||
|
||||
sb_dqopt(sb)->flags |= DQUOT_QUOTA_SYS_FILE;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue