mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-29 19:21:31 -04:00
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs-2.6
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs-2.6: (96 commits) no need for list_for_each_entry_safe()/resetting with superblock list Fix sget() race with failing mount vfs: don't hold s_umount over close_bdev_exclusive() call sysv: do not mark superblock dirty on remount sysv: do not mark superblock dirty on mount btrfs: remove junk sb_dirt change BFS: clean up the superblock usage AFFS: wait for sb synchronization when needed AFFS: clean up dirty flag usage cifs: truncate fallout mbcache: fix shrinker function return value mbcache: Remove unused features add f_flags to struct statfs(64) pass a struct path to vfs_statfs update VFS documentation for method changes. All filesystems that need invalidate_inode_buffers() are doing that explicitly convert remaining ->clear_inode() to ->evict_inode() Make ->drop_inode() just return whether inode needs to be dropped fs/inode.c:clear_inode() is gone fs/inode.c:evict() doesn't care about delete vs. non-delete paths now ... Fix up trivial conflicts in fs/nilfs2/super.c
This commit is contained in:
commit
5f248c9c25
205 changed files with 2584 additions and 2475 deletions
|
|
@ -38,19 +38,23 @@ static int reiserfs_file_release(struct inode *inode, struct file *filp)
|
|||
|
||||
BUG_ON(!S_ISREG(inode->i_mode));
|
||||
|
||||
/* fast out for when nothing needs to be done */
|
||||
if ((atomic_read(&inode->i_count) > 1 ||
|
||||
!(REISERFS_I(inode)->i_flags & i_pack_on_close_mask) ||
|
||||
!tail_has_to_be_packed(inode)) &&
|
||||
REISERFS_I(inode)->i_prealloc_count <= 0) {
|
||||
if (atomic_add_unless(&REISERFS_I(inode)->openers, -1, 1))
|
||||
return 0;
|
||||
|
||||
mutex_lock(&(REISERFS_I(inode)->tailpack));
|
||||
|
||||
if (!atomic_dec_and_test(&REISERFS_I(inode)->openers)) {
|
||||
mutex_unlock(&(REISERFS_I(inode)->tailpack));
|
||||
return 0;
|
||||
}
|
||||
|
||||
mutex_lock(&inode->i_mutex);
|
||||
|
||||
mutex_lock(&(REISERFS_I(inode)->i_mmap));
|
||||
if (REISERFS_I(inode)->i_flags & i_ever_mapped)
|
||||
REISERFS_I(inode)->i_flags &= ~i_pack_on_close_mask;
|
||||
/* fast out for when nothing needs to be done */
|
||||
if ((!(REISERFS_I(inode)->i_flags & i_pack_on_close_mask) ||
|
||||
!tail_has_to_be_packed(inode)) &&
|
||||
REISERFS_I(inode)->i_prealloc_count <= 0) {
|
||||
mutex_unlock(&(REISERFS_I(inode)->tailpack));
|
||||
return 0;
|
||||
}
|
||||
|
||||
reiserfs_write_lock(inode->i_sb);
|
||||
/* freeing preallocation only involves relogging blocks that
|
||||
|
|
@ -94,9 +98,10 @@ static int reiserfs_file_release(struct inode *inode, struct file *filp)
|
|||
if (!err)
|
||||
err = jbegin_failure;
|
||||
|
||||
if (!err && atomic_read(&inode->i_count) <= 1 &&
|
||||
if (!err &&
|
||||
(REISERFS_I(inode)->i_flags & i_pack_on_close_mask) &&
|
||||
tail_has_to_be_packed(inode)) {
|
||||
|
||||
/* if regular file is released by last holder and it has been
|
||||
appended (we append by unformatted node only) or its direct
|
||||
item(s) had to be converted, then it may have to be
|
||||
|
|
@ -104,27 +109,28 @@ static int reiserfs_file_release(struct inode *inode, struct file *filp)
|
|||
err = reiserfs_truncate_file(inode, 0);
|
||||
}
|
||||
out:
|
||||
mutex_unlock(&(REISERFS_I(inode)->i_mmap));
|
||||
mutex_unlock(&inode->i_mutex);
|
||||
reiserfs_write_unlock(inode->i_sb);
|
||||
mutex_unlock(&(REISERFS_I(inode)->tailpack));
|
||||
return err;
|
||||
}
|
||||
|
||||
static int reiserfs_file_mmap(struct file *file, struct vm_area_struct *vma)
|
||||
static int reiserfs_file_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
struct inode *inode;
|
||||
|
||||
inode = file->f_path.dentry->d_inode;
|
||||
mutex_lock(&(REISERFS_I(inode)->i_mmap));
|
||||
REISERFS_I(inode)->i_flags |= i_ever_mapped;
|
||||
mutex_unlock(&(REISERFS_I(inode)->i_mmap));
|
||||
|
||||
return generic_file_mmap(file, vma);
|
||||
int err = dquot_file_open(inode, file);
|
||||
if (!atomic_inc_not_zero(&REISERFS_I(inode)->openers)) {
|
||||
/* somebody might be tailpacking on final close; wait for it */
|
||||
mutex_lock(&(REISERFS_I(inode)->tailpack));
|
||||
atomic_inc(&REISERFS_I(inode)->openers);
|
||||
mutex_unlock(&(REISERFS_I(inode)->tailpack));
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
||||
static void reiserfs_vfs_truncate_file(struct inode *inode)
|
||||
{
|
||||
mutex_lock(&(REISERFS_I(inode)->tailpack));
|
||||
reiserfs_truncate_file(inode, 1);
|
||||
mutex_unlock(&(REISERFS_I(inode)->tailpack));
|
||||
}
|
||||
|
||||
/* Sync a reiserfs file. */
|
||||
|
|
@ -288,8 +294,8 @@ const struct file_operations reiserfs_file_operations = {
|
|||
#ifdef CONFIG_COMPAT
|
||||
.compat_ioctl = reiserfs_compat_ioctl,
|
||||
#endif
|
||||
.mmap = reiserfs_file_mmap,
|
||||
.open = dquot_file_open,
|
||||
.mmap = generic_file_mmap,
|
||||
.open = reiserfs_file_open,
|
||||
.release = reiserfs_file_release,
|
||||
.fsync = reiserfs_sync_file,
|
||||
.aio_read = generic_file_aio_read,
|
||||
|
|
|
|||
|
|
@ -25,7 +25,7 @@ int reiserfs_commit_write(struct file *f, struct page *page,
|
|||
int reiserfs_prepare_write(struct file *f, struct page *page,
|
||||
unsigned from, unsigned to);
|
||||
|
||||
void reiserfs_delete_inode(struct inode *inode)
|
||||
void reiserfs_evict_inode(struct inode *inode)
|
||||
{
|
||||
/* We need blocks for transaction + (user+group) quota update (possibly delete) */
|
||||
int jbegin_count =
|
||||
|
|
@ -35,10 +35,12 @@ void reiserfs_delete_inode(struct inode *inode)
|
|||
int depth;
|
||||
int err;
|
||||
|
||||
if (!is_bad_inode(inode))
|
||||
if (!inode->i_nlink && !is_bad_inode(inode))
|
||||
dquot_initialize(inode);
|
||||
|
||||
truncate_inode_pages(&inode->i_data, 0);
|
||||
if (inode->i_nlink)
|
||||
goto no_delete;
|
||||
|
||||
depth = reiserfs_write_lock_once(inode->i_sb);
|
||||
|
||||
|
|
@ -77,9 +79,14 @@ void reiserfs_delete_inode(struct inode *inode)
|
|||
;
|
||||
}
|
||||
out:
|
||||
clear_inode(inode); /* note this must go after the journal_end to prevent deadlock */
|
||||
end_writeback(inode); /* note this must go after the journal_end to prevent deadlock */
|
||||
dquot_drop(inode);
|
||||
inode->i_blocks = 0;
|
||||
reiserfs_write_unlock_once(inode->i_sb, depth);
|
||||
|
||||
no_delete:
|
||||
end_writeback(inode);
|
||||
dquot_drop(inode);
|
||||
}
|
||||
|
||||
static void _make_cpu_key(struct cpu_key *key, int version, __u32 dirid,
|
||||
|
|
@ -1138,7 +1145,6 @@ static void init_inode(struct inode *inode, struct treepath *path)
|
|||
REISERFS_I(inode)->i_prealloc_count = 0;
|
||||
REISERFS_I(inode)->i_trans_id = 0;
|
||||
REISERFS_I(inode)->i_jl = NULL;
|
||||
mutex_init(&(REISERFS_I(inode)->i_mmap));
|
||||
reiserfs_init_xattr_rwsem(inode);
|
||||
|
||||
if (stat_data_v1(ih)) {
|
||||
|
|
@ -1841,7 +1847,6 @@ int reiserfs_new_inode(struct reiserfs_transaction_handle *th,
|
|||
REISERFS_I(inode)->i_attrs =
|
||||
REISERFS_I(dir)->i_attrs & REISERFS_INHERIT_MASK;
|
||||
sd_attrs_to_i_attrs(REISERFS_I(inode)->i_attrs, inode);
|
||||
mutex_init(&(REISERFS_I(inode)->i_mmap));
|
||||
reiserfs_init_xattr_rwsem(inode);
|
||||
|
||||
/* key to search for correct place for new stat data */
|
||||
|
|
@ -2587,8 +2592,7 @@ static int reiserfs_write_begin(struct file *file,
|
|||
old_ref = th->t_refcount;
|
||||
th->t_refcount++;
|
||||
}
|
||||
ret = block_write_begin(file, mapping, pos, len, flags, pagep, fsdata,
|
||||
reiserfs_get_block);
|
||||
ret = __block_write_begin(page, pos, len, reiserfs_get_block);
|
||||
if (ret && reiserfs_transaction_running(inode->i_sb)) {
|
||||
struct reiserfs_transaction_handle *th = current->journal_info;
|
||||
/* this gets a little ugly. If reiserfs_get_block returned an
|
||||
|
|
@ -3059,10 +3063,25 @@ static ssize_t reiserfs_direct_IO(int rw, struct kiocb *iocb,
|
|||
{
|
||||
struct file *file = iocb->ki_filp;
|
||||
struct inode *inode = file->f_mapping->host;
|
||||
ssize_t ret;
|
||||
|
||||
return blockdev_direct_IO(rw, iocb, inode, inode->i_sb->s_bdev, iov,
|
||||
ret = blockdev_direct_IO(rw, iocb, inode, inode->i_sb->s_bdev, iov,
|
||||
offset, nr_segs,
|
||||
reiserfs_get_blocks_direct_io, NULL);
|
||||
|
||||
/*
|
||||
* In case of error extending write may have instantiated a few
|
||||
* blocks outside i_size. Trim these off again.
|
||||
*/
|
||||
if (unlikely((rw & WRITE) && ret < 0)) {
|
||||
loff_t isize = i_size_read(inode);
|
||||
loff_t end = offset + iov_length(iov, nr_segs);
|
||||
|
||||
if (end > isize)
|
||||
vmtruncate(inode, isize);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int reiserfs_setattr(struct dentry *dentry, struct iattr *attr)
|
||||
|
|
@ -3072,6 +3091,10 @@ int reiserfs_setattr(struct dentry *dentry, struct iattr *attr)
|
|||
int depth;
|
||||
int error;
|
||||
|
||||
error = inode_change_ok(inode, attr);
|
||||
if (error)
|
||||
return error;
|
||||
|
||||
/* must be turned off for recursive notify_change calls */
|
||||
ia_valid = attr->ia_valid &= ~(ATTR_KILL_SUID|ATTR_KILL_SGID);
|
||||
|
||||
|
|
@ -3121,56 +3144,59 @@ int reiserfs_setattr(struct dentry *dentry, struct iattr *attr)
|
|||
goto out;
|
||||
}
|
||||
|
||||
error = inode_change_ok(inode, attr);
|
||||
if (!error) {
|
||||
if ((ia_valid & ATTR_UID && attr->ia_uid != inode->i_uid) ||
|
||||
(ia_valid & ATTR_GID && attr->ia_gid != inode->i_gid)) {
|
||||
error = reiserfs_chown_xattrs(inode, attr);
|
||||
if ((ia_valid & ATTR_UID && attr->ia_uid != inode->i_uid) ||
|
||||
(ia_valid & ATTR_GID && attr->ia_gid != inode->i_gid)) {
|
||||
struct reiserfs_transaction_handle th;
|
||||
int jbegin_count =
|
||||
2 *
|
||||
(REISERFS_QUOTA_INIT_BLOCKS(inode->i_sb) +
|
||||
REISERFS_QUOTA_DEL_BLOCKS(inode->i_sb)) +
|
||||
2;
|
||||
|
||||
if (!error) {
|
||||
struct reiserfs_transaction_handle th;
|
||||
int jbegin_count =
|
||||
2 *
|
||||
(REISERFS_QUOTA_INIT_BLOCKS(inode->i_sb) +
|
||||
REISERFS_QUOTA_DEL_BLOCKS(inode->i_sb)) +
|
||||
2;
|
||||
error = reiserfs_chown_xattrs(inode, attr);
|
||||
|
||||
/* (user+group)*(old+new) structure - we count quota info and , inode write (sb, inode) */
|
||||
error =
|
||||
journal_begin(&th, inode->i_sb,
|
||||
jbegin_count);
|
||||
if (error)
|
||||
goto out;
|
||||
error = dquot_transfer(inode, attr);
|
||||
if (error) {
|
||||
journal_end(&th, inode->i_sb,
|
||||
jbegin_count);
|
||||
goto out;
|
||||
}
|
||||
/* Update corresponding info in inode so that everything is in
|
||||
* one transaction */
|
||||
if (attr->ia_valid & ATTR_UID)
|
||||
inode->i_uid = attr->ia_uid;
|
||||
if (attr->ia_valid & ATTR_GID)
|
||||
inode->i_gid = attr->ia_gid;
|
||||
mark_inode_dirty(inode);
|
||||
error =
|
||||
journal_end(&th, inode->i_sb, jbegin_count);
|
||||
}
|
||||
}
|
||||
if (!error) {
|
||||
/*
|
||||
* Relax the lock here, as it might truncate the
|
||||
* inode pages and wait for inode pages locks.
|
||||
* To release such page lock, the owner needs the
|
||||
* reiserfs lock
|
||||
*/
|
||||
reiserfs_write_unlock_once(inode->i_sb, depth);
|
||||
error = inode_setattr(inode, attr);
|
||||
depth = reiserfs_write_lock_once(inode->i_sb);
|
||||
if (error)
|
||||
return error;
|
||||
|
||||
/* (user+group)*(old+new) structure - we count quota info and , inode write (sb, inode) */
|
||||
error = journal_begin(&th, inode->i_sb, jbegin_count);
|
||||
if (error)
|
||||
goto out;
|
||||
error = dquot_transfer(inode, attr);
|
||||
if (error) {
|
||||
journal_end(&th, inode->i_sb, jbegin_count);
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* Update corresponding info in inode so that everything is in
|
||||
* one transaction */
|
||||
if (attr->ia_valid & ATTR_UID)
|
||||
inode->i_uid = attr->ia_uid;
|
||||
if (attr->ia_valid & ATTR_GID)
|
||||
inode->i_gid = attr->ia_gid;
|
||||
mark_inode_dirty(inode);
|
||||
error = journal_end(&th, inode->i_sb, jbegin_count);
|
||||
if (error)
|
||||
goto out;
|
||||
}
|
||||
|
||||
/*
|
||||
* Relax the lock here, as it might truncate the
|
||||
* inode pages and wait for inode pages locks.
|
||||
* To release such page lock, the owner needs the
|
||||
* reiserfs lock
|
||||
*/
|
||||
reiserfs_write_unlock_once(inode->i_sb, depth);
|
||||
if ((attr->ia_valid & ATTR_SIZE) &&
|
||||
attr->ia_size != i_size_read(inode))
|
||||
error = vmtruncate(inode, attr->ia_size);
|
||||
|
||||
if (!error) {
|
||||
setattr_copy(inode, attr);
|
||||
mark_inode_dirty(inode);
|
||||
}
|
||||
depth = reiserfs_write_lock_once(inode->i_sb);
|
||||
|
||||
if (!error && reiserfs_posixacl(inode->i_sb)) {
|
||||
if (attr->ia_valid & ATTR_MODE)
|
||||
error = reiserfs_acl_chmod(inode);
|
||||
|
|
|
|||
|
|
@ -525,6 +525,8 @@ static struct inode *reiserfs_alloc_inode(struct super_block *sb)
|
|||
kmem_cache_alloc(reiserfs_inode_cachep, GFP_KERNEL);
|
||||
if (!ei)
|
||||
return NULL;
|
||||
atomic_set(&ei->openers, 0);
|
||||
mutex_init(&ei->tailpack);
|
||||
return &ei->vfs_inode;
|
||||
}
|
||||
|
||||
|
|
@ -589,11 +591,6 @@ out:
|
|||
reiserfs_write_unlock_once(inode->i_sb, lock_depth);
|
||||
}
|
||||
|
||||
static void reiserfs_clear_inode(struct inode *inode)
|
||||
{
|
||||
dquot_drop(inode);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_QUOTA
|
||||
static ssize_t reiserfs_quota_write(struct super_block *, int, const char *,
|
||||
size_t, loff_t);
|
||||
|
|
@ -606,8 +603,7 @@ static const struct super_operations reiserfs_sops = {
|
|||
.destroy_inode = reiserfs_destroy_inode,
|
||||
.write_inode = reiserfs_write_inode,
|
||||
.dirty_inode = reiserfs_dirty_inode,
|
||||
.clear_inode = reiserfs_clear_inode,
|
||||
.delete_inode = reiserfs_delete_inode,
|
||||
.evict_inode = reiserfs_evict_inode,
|
||||
.put_super = reiserfs_put_super,
|
||||
.write_super = reiserfs_write_super,
|
||||
.sync_fs = reiserfs_sync_fs,
|
||||
|
|
|
|||
Loading…
Reference in a new issue