mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-30 03:27:44 -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
|
|
@ -80,23 +80,10 @@ static unsigned nilfs_last_byte(struct inode *inode, unsigned long page_nr)
|
|||
return last_byte;
|
||||
}
|
||||
|
||||
static int nilfs_prepare_chunk_uninterruptible(struct page *page,
|
||||
struct address_space *mapping,
|
||||
unsigned from, unsigned to)
|
||||
static int nilfs_prepare_chunk(struct page *page, unsigned from, unsigned to)
|
||||
{
|
||||
loff_t pos = page_offset(page) + from;
|
||||
return block_write_begin(NULL, mapping, pos, to - from,
|
||||
AOP_FLAG_UNINTERRUPTIBLE, &page,
|
||||
NULL, nilfs_get_block);
|
||||
}
|
||||
|
||||
static int nilfs_prepare_chunk(struct page *page,
|
||||
struct address_space *mapping,
|
||||
unsigned from, unsigned to)
|
||||
{
|
||||
loff_t pos = page_offset(page) + from;
|
||||
return block_write_begin(NULL, mapping, pos, to - from, 0, &page,
|
||||
NULL, nilfs_get_block);
|
||||
return __block_write_begin(page, pos, to - from, nilfs_get_block);
|
||||
}
|
||||
|
||||
static void nilfs_commit_chunk(struct page *page,
|
||||
|
|
@ -447,7 +434,7 @@ void nilfs_set_link(struct inode *dir, struct nilfs_dir_entry *de,
|
|||
int err;
|
||||
|
||||
lock_page(page);
|
||||
err = nilfs_prepare_chunk_uninterruptible(page, mapping, from, to);
|
||||
err = nilfs_prepare_chunk(page, from, to);
|
||||
BUG_ON(err);
|
||||
de->inode = cpu_to_le64(inode->i_ino);
|
||||
nilfs_set_de_type(de, inode);
|
||||
|
|
@ -528,7 +515,7 @@ int nilfs_add_link(struct dentry *dentry, struct inode *inode)
|
|||
got_it:
|
||||
from = (char *)de - (char *)page_address(page);
|
||||
to = from + rec_len;
|
||||
err = nilfs_prepare_chunk(page, page->mapping, from, to);
|
||||
err = nilfs_prepare_chunk(page, from, to);
|
||||
if (err)
|
||||
goto out_unlock;
|
||||
if (de->inode) {
|
||||
|
|
@ -586,7 +573,7 @@ int nilfs_delete_entry(struct nilfs_dir_entry *dir, struct page *page)
|
|||
if (pde)
|
||||
from = (char *)pde - (char *)page_address(page);
|
||||
lock_page(page);
|
||||
err = nilfs_prepare_chunk(page, mapping, from, to);
|
||||
err = nilfs_prepare_chunk(page, from, to);
|
||||
BUG_ON(err);
|
||||
if (pde)
|
||||
pde->rec_len = nilfs_rec_len_to_disk(to - from);
|
||||
|
|
@ -614,7 +601,7 @@ int nilfs_make_empty(struct inode *inode, struct inode *parent)
|
|||
if (!page)
|
||||
return -ENOMEM;
|
||||
|
||||
err = nilfs_prepare_chunk(page, mapping, 0, chunk_size);
|
||||
err = nilfs_prepare_chunk(page, 0, chunk_size);
|
||||
if (unlikely(err)) {
|
||||
unlock_page(page);
|
||||
goto fail;
|
||||
|
|
|
|||
|
|
@ -78,7 +78,7 @@ void nilfs_clear_gcdat_inode(struct the_nilfs *nilfs)
|
|||
struct inode *gcdat = nilfs->ns_gc_dat;
|
||||
struct nilfs_inode_info *gii = NILFS_I(gcdat);
|
||||
|
||||
gcdat->i_state = I_CLEAR;
|
||||
gcdat->i_state = I_FREEING | I_CLEAR;
|
||||
gii->i_flags = 0;
|
||||
|
||||
nilfs_palloc_clear_cache(gcdat);
|
||||
|
|
|
|||
|
|
@ -27,6 +27,7 @@
|
|||
#include <linux/writeback.h>
|
||||
#include <linux/uio.h>
|
||||
#include "nilfs.h"
|
||||
#include "btnode.h"
|
||||
#include "segment.h"
|
||||
#include "page.h"
|
||||
#include "mdt.h"
|
||||
|
|
@ -197,11 +198,15 @@ static int nilfs_write_begin(struct file *file, struct address_space *mapping,
|
|||
if (unlikely(err))
|
||||
return err;
|
||||
|
||||
*pagep = NULL;
|
||||
err = block_write_begin(file, mapping, pos, len, flags, pagep,
|
||||
fsdata, nilfs_get_block);
|
||||
if (unlikely(err))
|
||||
err = block_write_begin(mapping, pos, len, flags, pagep,
|
||||
nilfs_get_block);
|
||||
if (unlikely(err)) {
|
||||
loff_t isize = mapping->host->i_size;
|
||||
if (pos + len > isize)
|
||||
vmtruncate(mapping->host, isize);
|
||||
|
||||
nilfs_transaction_abort(inode->i_sb);
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
||||
|
|
@ -237,6 +242,19 @@ nilfs_direct_IO(int rw, struct kiocb *iocb, const struct iovec *iov,
|
|||
/* Needs synchronization with the cleaner */
|
||||
size = blockdev_direct_IO(rw, iocb, inode, inode->i_sb->s_bdev, iov,
|
||||
offset, nr_segs, nilfs_get_block, NULL);
|
||||
|
||||
/*
|
||||
* In case of error extending write may have instantiated a few
|
||||
* blocks outside i_size. Trim these off again.
|
||||
*/
|
||||
if (unlikely((rw & WRITE) && size < 0)) {
|
||||
loff_t isize = i_size_read(inode);
|
||||
loff_t end = offset + iov_length(iov, nr_segs);
|
||||
|
||||
if (end > isize)
|
||||
vmtruncate(inode, isize);
|
||||
}
|
||||
|
||||
return size;
|
||||
}
|
||||
|
||||
|
|
@ -337,7 +355,6 @@ void nilfs_free_inode(struct inode *inode)
|
|||
struct super_block *sb = inode->i_sb;
|
||||
struct nilfs_sb_info *sbi = NILFS_SB(sb);
|
||||
|
||||
clear_inode(inode);
|
||||
/* XXX: check error code? Is there any thing I can do? */
|
||||
(void) nilfs_ifile_delete_inode(sbi->s_ifile, inode->i_ino);
|
||||
atomic_dec(&sbi->s_inodes_count);
|
||||
|
|
@ -597,16 +614,34 @@ void nilfs_truncate(struct inode *inode)
|
|||
But truncate has no return value. */
|
||||
}
|
||||
|
||||
void nilfs_delete_inode(struct inode *inode)
|
||||
static void nilfs_clear_inode(struct inode *inode)
|
||||
{
|
||||
struct nilfs_inode_info *ii = NILFS_I(inode);
|
||||
|
||||
/*
|
||||
* Free resources allocated in nilfs_read_inode(), here.
|
||||
*/
|
||||
BUG_ON(!list_empty(&ii->i_dirty));
|
||||
brelse(ii->i_bh);
|
||||
ii->i_bh = NULL;
|
||||
|
||||
if (test_bit(NILFS_I_BMAP, &ii->i_state))
|
||||
nilfs_bmap_clear(ii->i_bmap);
|
||||
|
||||
nilfs_btnode_cache_clear(&ii->i_btnode_cache);
|
||||
}
|
||||
|
||||
void nilfs_evict_inode(struct inode *inode)
|
||||
{
|
||||
struct nilfs_transaction_info ti;
|
||||
struct super_block *sb = inode->i_sb;
|
||||
struct nilfs_inode_info *ii = NILFS_I(inode);
|
||||
|
||||
if (unlikely(is_bad_inode(inode))) {
|
||||
if (inode->i_nlink || unlikely(is_bad_inode(inode))) {
|
||||
if (inode->i_data.nrpages)
|
||||
truncate_inode_pages(&inode->i_data, 0);
|
||||
clear_inode(inode);
|
||||
end_writeback(inode);
|
||||
nilfs_clear_inode(inode);
|
||||
return;
|
||||
}
|
||||
nilfs_transaction_begin(sb, &ti, 0); /* never fails */
|
||||
|
|
@ -616,6 +651,8 @@ void nilfs_delete_inode(struct inode *inode)
|
|||
|
||||
nilfs_truncate_bmap(ii, 0);
|
||||
nilfs_mark_inode_dirty(inode);
|
||||
end_writeback(inode);
|
||||
nilfs_clear_inode(inode);
|
||||
nilfs_free_inode(inode);
|
||||
/* nilfs_free_inode() marks inode buffer dirty */
|
||||
if (IS_SYNC(inode))
|
||||
|
|
@ -639,14 +676,27 @@ int nilfs_setattr(struct dentry *dentry, struct iattr *iattr)
|
|||
err = nilfs_transaction_begin(sb, &ti, 0);
|
||||
if (unlikely(err))
|
||||
return err;
|
||||
err = inode_setattr(inode, iattr);
|
||||
if (!err && (iattr->ia_valid & ATTR_MODE))
|
||||
err = nilfs_acl_chmod(inode);
|
||||
if (likely(!err))
|
||||
err = nilfs_transaction_commit(sb);
|
||||
else
|
||||
nilfs_transaction_abort(sb);
|
||||
|
||||
if ((iattr->ia_valid & ATTR_SIZE) &&
|
||||
iattr->ia_size != i_size_read(inode)) {
|
||||
err = vmtruncate(inode, iattr->ia_size);
|
||||
if (unlikely(err))
|
||||
goto out_err;
|
||||
}
|
||||
|
||||
setattr_copy(inode, iattr);
|
||||
mark_inode_dirty(inode);
|
||||
|
||||
if (iattr->ia_valid & ATTR_MODE) {
|
||||
err = nilfs_acl_chmod(inode);
|
||||
if (unlikely(err))
|
||||
goto out_err;
|
||||
}
|
||||
|
||||
return nilfs_transaction_commit(sb);
|
||||
|
||||
out_err:
|
||||
nilfs_transaction_abort(sb);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -250,7 +250,7 @@ extern void nilfs_write_inode_common(struct inode *, struct nilfs_inode *, int);
|
|||
extern struct inode *nilfs_iget(struct super_block *, unsigned long);
|
||||
extern void nilfs_update_inode(struct inode *, struct buffer_head *);
|
||||
extern void nilfs_truncate(struct inode *);
|
||||
extern void nilfs_delete_inode(struct inode *);
|
||||
extern void nilfs_evict_inode(struct inode *);
|
||||
extern int nilfs_setattr(struct dentry *, struct iattr *);
|
||||
extern int nilfs_load_inode_block(struct nilfs_sb_info *, struct inode *,
|
||||
struct buffer_head **);
|
||||
|
|
|
|||
|
|
@ -523,11 +523,14 @@ static int nilfs_recover_dsync_blocks(struct the_nilfs *nilfs,
|
|||
}
|
||||
|
||||
pos = rb->blkoff << inode->i_blkbits;
|
||||
page = NULL;
|
||||
err = block_write_begin(NULL, inode->i_mapping, pos, blocksize,
|
||||
0, &page, NULL, nilfs_get_block);
|
||||
if (unlikely(err))
|
||||
err = block_write_begin(inode->i_mapping, pos, blocksize,
|
||||
0, &page, nilfs_get_block);
|
||||
if (unlikely(err)) {
|
||||
loff_t isize = inode->i_size;
|
||||
if (pos + blocksize > isize)
|
||||
vmtruncate(inode, isize);
|
||||
goto failed_inode;
|
||||
}
|
||||
|
||||
err = nilfs_recovery_copy_block(nilfs, rb, page);
|
||||
if (unlikely(err))
|
||||
|
|
|
|||
|
|
@ -171,23 +171,6 @@ void nilfs_destroy_inode(struct inode *inode)
|
|||
kmem_cache_free(nilfs_inode_cachep, NILFS_I(inode));
|
||||
}
|
||||
|
||||
static void nilfs_clear_inode(struct inode *inode)
|
||||
{
|
||||
struct nilfs_inode_info *ii = NILFS_I(inode);
|
||||
|
||||
/*
|
||||
* Free resources allocated in nilfs_read_inode(), here.
|
||||
*/
|
||||
BUG_ON(!list_empty(&ii->i_dirty));
|
||||
brelse(ii->i_bh);
|
||||
ii->i_bh = NULL;
|
||||
|
||||
if (test_bit(NILFS_I_BMAP, &ii->i_state))
|
||||
nilfs_bmap_clear(ii->i_bmap);
|
||||
|
||||
nilfs_btnode_cache_clear(&ii->i_btnode_cache);
|
||||
}
|
||||
|
||||
static int nilfs_sync_super(struct nilfs_sb_info *sbi, int flag)
|
||||
{
|
||||
struct the_nilfs *nilfs = sbi->s_nilfs;
|
||||
|
|
@ -548,7 +531,7 @@ static const struct super_operations nilfs_sops = {
|
|||
/* .write_inode = nilfs_write_inode, */
|
||||
/* .put_inode = nilfs_put_inode, */
|
||||
/* .drop_inode = nilfs_drop_inode, */
|
||||
.delete_inode = nilfs_delete_inode,
|
||||
.evict_inode = nilfs_evict_inode,
|
||||
.put_super = nilfs_put_super,
|
||||
/* .write_super = nilfs_write_super, */
|
||||
.sync_fs = nilfs_sync_fs,
|
||||
|
|
@ -556,7 +539,6 @@ static const struct super_operations nilfs_sops = {
|
|||
/* .unlockfs */
|
||||
.statfs = nilfs_statfs,
|
||||
.remount_fs = nilfs_remount,
|
||||
.clear_inode = nilfs_clear_inode,
|
||||
/* .umount_begin */
|
||||
.show_options = nilfs_show_options
|
||||
};
|
||||
|
|
|
|||
Loading…
Reference in a new issue