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: (107 commits) vfs: use ERR_CAST for err-ptr tossing in lookup_instantiate_filp isofs: Remove global fs lock jffs2: fix IN_DELETE_SELF on overwriting rename() killing a directory fix IN_DELETE_SELF on overwriting rename() on ramfs et.al. mm/truncate.c: fix build for CONFIG_BLOCK not enabled fs:update the NOTE of the file_operations structure Remove dead code in dget_parent() AFS: Fix silly characters in a comment switch d_add_ci() to d_splice_alias() in "found negative" case as well simplify gfs2_lookup() jfs_lookup(): don't bother with . or .. get rid of useless dget_parent() in btrfs rename() and link() get rid of useless dget_parent() in fs/btrfs/ioctl.c fs: push i_mutex and filemap_write_and_wait down into ->fsync() handlers drivers: fix up various ->llseek() implementations fs: handle SEEK_HOLE/SEEK_DATA properly in all fs's that define their own llseek Ext4: handle SEEK_HOLE/SEEK_DATA generically Btrfs: implement our own ->llseek fs: add SEEK_HOLE and SEEK_DATA flags reiserfs: make reiserfs default to barrier=flush ... Fix up trivial conflicts in fs/xfs/linux-2.6/xfs_super.c due to the new shrinker callout for the inode cache, that clashed with the xfs code to start the periodic workers later.
This commit is contained in:
@@ -219,7 +219,7 @@ xfs_set_acl(struct inode *inode, int type, struct posix_acl *acl)
|
||||
}
|
||||
|
||||
int
|
||||
xfs_check_acl(struct inode *inode, int mask, unsigned int flags)
|
||||
xfs_check_acl(struct inode *inode, int mask)
|
||||
{
|
||||
struct xfs_inode *ip;
|
||||
struct posix_acl *acl;
|
||||
@@ -235,7 +235,7 @@ xfs_check_acl(struct inode *inode, int mask, unsigned int flags)
|
||||
if (!XFS_IFORK_Q(ip))
|
||||
return -EAGAIN;
|
||||
|
||||
if (flags & IPERM_FLAG_RCU) {
|
||||
if (mask & MAY_NOT_BLOCK) {
|
||||
if (!negative_cached_acl(inode, ACL_TYPE_ACCESS))
|
||||
return -ECHILD;
|
||||
return -EAGAIN;
|
||||
|
@@ -1329,6 +1329,9 @@ xfs_end_io_direct_write(
|
||||
} else {
|
||||
xfs_finish_ioend_sync(ioend);
|
||||
}
|
||||
|
||||
/* XXX: probably should move into the real I/O completion handler */
|
||||
inode_dio_done(ioend->io_inode);
|
||||
}
|
||||
|
||||
STATIC ssize_t
|
||||
|
@@ -127,6 +127,8 @@ xfs_iozero(
|
||||
STATIC int
|
||||
xfs_file_fsync(
|
||||
struct file *file,
|
||||
loff_t start,
|
||||
loff_t end,
|
||||
int datasync)
|
||||
{
|
||||
struct inode *inode = file->f_mapping->host;
|
||||
@@ -138,6 +140,10 @@ xfs_file_fsync(
|
||||
|
||||
trace_xfs_file_fsync(ip);
|
||||
|
||||
error = filemap_write_and_wait_range(inode->i_mapping, start, end);
|
||||
if (error)
|
||||
return error;
|
||||
|
||||
if (XFS_FORCED_SHUTDOWN(mp))
|
||||
return -XFS_ERROR(EIO);
|
||||
|
||||
@@ -875,18 +881,11 @@ xfs_file_aio_write(
|
||||
/* Handle various SYNC-type writes */
|
||||
if ((file->f_flags & O_DSYNC) || IS_SYNC(inode)) {
|
||||
loff_t end = pos + ret - 1;
|
||||
int error, error2;
|
||||
|
||||
xfs_rw_iunlock(ip, iolock);
|
||||
error = filemap_write_and_wait_range(mapping, pos, end);
|
||||
ret = -xfs_file_fsync(file, pos, end,
|
||||
(file->f_flags & __O_SYNC) ? 0 : 1);
|
||||
xfs_rw_ilock(ip, iolock);
|
||||
|
||||
error2 = -xfs_file_fsync(file,
|
||||
(file->f_flags & __O_SYNC) ? 0 : 1);
|
||||
if (error)
|
||||
ret = error;
|
||||
else if (error2)
|
||||
ret = error2;
|
||||
}
|
||||
|
||||
out_unlock:
|
||||
|
@@ -1024,11 +1024,6 @@ xfs_fs_put_super(
|
||||
{
|
||||
struct xfs_mount *mp = XFS_M(sb);
|
||||
|
||||
/*
|
||||
* Unregister the memory shrinker before we tear down the mount
|
||||
* structure so we don't have memory reclaim racing with us here.
|
||||
*/
|
||||
xfs_inode_shrinker_unregister(mp);
|
||||
xfs_syncd_stop(mp);
|
||||
|
||||
/*
|
||||
@@ -1411,8 +1406,6 @@ xfs_fs_fill_super(
|
||||
sb->s_time_gran = 1;
|
||||
set_posix_acl_flag(sb);
|
||||
|
||||
xfs_inode_shrinker_register(mp);
|
||||
|
||||
error = xfs_mountfs(mp);
|
||||
if (error)
|
||||
goto out_filestream_unmount;
|
||||
@@ -1439,7 +1432,6 @@ xfs_fs_fill_super(
|
||||
return 0;
|
||||
|
||||
out_filestream_unmount:
|
||||
xfs_inode_shrinker_unregister(mp);
|
||||
xfs_filestream_unmount(mp);
|
||||
out_free_sb:
|
||||
xfs_freesb(mp);
|
||||
@@ -1458,8 +1450,6 @@ xfs_fs_fill_super(
|
||||
out_syncd_stop:
|
||||
xfs_syncd_stop(mp);
|
||||
out_unmount:
|
||||
xfs_inode_shrinker_unregister(mp);
|
||||
|
||||
/*
|
||||
* Blow away any referenced inode in the filestreams cache.
|
||||
* This can and will cause log traffic as inodes go inactive
|
||||
@@ -1483,6 +1473,21 @@ xfs_fs_mount(
|
||||
return mount_bdev(fs_type, flags, dev_name, data, xfs_fs_fill_super);
|
||||
}
|
||||
|
||||
static int
|
||||
xfs_fs_nr_cached_objects(
|
||||
struct super_block *sb)
|
||||
{
|
||||
return xfs_reclaim_inodes_count(XFS_M(sb));
|
||||
}
|
||||
|
||||
static void
|
||||
xfs_fs_free_cached_objects(
|
||||
struct super_block *sb,
|
||||
int nr_to_scan)
|
||||
{
|
||||
xfs_reclaim_inodes_nr(XFS_M(sb), nr_to_scan);
|
||||
}
|
||||
|
||||
static const struct super_operations xfs_super_operations = {
|
||||
.alloc_inode = xfs_fs_alloc_inode,
|
||||
.destroy_inode = xfs_fs_destroy_inode,
|
||||
@@ -1496,6 +1501,8 @@ static const struct super_operations xfs_super_operations = {
|
||||
.statfs = xfs_fs_statfs,
|
||||
.remount_fs = xfs_fs_remount,
|
||||
.show_options = xfs_fs_show_options,
|
||||
.nr_cached_objects = xfs_fs_nr_cached_objects,
|
||||
.free_cached_objects = xfs_fs_free_cached_objects,
|
||||
};
|
||||
|
||||
static struct file_system_type xfs_fs_type = {
|
||||
|
@@ -179,6 +179,8 @@ restart:
|
||||
if (error == EFSCORRUPTED)
|
||||
break;
|
||||
|
||||
cond_resched();
|
||||
|
||||
} while (nr_found && !done);
|
||||
|
||||
if (skipped) {
|
||||
@@ -984,6 +986,8 @@ restart:
|
||||
|
||||
*nr_to_scan -= XFS_LOOKUP_BATCH;
|
||||
|
||||
cond_resched();
|
||||
|
||||
} while (nr_found && !done && *nr_to_scan > 0);
|
||||
|
||||
if (trylock && !done)
|
||||
@@ -1001,7 +1005,7 @@ restart:
|
||||
* ensure that when we get more reclaimers than AGs we block rather
|
||||
* than spin trying to execute reclaim.
|
||||
*/
|
||||
if (trylock && skipped && *nr_to_scan > 0) {
|
||||
if (skipped && (flags & SYNC_WAIT) && *nr_to_scan > 0) {
|
||||
trylock = 0;
|
||||
goto restart;
|
||||
}
|
||||
@@ -1019,44 +1023,38 @@ xfs_reclaim_inodes(
|
||||
}
|
||||
|
||||
/*
|
||||
* Inode cache shrinker.
|
||||
* Scan a certain number of inodes for reclaim.
|
||||
*
|
||||
* When called we make sure that there is a background (fast) inode reclaim in
|
||||
* progress, while we will throttle the speed of reclaim via doiing synchronous
|
||||
* progress, while we will throttle the speed of reclaim via doing synchronous
|
||||
* reclaim of inodes. That means if we come across dirty inodes, we wait for
|
||||
* them to be cleaned, which we hope will not be very long due to the
|
||||
* background walker having already kicked the IO off on those dirty inodes.
|
||||
*/
|
||||
static int
|
||||
xfs_reclaim_inode_shrink(
|
||||
struct shrinker *shrink,
|
||||
struct shrink_control *sc)
|
||||
void
|
||||
xfs_reclaim_inodes_nr(
|
||||
struct xfs_mount *mp,
|
||||
int nr_to_scan)
|
||||
{
|
||||
struct xfs_mount *mp;
|
||||
struct xfs_perag *pag;
|
||||
xfs_agnumber_t ag;
|
||||
int reclaimable;
|
||||
int nr_to_scan = sc->nr_to_scan;
|
||||
gfp_t gfp_mask = sc->gfp_mask;
|
||||
/* kick background reclaimer and push the AIL */
|
||||
xfs_syncd_queue_reclaim(mp);
|
||||
xfs_ail_push_all(mp->m_ail);
|
||||
|
||||
mp = container_of(shrink, struct xfs_mount, m_inode_shrink);
|
||||
if (nr_to_scan) {
|
||||
/* kick background reclaimer and push the AIL */
|
||||
xfs_syncd_queue_reclaim(mp);
|
||||
xfs_ail_push_all(mp->m_ail);
|
||||
xfs_reclaim_inodes_ag(mp, SYNC_TRYLOCK | SYNC_WAIT, &nr_to_scan);
|
||||
}
|
||||
|
||||
if (!(gfp_mask & __GFP_FS))
|
||||
return -1;
|
||||
/*
|
||||
* Return the number of reclaimable inodes in the filesystem for
|
||||
* the shrinker to determine how much to reclaim.
|
||||
*/
|
||||
int
|
||||
xfs_reclaim_inodes_count(
|
||||
struct xfs_mount *mp)
|
||||
{
|
||||
struct xfs_perag *pag;
|
||||
xfs_agnumber_t ag = 0;
|
||||
int reclaimable = 0;
|
||||
|
||||
xfs_reclaim_inodes_ag(mp, SYNC_TRYLOCK | SYNC_WAIT,
|
||||
&nr_to_scan);
|
||||
/* terminate if we don't exhaust the scan */
|
||||
if (nr_to_scan > 0)
|
||||
return -1;
|
||||
}
|
||||
|
||||
reclaimable = 0;
|
||||
ag = 0;
|
||||
while ((pag = xfs_perag_get_tag(mp, ag, XFS_ICI_RECLAIM_TAG))) {
|
||||
ag = pag->pag_agno + 1;
|
||||
reclaimable += pag->pag_ici_reclaimable;
|
||||
@@ -1065,18 +1063,3 @@ xfs_reclaim_inode_shrink(
|
||||
return reclaimable;
|
||||
}
|
||||
|
||||
void
|
||||
xfs_inode_shrinker_register(
|
||||
struct xfs_mount *mp)
|
||||
{
|
||||
mp->m_inode_shrink.shrink = xfs_reclaim_inode_shrink;
|
||||
mp->m_inode_shrink.seeks = DEFAULT_SEEKS;
|
||||
register_shrinker(&mp->m_inode_shrink);
|
||||
}
|
||||
|
||||
void
|
||||
xfs_inode_shrinker_unregister(
|
||||
struct xfs_mount *mp)
|
||||
{
|
||||
unregister_shrinker(&mp->m_inode_shrink);
|
||||
}
|
||||
|
@@ -35,6 +35,8 @@ void xfs_quiesce_attr(struct xfs_mount *mp);
|
||||
void xfs_flush_inodes(struct xfs_inode *ip);
|
||||
|
||||
int xfs_reclaim_inodes(struct xfs_mount *mp, int mode);
|
||||
int xfs_reclaim_inodes_count(struct xfs_mount *mp);
|
||||
void xfs_reclaim_inodes_nr(struct xfs_mount *mp, int nr_to_scan);
|
||||
|
||||
void xfs_inode_set_reclaim_tag(struct xfs_inode *ip);
|
||||
void __xfs_inode_set_reclaim_tag(struct xfs_perag *pag, struct xfs_inode *ip);
|
||||
@@ -46,7 +48,4 @@ int xfs_inode_ag_iterator(struct xfs_mount *mp,
|
||||
int (*execute)(struct xfs_inode *ip, struct xfs_perag *pag, int flags),
|
||||
int flags);
|
||||
|
||||
void xfs_inode_shrinker_register(struct xfs_mount *mp);
|
||||
void xfs_inode_shrinker_unregister(struct xfs_mount *mp);
|
||||
|
||||
#endif
|
||||
|
@@ -42,7 +42,7 @@ struct xfs_acl {
|
||||
#define SGI_ACL_DEFAULT_SIZE (sizeof(SGI_ACL_DEFAULT)-1)
|
||||
|
||||
#ifdef CONFIG_XFS_POSIX_ACL
|
||||
extern int xfs_check_acl(struct inode *inode, int mask, unsigned int flags);
|
||||
extern int xfs_check_acl(struct inode *inode, int mask);
|
||||
extern struct posix_acl *xfs_get_acl(struct inode *inode, int type);
|
||||
extern int xfs_inherit_acl(struct inode *inode, struct posix_acl *default_acl);
|
||||
extern int xfs_acl_chmod(struct inode *inode);
|
||||
|
Reference in New Issue
Block a user