Merge tag 'v3.10.72' into update
This is the 3.10.72 stable release
This commit is contained in:
@@ -95,7 +95,7 @@ static int check_dev_ioctl_version(int cmd, struct autofs_dev_ioctl *param)
|
||||
*/
|
||||
static struct autofs_dev_ioctl *copy_dev_ioctl(struct autofs_dev_ioctl __user *in)
|
||||
{
|
||||
struct autofs_dev_ioctl tmp;
|
||||
struct autofs_dev_ioctl tmp, *res;
|
||||
|
||||
if (copy_from_user(&tmp, in, sizeof(tmp)))
|
||||
return ERR_PTR(-EFAULT);
|
||||
@@ -103,7 +103,11 @@ static struct autofs_dev_ioctl *copy_dev_ioctl(struct autofs_dev_ioctl __user *i
|
||||
if (tmp.size < sizeof(tmp))
|
||||
return ERR_PTR(-EINVAL);
|
||||
|
||||
return memdup_user(in, tmp.size);
|
||||
res = memdup_user(in, tmp.size);
|
||||
if (!IS_ERR(res))
|
||||
res->size = tmp.size;
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
static inline void free_dev_ioctl(struct autofs_dev_ioctl *param)
|
||||
|
||||
+28
-28
@@ -1593,22 +1593,10 @@ static ssize_t btrfs_file_aio_write(struct kiocb *iocb,
|
||||
mutex_unlock(&inode->i_mutex);
|
||||
|
||||
/*
|
||||
* we want to make sure fsync finds this change
|
||||
* but we haven't joined a transaction running right now.
|
||||
*
|
||||
* Later on, someone is sure to update the inode and get the
|
||||
* real transid recorded.
|
||||
*
|
||||
* We set last_trans now to the fs_info generation + 1,
|
||||
* this will either be one more than the running transaction
|
||||
* or the generation used for the next transaction if there isn't
|
||||
* one running right now.
|
||||
*
|
||||
* We also have to set last_sub_trans to the current log transid,
|
||||
* otherwise subsequent syncs to a file that's been synced in this
|
||||
* transaction will appear to have already occured.
|
||||
*/
|
||||
BTRFS_I(inode)->last_trans = root->fs_info->generation + 1;
|
||||
BTRFS_I(inode)->last_sub_trans = root->log_transid;
|
||||
if (num_written > 0 || num_written == -EIOCBQUEUED) {
|
||||
err = generic_write_sync(file, pos, num_written);
|
||||
@@ -1706,25 +1694,37 @@ int btrfs_sync_file(struct file *file, loff_t start, loff_t end, int datasync)
|
||||
atomic_inc(&root->log_batch);
|
||||
|
||||
/*
|
||||
* check the transaction that last modified this inode
|
||||
* and see if its already been committed
|
||||
*/
|
||||
if (!BTRFS_I(inode)->last_trans) {
|
||||
mutex_unlock(&inode->i_mutex);
|
||||
goto out;
|
||||
}
|
||||
|
||||
/*
|
||||
* if the last transaction that changed this file was before
|
||||
* the current transaction, we can bail out now without any
|
||||
* syncing
|
||||
* If the last transaction that changed this file was before the current
|
||||
* transaction and we have the full sync flag set in our inode, we can
|
||||
* bail out now without any syncing.
|
||||
*
|
||||
* Note that we can't bail out if the full sync flag isn't set. This is
|
||||
* because when the full sync flag is set we start all ordered extents
|
||||
* and wait for them to fully complete - when they complete they update
|
||||
* the inode's last_trans field through:
|
||||
*
|
||||
* btrfs_finish_ordered_io() ->
|
||||
* btrfs_update_inode_fallback() ->
|
||||
* btrfs_update_inode() ->
|
||||
* btrfs_set_inode_last_trans()
|
||||
*
|
||||
* So we are sure that last_trans is up to date and can do this check to
|
||||
* bail out safely. For the fast path, when the full sync flag is not
|
||||
* set in our inode, we can not do it because we start only our ordered
|
||||
* extents and don't wait for them to complete (that is when
|
||||
* btrfs_finish_ordered_io runs), so here at this point their last_trans
|
||||
* value might be less than or equals to fs_info->last_trans_committed,
|
||||
* and setting a speculative last_trans for an inode when a buffered
|
||||
* write is made (such as fs_info->generation + 1 for example) would not
|
||||
* be reliable since after setting the value and before fsync is called
|
||||
* any number of transactions can start and commit (transaction kthread
|
||||
* commits the current transaction periodically), and a transaction
|
||||
* commit does not start nor waits for ordered extents to complete.
|
||||
*/
|
||||
smp_mb();
|
||||
if (btrfs_inode_in_log(inode, root->fs_info->generation) ||
|
||||
BTRFS_I(inode)->last_trans <=
|
||||
root->fs_info->last_trans_committed) {
|
||||
BTRFS_I(inode)->last_trans = 0;
|
||||
|
||||
(full_sync && BTRFS_I(inode)->last_trans <=
|
||||
root->fs_info->last_trans_committed)) {
|
||||
/*
|
||||
* We'v had everything committed since the last time we were
|
||||
* modified so clear this flag in case it was set for whatever
|
||||
|
||||
@@ -6825,7 +6825,6 @@ static int btrfs_get_blocks_direct(struct inode *inode, sector_t iblock,
|
||||
((BTRFS_I(inode)->flags & BTRFS_INODE_NODATACOW) &&
|
||||
em->block_start != EXTENT_MAP_HOLE)) {
|
||||
int type;
|
||||
int ret;
|
||||
u64 block_start, orig_start, orig_block_len, ram_bytes;
|
||||
|
||||
if (test_bit(EXTENT_FLAG_PREALLOC, &em->flags))
|
||||
|
||||
+1
-1
@@ -943,7 +943,7 @@ again:
|
||||
base = btrfs_item_ptr_offset(leaf, path->slots[0]);
|
||||
|
||||
while (cur_offset < item_size) {
|
||||
extref = (struct btrfs_inode_extref *)base + cur_offset;
|
||||
extref = (struct btrfs_inode_extref *)(base + cur_offset);
|
||||
|
||||
victim_name_len = btrfs_inode_extref_name_len(leaf, extref);
|
||||
|
||||
|
||||
+17
-17
@@ -245,10 +245,19 @@ static int debugfs_show_options(struct seq_file *m, struct dentry *root)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void debugfs_evict_inode(struct inode *inode)
|
||||
{
|
||||
truncate_inode_pages(&inode->i_data, 0);
|
||||
clear_inode(inode);
|
||||
if (S_ISLNK(inode->i_mode))
|
||||
kfree(inode->i_private);
|
||||
}
|
||||
|
||||
static const struct super_operations debugfs_super_operations = {
|
||||
.statfs = simple_statfs,
|
||||
.remount_fs = debugfs_remount,
|
||||
.show_options = debugfs_show_options,
|
||||
.evict_inode = debugfs_evict_inode,
|
||||
};
|
||||
|
||||
static int debug_fill_super(struct super_block *sb, void *data, int silent)
|
||||
@@ -465,23 +474,14 @@ static int __debugfs_remove(struct dentry *dentry, struct dentry *parent)
|
||||
int ret = 0;
|
||||
|
||||
if (debugfs_positive(dentry)) {
|
||||
if (dentry->d_inode) {
|
||||
dget(dentry);
|
||||
switch (dentry->d_inode->i_mode & S_IFMT) {
|
||||
case S_IFDIR:
|
||||
ret = simple_rmdir(parent->d_inode, dentry);
|
||||
break;
|
||||
case S_IFLNK:
|
||||
kfree(dentry->d_inode->i_private);
|
||||
/* fall through */
|
||||
default:
|
||||
simple_unlink(parent->d_inode, dentry);
|
||||
break;
|
||||
}
|
||||
if (!ret)
|
||||
d_delete(dentry);
|
||||
dput(dentry);
|
||||
}
|
||||
dget(dentry);
|
||||
if (S_ISDIR(dentry->d_inode->i_mode))
|
||||
ret = simple_rmdir(parent->d_inode, dentry);
|
||||
else
|
||||
simple_unlink(parent->d_inode, dentry);
|
||||
if (!ret)
|
||||
d_delete(dentry);
|
||||
dput(dentry);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
+44
-3
@@ -31,6 +31,8 @@
|
||||
#include "alloc.h"
|
||||
#include "dat.h"
|
||||
|
||||
static void __nilfs_btree_init(struct nilfs_bmap *bmap);
|
||||
|
||||
static struct nilfs_btree_path *nilfs_btree_alloc_path(void)
|
||||
{
|
||||
struct nilfs_btree_path *path;
|
||||
@@ -368,6 +370,34 @@ static int nilfs_btree_node_broken(const struct nilfs_btree_node *node,
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* nilfs_btree_root_broken - verify consistency of btree root node
|
||||
* @node: btree root node to be examined
|
||||
* @ino: inode number
|
||||
*
|
||||
* Return Value: If node is broken, 1 is returned. Otherwise, 0 is returned.
|
||||
*/
|
||||
static int nilfs_btree_root_broken(const struct nilfs_btree_node *node,
|
||||
unsigned long ino)
|
||||
{
|
||||
int level, flags, nchildren;
|
||||
int ret = 0;
|
||||
|
||||
level = nilfs_btree_node_get_level(node);
|
||||
flags = nilfs_btree_node_get_flags(node);
|
||||
nchildren = nilfs_btree_node_get_nchildren(node);
|
||||
|
||||
if (unlikely(level < NILFS_BTREE_LEVEL_NODE_MIN ||
|
||||
level > NILFS_BTREE_LEVEL_MAX ||
|
||||
nchildren < 0 ||
|
||||
nchildren > NILFS_BTREE_ROOT_NCHILDREN_MAX)) {
|
||||
pr_crit("NILFS: bad btree root (inode number=%lu): level = %d, flags = 0x%x, nchildren = %d\n",
|
||||
ino, level, flags, nchildren);
|
||||
ret = 1;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
int nilfs_btree_broken_node_block(struct buffer_head *bh)
|
||||
{
|
||||
int ret;
|
||||
@@ -1713,7 +1743,7 @@ nilfs_btree_commit_convert_and_insert(struct nilfs_bmap *btree,
|
||||
|
||||
/* convert and insert */
|
||||
dat = NILFS_BMAP_USE_VBN(btree) ? nilfs_bmap_get_dat(btree) : NULL;
|
||||
nilfs_btree_init(btree);
|
||||
__nilfs_btree_init(btree);
|
||||
if (nreq != NULL) {
|
||||
nilfs_bmap_commit_alloc_ptr(btree, dreq, dat);
|
||||
nilfs_bmap_commit_alloc_ptr(btree, nreq, dat);
|
||||
@@ -2294,12 +2324,23 @@ static const struct nilfs_bmap_operations nilfs_btree_ops_gc = {
|
||||
.bop_gather_data = NULL,
|
||||
};
|
||||
|
||||
int nilfs_btree_init(struct nilfs_bmap *bmap)
|
||||
static void __nilfs_btree_init(struct nilfs_bmap *bmap)
|
||||
{
|
||||
bmap->b_ops = &nilfs_btree_ops;
|
||||
bmap->b_nchildren_per_block =
|
||||
NILFS_BTREE_NODE_NCHILDREN_MAX(nilfs_btree_node_size(bmap));
|
||||
return 0;
|
||||
}
|
||||
|
||||
int nilfs_btree_init(struct nilfs_bmap *bmap)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
__nilfs_btree_init(bmap);
|
||||
|
||||
if (nilfs_btree_root_broken(nilfs_btree_get_root(bmap),
|
||||
bmap->b_inode->i_ino))
|
||||
ret = -EIO;
|
||||
return ret;
|
||||
}
|
||||
|
||||
void nilfs_btree_init_gc(struct nilfs_bmap *bmap)
|
||||
|
||||
@@ -19,7 +19,6 @@
|
||||
#include <linux/mount.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/idr.h>
|
||||
#include <linux/namei.h>
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/completion.h>
|
||||
@@ -163,17 +162,6 @@ void proc_free_inum(unsigned int inum)
|
||||
spin_unlock_irqrestore(&proc_inum_lock, flags);
|
||||
}
|
||||
|
||||
static void *proc_follow_link(struct dentry *dentry, struct nameidata *nd)
|
||||
{
|
||||
nd_set_link(nd, __PDE_DATA(dentry->d_inode));
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static const struct inode_operations proc_link_inode_operations = {
|
||||
.readlink = generic_readlink,
|
||||
.follow_link = proc_follow_link,
|
||||
};
|
||||
|
||||
/*
|
||||
* As some entries in /proc are volatile, we want to
|
||||
* get rid of unused dentries. This could be made
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
#include <linux/slab.h>
|
||||
#include <linux/mount.h>
|
||||
#include <linux/magic.h>
|
||||
#include <linux/namei.h>
|
||||
|
||||
#include <asm/uaccess.h>
|
||||
|
||||
@@ -373,6 +374,26 @@ static const struct file_operations proc_reg_file_ops_no_compat = {
|
||||
};
|
||||
#endif
|
||||
|
||||
static void *proc_follow_link(struct dentry *dentry, struct nameidata *nd)
|
||||
{
|
||||
struct proc_dir_entry *pde = PDE(dentry->d_inode);
|
||||
if (unlikely(!use_pde(pde)))
|
||||
return ERR_PTR(-EINVAL);
|
||||
nd_set_link(nd, pde->data);
|
||||
return pde;
|
||||
}
|
||||
|
||||
static void proc_put_link(struct dentry *dentry, struct nameidata *nd, void *p)
|
||||
{
|
||||
unuse_pde(p);
|
||||
}
|
||||
|
||||
const struct inode_operations proc_link_inode_operations = {
|
||||
.readlink = generic_readlink,
|
||||
.follow_link = proc_follow_link,
|
||||
.put_link = proc_put_link,
|
||||
};
|
||||
|
||||
struct inode *proc_get_inode(struct super_block *sb, struct proc_dir_entry *de)
|
||||
{
|
||||
struct inode *inode = new_inode_pseudo(sb);
|
||||
|
||||
@@ -202,6 +202,7 @@ struct pde_opener {
|
||||
int closing;
|
||||
struct completion *c;
|
||||
};
|
||||
extern const struct inode_operations proc_link_inode_operations;
|
||||
|
||||
extern const struct inode_operations proc_pid_link_inode_operations;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user