Commit cec99709 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jack/linux-fs

Pull quota, reiserfs, UDF updates from Jan Kara:
 "Scalability improvements for quota, a few reiserfs fixes, and couple
  of misc cleanups (udf, ext2)"

* 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jack/linux-fs:
  reiserfs: Fix use after free in journal teardown
  reiserfs: fix corruption introduced by balance_leaf refactor
  udf: avoid redundant memcpy when writing data in ICB
  fs/udf: re-use hex_asc_upper_{hi,lo} macros
  fs/quota: kernel-doc warning fixes
  udf: use linux/uaccess.h
  fs/ext2/super.c: Drop memory allocation cast
  quota: remove dqptr_sem
  quota: simplify remove_inode_dquot_ref()
  quota: avoid unnecessary dqget()/dqput() calls
  quota: protect Q_GETFMT by dqonoff_mutex
parents 8d2d441a 01777836
...@@ -161,7 +161,7 @@ static struct kmem_cache * ext2_inode_cachep; ...@@ -161,7 +161,7 @@ static struct kmem_cache * ext2_inode_cachep;
static struct inode *ext2_alloc_inode(struct super_block *sb) static struct inode *ext2_alloc_inode(struct super_block *sb)
{ {
struct ext2_inode_info *ei; struct ext2_inode_info *ei;
ei = (struct ext2_inode_info *)kmem_cache_alloc(ext2_inode_cachep, GFP_KERNEL); ei = kmem_cache_alloc(ext2_inode_cachep, GFP_KERNEL);
if (!ei) if (!ei)
return NULL; return NULL;
ei->i_block_alloc_info = NULL; ei->i_block_alloc_info = NULL;
......
This diff is collapsed.
...@@ -55,7 +55,7 @@ EXPORT_SYMBOL(qid_lt); ...@@ -55,7 +55,7 @@ EXPORT_SYMBOL(qid_lt);
/** /**
* from_kqid - Create a qid from a kqid user-namespace pair. * from_kqid - Create a qid from a kqid user-namespace pair.
* @targ: The user namespace we want a qid in. * @targ: The user namespace we want a qid in.
* @kuid: The kernel internal quota identifier to start with. * @kqid: The kernel internal quota identifier to start with.
* *
* Map @kqid into the user-namespace specified by @targ and * Map @kqid into the user-namespace specified by @targ and
* return the resulting qid. * return the resulting qid.
......
...@@ -32,8 +32,7 @@ static struct genl_family quota_genl_family = { ...@@ -32,8 +32,7 @@ static struct genl_family quota_genl_family = {
/** /**
* quota_send_warning - Send warning to userspace about exceeded quota * quota_send_warning - Send warning to userspace about exceeded quota
* @type: The quota type: USRQQUOTA, GRPQUOTA,... * @qid: The kernel internal quota identifier.
* @id: The user or group id of the quota that was exceeded
* @dev: The device on which the fs is mounted (sb->s_dev) * @dev: The device on which the fs is mounted (sb->s_dev)
* @warntype: The type of the warning: QUOTA_NL_... * @warntype: The type of the warning: QUOTA_NL_...
* *
......
...@@ -79,13 +79,13 @@ static int quota_getfmt(struct super_block *sb, int type, void __user *addr) ...@@ -79,13 +79,13 @@ static int quota_getfmt(struct super_block *sb, int type, void __user *addr)
{ {
__u32 fmt; __u32 fmt;
down_read(&sb_dqopt(sb)->dqptr_sem); mutex_lock(&sb_dqopt(sb)->dqonoff_mutex);
if (!sb_has_quota_active(sb, type)) { if (!sb_has_quota_active(sb, type)) {
up_read(&sb_dqopt(sb)->dqptr_sem); mutex_unlock(&sb_dqopt(sb)->dqonoff_mutex);
return -ESRCH; return -ESRCH;
} }
fmt = sb_dqopt(sb)->info[type].dqi_format->qf_fmt_id; fmt = sb_dqopt(sb)->info[type].dqi_format->qf_fmt_id;
up_read(&sb_dqopt(sb)->dqptr_sem); mutex_unlock(&sb_dqopt(sb)->dqonoff_mutex);
if (copy_to_user(addr, &fmt, sizeof(fmt))) if (copy_to_user(addr, &fmt, sizeof(fmt)))
return -EFAULT; return -EFAULT;
return 0; return 0;
......
This diff is collapsed.
...@@ -1947,8 +1947,6 @@ static int do_journal_release(struct reiserfs_transaction_handle *th, ...@@ -1947,8 +1947,6 @@ static int do_journal_release(struct reiserfs_transaction_handle *th,
} }
} }
/* wait for all commits to finish */
cancel_delayed_work(&SB_JOURNAL(sb)->j_work);
/* /*
* We must release the write lock here because * We must release the write lock here because
...@@ -1956,8 +1954,14 @@ static int do_journal_release(struct reiserfs_transaction_handle *th, ...@@ -1956,8 +1954,14 @@ static int do_journal_release(struct reiserfs_transaction_handle *th,
*/ */
reiserfs_write_unlock(sb); reiserfs_write_unlock(sb);
/*
* Cancel flushing of old commits. Note that neither of these works
* will be requeued because superblock is being shutdown and doesn't
* have MS_ACTIVE set.
*/
cancel_delayed_work_sync(&REISERFS_SB(sb)->old_work); cancel_delayed_work_sync(&REISERFS_SB(sb)->old_work);
flush_workqueue(REISERFS_SB(sb)->commit_wq); /* wait for all commits to finish */
cancel_delayed_work_sync(&SB_JOURNAL(sb)->j_work);
free_journal_ram(sb); free_journal_ram(sb);
...@@ -4292,9 +4296,15 @@ static int do_journal_end(struct reiserfs_transaction_handle *th, int flags) ...@@ -4292,9 +4296,15 @@ static int do_journal_end(struct reiserfs_transaction_handle *th, int flags)
if (flush) { if (flush) {
flush_commit_list(sb, jl, 1); flush_commit_list(sb, jl, 1);
flush_journal_list(sb, jl, 1); flush_journal_list(sb, jl, 1);
} else if (!(jl->j_state & LIST_COMMIT_PENDING)) } else if (!(jl->j_state & LIST_COMMIT_PENDING)) {
queue_delayed_work(REISERFS_SB(sb)->commit_wq, /*
&journal->j_work, HZ / 10); * Avoid queueing work when sb is being shut down. Transaction
* will be flushed on journal shutdown.
*/
if (sb->s_flags & MS_ACTIVE)
queue_delayed_work(REISERFS_SB(sb)->commit_wq,
&journal->j_work, HZ / 10);
}
/* /*
* if the next transaction has any chance of wrapping, flush * if the next transaction has any chance of wrapping, flush
......
...@@ -899,8 +899,9 @@ void leaf_delete_items(struct buffer_info *cur_bi, int last_first, ...@@ -899,8 +899,9 @@ void leaf_delete_items(struct buffer_info *cur_bi, int last_first,
/* insert item into the leaf node in position before */ /* insert item into the leaf node in position before */
void leaf_insert_into_buf(struct buffer_info *bi, int before, void leaf_insert_into_buf(struct buffer_info *bi, int before,
struct item_head *inserted_item_ih, struct item_head * const inserted_item_ih,
const char *inserted_item_body, int zeros_number) const char * const inserted_item_body,
int zeros_number)
{ {
struct buffer_head *bh = bi->bi_bh; struct buffer_head *bh = bi->bi_bh;
int nr, free_space; int nr, free_space;
......
...@@ -3216,11 +3216,12 @@ int leaf_shift_right(struct tree_balance *tb, int shift_num, int shift_bytes); ...@@ -3216,11 +3216,12 @@ int leaf_shift_right(struct tree_balance *tb, int shift_num, int shift_bytes);
void leaf_delete_items(struct buffer_info *cur_bi, int last_first, int first, void leaf_delete_items(struct buffer_info *cur_bi, int last_first, int first,
int del_num, int del_bytes); int del_num, int del_bytes);
void leaf_insert_into_buf(struct buffer_info *bi, int before, void leaf_insert_into_buf(struct buffer_info *bi, int before,
struct item_head *inserted_item_ih, struct item_head * const inserted_item_ih,
const char *inserted_item_body, int zeros_number); const char * const inserted_item_body,
void leaf_paste_in_buffer(struct buffer_info *bi, int pasted_item_num,
int pos_in_item, int paste_size, const char *body,
int zeros_number); int zeros_number);
void leaf_paste_in_buffer(struct buffer_info *bi, int pasted_item_num,
int pos_in_item, int paste_size,
const char * const body, int zeros_number);
void leaf_cut_from_buffer(struct buffer_info *bi, int cut_item_num, void leaf_cut_from_buffer(struct buffer_info *bi, int cut_item_num,
int pos_in_item, int cut_size); int pos_in_item, int cut_size);
void leaf_paste_entries(struct buffer_info *bi, int item_num, int before, void leaf_paste_entries(struct buffer_info *bi, int item_num, int before,
......
...@@ -100,7 +100,11 @@ void reiserfs_schedule_old_flush(struct super_block *s) ...@@ -100,7 +100,11 @@ void reiserfs_schedule_old_flush(struct super_block *s)
struct reiserfs_sb_info *sbi = REISERFS_SB(s); struct reiserfs_sb_info *sbi = REISERFS_SB(s);
unsigned long delay; unsigned long delay;
if (s->s_flags & MS_RDONLY) /*
* Avoid scheduling flush when sb is being shut down. It can race
* with journal shutdown and free still queued delayed work.
*/
if (s->s_flags & MS_RDONLY || !(s->s_flags & MS_ACTIVE))
return; return;
spin_lock(&sbi->old_work_lock); spin_lock(&sbi->old_work_lock);
......
...@@ -217,7 +217,6 @@ static struct super_block *alloc_super(struct file_system_type *type, int flags) ...@@ -217,7 +217,6 @@ static struct super_block *alloc_super(struct file_system_type *type, int flags)
lockdep_set_class(&s->s_vfs_rename_mutex, &type->s_vfs_rename_key); lockdep_set_class(&s->s_vfs_rename_mutex, &type->s_vfs_rename_key);
mutex_init(&s->s_dquot.dqio_mutex); mutex_init(&s->s_dquot.dqio_mutex);
mutex_init(&s->s_dquot.dqonoff_mutex); mutex_init(&s->s_dquot.dqonoff_mutex);
init_rwsem(&s->s_dquot.dqptr_sem);
s->s_maxbytes = MAX_NON_LFS; s->s_maxbytes = MAX_NON_LFS;
s->s_op = &default_op; s->s_op = &default_op;
s->s_time_gran = 1000000000; s->s_time_gran = 1000000000;
......
...@@ -27,7 +27,7 @@ ...@@ -27,7 +27,7 @@
#include "udfdecl.h" #include "udfdecl.h"
#include <linux/fs.h> #include <linux/fs.h>
#include <asm/uaccess.h> #include <linux/uaccess.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/string.h> /* memset */ #include <linux/string.h> /* memset */
#include <linux/capability.h> #include <linux/capability.h>
...@@ -100,24 +100,6 @@ static int udf_adinicb_write_begin(struct file *file, ...@@ -100,24 +100,6 @@ static int udf_adinicb_write_begin(struct file *file,
return 0; return 0;
} }
static int udf_adinicb_write_end(struct file *file,
struct address_space *mapping,
loff_t pos, unsigned len, unsigned copied,
struct page *page, void *fsdata)
{
struct inode *inode = mapping->host;
unsigned offset = pos & (PAGE_CACHE_SIZE - 1);
char *kaddr;
struct udf_inode_info *iinfo = UDF_I(inode);
kaddr = kmap_atomic(page);
memcpy(iinfo->i_ext.i_data + iinfo->i_lenEAttr + offset,
kaddr + offset, copied);
kunmap_atomic(kaddr);
return simple_write_end(file, mapping, pos, len, copied, page, fsdata);
}
static ssize_t udf_adinicb_direct_IO(int rw, struct kiocb *iocb, static ssize_t udf_adinicb_direct_IO(int rw, struct kiocb *iocb,
struct iov_iter *iter, struct iov_iter *iter,
loff_t offset) loff_t offset)
...@@ -130,7 +112,7 @@ const struct address_space_operations udf_adinicb_aops = { ...@@ -130,7 +112,7 @@ const struct address_space_operations udf_adinicb_aops = {
.readpage = udf_adinicb_readpage, .readpage = udf_adinicb_readpage,
.writepage = udf_adinicb_writepage, .writepage = udf_adinicb_writepage,
.write_begin = udf_adinicb_write_begin, .write_begin = udf_adinicb_write_begin,
.write_end = udf_adinicb_write_end, .write_end = simple_write_end,
.direct_IO = udf_adinicb_direct_IO, .direct_IO = udf_adinicb_direct_IO,
}; };
......
...@@ -21,7 +21,7 @@ ...@@ -21,7 +21,7 @@
#include <linux/blkdev.h> #include <linux/blkdev.h>
#include <linux/cdrom.h> #include <linux/cdrom.h>
#include <asm/uaccess.h> #include <linux/uaccess.h>
#include "udf_sb.h" #include "udf_sb.h"
......
...@@ -63,7 +63,7 @@ ...@@ -63,7 +63,7 @@
#include "udf_i.h" #include "udf_i.h"
#include <linux/init.h> #include <linux/init.h>
#include <asm/uaccess.h> #include <linux/uaccess.h>
#define VDS_POS_PRIMARY_VOL_DESC 0 #define VDS_POS_PRIMARY_VOL_DESC 0
#define VDS_POS_UNALLOC_SPACE_DESC 1 #define VDS_POS_UNALLOC_SPACE_DESC 1
......
...@@ -20,7 +20,7 @@ ...@@ -20,7 +20,7 @@
*/ */
#include "udfdecl.h" #include "udfdecl.h"
#include <asm/uaccess.h> #include <linux/uaccess.h>
#include <linux/errno.h> #include <linux/errno.h>
#include <linux/fs.h> #include <linux/fs.h>
#include <linux/time.h> #include <linux/time.h>
......
...@@ -412,7 +412,6 @@ static int udf_translate_to_linux(uint8_t *newName, uint8_t *udfName, ...@@ -412,7 +412,6 @@ static int udf_translate_to_linux(uint8_t *newName, uint8_t *udfName,
int extIndex = 0, newExtIndex = 0, hasExt = 0; int extIndex = 0, newExtIndex = 0, hasExt = 0;
unsigned short valueCRC; unsigned short valueCRC;
uint8_t curr; uint8_t curr;
const uint8_t hexChar[] = "0123456789ABCDEF";
if (udfName[0] == '.' && if (udfName[0] == '.' &&
(udfLen == 1 || (udfLen == 2 && udfName[1] == '.'))) { (udfLen == 1 || (udfLen == 2 && udfName[1] == '.'))) {
...@@ -477,10 +476,10 @@ static int udf_translate_to_linux(uint8_t *newName, uint8_t *udfName, ...@@ -477,10 +476,10 @@ static int udf_translate_to_linux(uint8_t *newName, uint8_t *udfName,
newIndex = 250; newIndex = 250;
newName[newIndex++] = CRC_MARK; newName[newIndex++] = CRC_MARK;
valueCRC = crc_itu_t(0, fidName, fidNameLen); valueCRC = crc_itu_t(0, fidName, fidNameLen);
newName[newIndex++] = hexChar[(valueCRC & 0xf000) >> 12]; newName[newIndex++] = hex_asc_upper_hi(valueCRC >> 8);
newName[newIndex++] = hexChar[(valueCRC & 0x0f00) >> 8]; newName[newIndex++] = hex_asc_upper_lo(valueCRC >> 8);
newName[newIndex++] = hexChar[(valueCRC & 0x00f0) >> 4]; newName[newIndex++] = hex_asc_upper_hi(valueCRC);
newName[newIndex++] = hexChar[(valueCRC & 0x000f)]; newName[newIndex++] = hex_asc_upper_lo(valueCRC);
if (hasExt) { if (hasExt) {
newName[newIndex++] = EXT_MARK; newName[newIndex++] = EXT_MARK;
......
...@@ -390,7 +390,6 @@ struct quota_info { ...@@ -390,7 +390,6 @@ struct quota_info {
unsigned int flags; /* Flags for diskquotas on this device */ unsigned int flags; /* Flags for diskquotas on this device */
struct mutex dqio_mutex; /* lock device while I/O in progress */ struct mutex dqio_mutex; /* lock device while I/O in progress */
struct mutex dqonoff_mutex; /* Serialize quotaon & quotaoff */ struct mutex dqonoff_mutex; /* Serialize quotaon & quotaoff */
struct rw_semaphore dqptr_sem; /* serialize ops using quota_info struct, pointers from inode to dquots */
struct inode *files[MAXQUOTAS]; /* inodes of quotafiles */ struct inode *files[MAXQUOTAS]; /* inodes of quotafiles */
struct mem_dqinfo info[MAXQUOTAS]; /* Information for each quota type */ struct mem_dqinfo info[MAXQUOTAS]; /* Information for each quota type */
const struct quota_format_ops *ops[MAXQUOTAS]; /* Operations for each type */ const struct quota_format_ops *ops[MAXQUOTAS]; /* Operations for each type */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment