Merge tag 'fs_for_v5.2-rc1' of ssh://gitolite.kernel.org/pub/scm/linux/kernel/git/jack/linux-fs
Pull misc filesystem updates from Jan Kara: "A couple of small bugfixes and cleanups for quota, udf, ext2, and reiserfs" * tag 'fs_for_v5.2-rc1' of ssh://gitolite.kernel.org/pub/scm/linux/kernel/git/jack/linux-fs: quota: check time limit when back out space/inode change fs/quota: erase unused but set variable warning quota: fix wrong indentation udf: fix an uninitialized read bug and remove dead code fs/reiserfs/journal.c: Make remove_journal_hash static quota: remove trailing whitespaces quota: code cleanup for __dquot_alloc_space() ext2: Adjust the comment of function ext2_alloc_branch udf: Explain handling of load_nls() failure
This commit is contained in:
@@ -451,7 +451,9 @@ failed_out:
|
|||||||
/**
|
/**
|
||||||
* ext2_alloc_branch - allocate and set up a chain of blocks.
|
* ext2_alloc_branch - allocate and set up a chain of blocks.
|
||||||
* @inode: owner
|
* @inode: owner
|
||||||
* @num: depth of the chain (number of blocks to allocate)
|
* @indirect_blks: depth of the chain (number of blocks to allocate)
|
||||||
|
* @blks: number of allocated direct blocks
|
||||||
|
* @goal: preferred place for allocation
|
||||||
* @offsets: offsets (in the blocks) to store the pointers to next.
|
* @offsets: offsets (in the blocks) to store the pointers to next.
|
||||||
* @branch: place to store the chain in.
|
* @branch: place to store the chain in.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
* on the Melbourne quota system as used on BSD derived systems. The internal
|
* on the Melbourne quota system as used on BSD derived systems. The internal
|
||||||
* implementation is based on one of the several variants of the LINUX
|
* implementation is based on one of the several variants of the LINUX
|
||||||
* inode-subsystem with added complexity of the diskquota system.
|
* inode-subsystem with added complexity of the diskquota system.
|
||||||
*
|
*
|
||||||
* Author: Marco van Wieringen <mvw@planets.elm.net>
|
* Author: Marco van Wieringen <mvw@planets.elm.net>
|
||||||
*
|
*
|
||||||
* Fixes: Dmitry Gorodchanin <pgmdsg@ibi.com>, 11 Feb 96
|
* Fixes: Dmitry Gorodchanin <pgmdsg@ibi.com>, 11 Feb 96
|
||||||
@@ -51,7 +51,7 @@
|
|||||||
* Added journalled quota support, fix lock inversion problems
|
* Added journalled quota support, fix lock inversion problems
|
||||||
* Jan Kara, <jack@suse.cz>, 2003,2004
|
* Jan Kara, <jack@suse.cz>, 2003,2004
|
||||||
*
|
*
|
||||||
* (C) Copyright 1994 - 1997 Marco van Wieringen
|
* (C) Copyright 1994 - 1997 Marco van Wieringen
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/errno.h>
|
#include <linux/errno.h>
|
||||||
@@ -197,7 +197,7 @@ static struct quota_format_type *find_quota_format(int id)
|
|||||||
int qm;
|
int qm;
|
||||||
|
|
||||||
spin_unlock(&dq_list_lock);
|
spin_unlock(&dq_list_lock);
|
||||||
|
|
||||||
for (qm = 0; module_names[qm].qm_fmt_id &&
|
for (qm = 0; module_names[qm].qm_fmt_id &&
|
||||||
module_names[qm].qm_fmt_id != id; qm++)
|
module_names[qm].qm_fmt_id != id; qm++)
|
||||||
;
|
;
|
||||||
@@ -424,10 +424,11 @@ int dquot_acquire(struct dquot *dquot)
|
|||||||
struct quota_info *dqopt = sb_dqopt(dquot->dq_sb);
|
struct quota_info *dqopt = sb_dqopt(dquot->dq_sb);
|
||||||
|
|
||||||
mutex_lock(&dquot->dq_lock);
|
mutex_lock(&dquot->dq_lock);
|
||||||
if (!test_bit(DQ_READ_B, &dquot->dq_flags))
|
if (!test_bit(DQ_READ_B, &dquot->dq_flags)) {
|
||||||
ret = dqopt->ops[dquot->dq_id.type]->read_dqblk(dquot);
|
ret = dqopt->ops[dquot->dq_id.type]->read_dqblk(dquot);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto out_iolock;
|
goto out_iolock;
|
||||||
|
}
|
||||||
/* Make sure flags update is visible after dquot has been filled */
|
/* Make sure flags update is visible after dquot has been filled */
|
||||||
smp_mb__before_atomic();
|
smp_mb__before_atomic();
|
||||||
set_bit(DQ_READ_B, &dquot->dq_flags);
|
set_bit(DQ_READ_B, &dquot->dq_flags);
|
||||||
@@ -1049,7 +1050,9 @@ static void remove_dquot_ref(struct super_block *sb, int type,
|
|||||||
struct list_head *tofree_head)
|
struct list_head *tofree_head)
|
||||||
{
|
{
|
||||||
struct inode *inode;
|
struct inode *inode;
|
||||||
|
#ifdef CONFIG_QUOTA_DEBUG
|
||||||
int reserved = 0;
|
int reserved = 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
spin_lock(&sb->s_inode_list_lock);
|
spin_lock(&sb->s_inode_list_lock);
|
||||||
list_for_each_entry(inode, &sb->s_inodes, i_sb_list) {
|
list_for_each_entry(inode, &sb->s_inodes, i_sb_list) {
|
||||||
@@ -1061,8 +1064,10 @@ static void remove_dquot_ref(struct super_block *sb, int type,
|
|||||||
*/
|
*/
|
||||||
spin_lock(&dq_data_lock);
|
spin_lock(&dq_data_lock);
|
||||||
if (!IS_NOQUOTA(inode)) {
|
if (!IS_NOQUOTA(inode)) {
|
||||||
|
#ifdef CONFIG_QUOTA_DEBUG
|
||||||
if (unlikely(inode_get_rsv_space(inode) > 0))
|
if (unlikely(inode_get_rsv_space(inode) > 0))
|
||||||
reserved = 1;
|
reserved = 1;
|
||||||
|
#endif
|
||||||
remove_inode_dquot_ref(inode, type, tofree_head);
|
remove_inode_dquot_ref(inode, type, tofree_head);
|
||||||
}
|
}
|
||||||
spin_unlock(&dq_data_lock);
|
spin_unlock(&dq_data_lock);
|
||||||
@@ -1663,7 +1668,7 @@ int __dquot_alloc_space(struct inode *inode, qsize_t number, int flags)
|
|||||||
for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
|
for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
|
||||||
if (!dquots[cnt])
|
if (!dquots[cnt])
|
||||||
continue;
|
continue;
|
||||||
if (flags & DQUOT_SPACE_RESERVE) {
|
if (reserve) {
|
||||||
ret = dquot_add_space(dquots[cnt], 0, number, flags,
|
ret = dquot_add_space(dquots[cnt], 0, number, flags,
|
||||||
&warn[cnt]);
|
&warn[cnt]);
|
||||||
} else {
|
} else {
|
||||||
@@ -1676,13 +1681,11 @@ int __dquot_alloc_space(struct inode *inode, qsize_t number, int flags)
|
|||||||
if (!dquots[cnt])
|
if (!dquots[cnt])
|
||||||
continue;
|
continue;
|
||||||
spin_lock(&dquots[cnt]->dq_dqb_lock);
|
spin_lock(&dquots[cnt]->dq_dqb_lock);
|
||||||
if (flags & DQUOT_SPACE_RESERVE) {
|
if (reserve)
|
||||||
dquots[cnt]->dq_dqb.dqb_rsvspace -=
|
dquot_free_reserved_space(dquots[cnt],
|
||||||
number;
|
number);
|
||||||
} else {
|
else
|
||||||
dquots[cnt]->dq_dqb.dqb_curspace -=
|
dquot_decr_space(dquots[cnt], number);
|
||||||
number;
|
|
||||||
}
|
|
||||||
spin_unlock(&dquots[cnt]->dq_dqb_lock);
|
spin_unlock(&dquots[cnt]->dq_dqb_lock);
|
||||||
}
|
}
|
||||||
spin_unlock(&inode->i_lock);
|
spin_unlock(&inode->i_lock);
|
||||||
@@ -1733,7 +1736,7 @@ int dquot_alloc_inode(struct inode *inode)
|
|||||||
continue;
|
continue;
|
||||||
/* Back out changes we already did */
|
/* Back out changes we already did */
|
||||||
spin_lock(&dquots[cnt]->dq_dqb_lock);
|
spin_lock(&dquots[cnt]->dq_dqb_lock);
|
||||||
dquots[cnt]->dq_dqb.dqb_curinodes--;
|
dquot_decr_inodes(dquots[cnt], 1);
|
||||||
spin_unlock(&dquots[cnt]->dq_dqb_lock);
|
spin_unlock(&dquots[cnt]->dq_dqb_lock);
|
||||||
}
|
}
|
||||||
goto warn_put_all;
|
goto warn_put_all;
|
||||||
@@ -2397,7 +2400,7 @@ out_file_flags:
|
|||||||
out_fmt:
|
out_fmt:
|
||||||
put_quota_format(fmt);
|
put_quota_format(fmt);
|
||||||
|
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Reenable quotas on remount RW */
|
/* Reenable quotas on remount RW */
|
||||||
@@ -2775,7 +2778,7 @@ int dquot_get_state(struct super_block *sb, struct qc_state *state)
|
|||||||
struct qc_type_state *tstate;
|
struct qc_type_state *tstate;
|
||||||
struct quota_info *dqopt = sb_dqopt(sb);
|
struct quota_info *dqopt = sb_dqopt(sb);
|
||||||
int type;
|
int type;
|
||||||
|
|
||||||
memset(state, 0, sizeof(*state));
|
memset(state, 0, sizeof(*state));
|
||||||
for (type = 0; type < MAXQUOTAS; type++) {
|
for (type = 0; type < MAXQUOTAS; type++) {
|
||||||
if (!sb_has_quota_active(sb, type))
|
if (!sb_has_quota_active(sb, type))
|
||||||
|
|||||||
@@ -127,7 +127,7 @@ static int v1_check_quota_file(struct super_block *sb, int type)
|
|||||||
{
|
{
|
||||||
struct inode *inode = sb_dqopt(sb)->files[type];
|
struct inode *inode = sb_dqopt(sb)->files[type];
|
||||||
ulong blocks;
|
ulong blocks;
|
||||||
size_t off;
|
size_t off;
|
||||||
struct v2_disk_dqheader dqhead;
|
struct v2_disk_dqheader dqhead;
|
||||||
ssize_t size;
|
ssize_t size;
|
||||||
loff_t isize;
|
loff_t isize;
|
||||||
|
|||||||
@@ -78,7 +78,7 @@ static int v2_check_quota_file(struct super_block *sb, int type)
|
|||||||
struct v2_disk_dqheader dqhead;
|
struct v2_disk_dqheader dqhead;
|
||||||
static const uint quota_magics[] = V2_INITQMAGICS;
|
static const uint quota_magics[] = V2_INITQMAGICS;
|
||||||
static const uint quota_versions[] = V2_INITQVERSIONS;
|
static const uint quota_versions[] = V2_INITQVERSIONS;
|
||||||
|
|
||||||
if (v2_read_header(sb, type, &dqhead))
|
if (v2_read_header(sb, type, &dqhead))
|
||||||
return 0;
|
return 0;
|
||||||
if (le32_to_cpu(dqhead.dqh_magic) != quota_magics[type] ||
|
if (le32_to_cpu(dqhead.dqh_magic) != quota_magics[type] ||
|
||||||
|
|||||||
@@ -1844,7 +1844,7 @@ static int flush_used_journal_lists(struct super_block *s,
|
|||||||
* removes any nodes in table with name block and dev as bh.
|
* removes any nodes in table with name block and dev as bh.
|
||||||
* only touchs the hnext and hprev pointers.
|
* only touchs the hnext and hprev pointers.
|
||||||
*/
|
*/
|
||||||
void remove_journal_hash(struct super_block *sb,
|
static void remove_journal_hash(struct super_block *sb,
|
||||||
struct reiserfs_journal_cnode **table,
|
struct reiserfs_journal_cnode **table,
|
||||||
struct reiserfs_journal_list *jl,
|
struct reiserfs_journal_list *jl,
|
||||||
unsigned long block, int remove_freed)
|
unsigned long block, int remove_freed)
|
||||||
|
|||||||
@@ -304,21 +304,6 @@ static struct dentry *udf_lookup(struct inode *dir, struct dentry *dentry,
|
|||||||
if (dentry->d_name.len > UDF_NAME_LEN)
|
if (dentry->d_name.len > UDF_NAME_LEN)
|
||||||
return ERR_PTR(-ENAMETOOLONG);
|
return ERR_PTR(-ENAMETOOLONG);
|
||||||
|
|
||||||
#ifdef UDF_RECOVERY
|
|
||||||
/* temporary shorthand for specifying files by inode number */
|
|
||||||
if (!strncmp(dentry->d_name.name, ".B=", 3)) {
|
|
||||||
struct kernel_lb_addr lb = {
|
|
||||||
.logicalBlockNum = 0,
|
|
||||||
.partitionReferenceNum =
|
|
||||||
simple_strtoul(dentry->d_name.name + 3,
|
|
||||||
NULL, 0),
|
|
||||||
};
|
|
||||||
inode = udf_iget(dir->i_sb, lb);
|
|
||||||
if (IS_ERR(inode))
|
|
||||||
return inode;
|
|
||||||
} else
|
|
||||||
#endif /* UDF_RECOVERY */
|
|
||||||
|
|
||||||
fi = udf_find_entry(dir, &dentry->d_name, &fibh, &cfi);
|
fi = udf_find_entry(dir, &dentry->d_name, &fibh, &cfi);
|
||||||
if (IS_ERR(fi))
|
if (IS_ERR(fi))
|
||||||
return ERR_CAST(fi);
|
return ERR_CAST(fi);
|
||||||
|
|||||||
@@ -566,6 +566,11 @@ static int udf_parse_options(char *options, struct udf_options *uopt,
|
|||||||
if (!remount) {
|
if (!remount) {
|
||||||
if (uopt->nls_map)
|
if (uopt->nls_map)
|
||||||
unload_nls(uopt->nls_map);
|
unload_nls(uopt->nls_map);
|
||||||
|
/*
|
||||||
|
* load_nls() failure is handled later in
|
||||||
|
* udf_fill_super() after all options are
|
||||||
|
* parsed.
|
||||||
|
*/
|
||||||
uopt->nls_map = load_nls(args[0].from);
|
uopt->nls_map = load_nls(args[0].from);
|
||||||
uopt->flags |= (1 << UDF_FLAG_NLS_MAP);
|
uopt->flags |= (1 << UDF_FLAG_NLS_MAP);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user