Merge tag 'v3.10.99' into update
This is the 3.10.99 stable release
This commit is contained in:
@@ -2277,7 +2277,7 @@ static int read_partial_message(struct ceph_connection *con)
|
||||
con->in_base_pos = -front_len - middle_len - data_len -
|
||||
sizeof(m->footer);
|
||||
con->in_tag = CEPH_MSGR_TAG_READY;
|
||||
return 0;
|
||||
return 1;
|
||||
} else if ((s64)seq - (s64)con->in_seq > 1) {
|
||||
pr_err("read_partial_message bad seq %lld expected %lld\n",
|
||||
seq, con->in_seq + 1);
|
||||
@@ -2310,7 +2310,7 @@ static int read_partial_message(struct ceph_connection *con)
|
||||
sizeof(m->footer);
|
||||
con->in_tag = CEPH_MSGR_TAG_READY;
|
||||
con->in_seq++;
|
||||
return 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
BUG_ON(!con->in_msg);
|
||||
|
||||
@@ -87,6 +87,7 @@ static int scm_fp_copy(struct cmsghdr *cmsg, struct scm_fp_list **fplp)
|
||||
*fplp = fpl;
|
||||
fpl->count = 0;
|
||||
fpl->max = SCM_MAX_FD;
|
||||
fpl->user = NULL;
|
||||
}
|
||||
fpp = &fpl->fp[fpl->count];
|
||||
|
||||
@@ -107,6 +108,10 @@ static int scm_fp_copy(struct cmsghdr *cmsg, struct scm_fp_list **fplp)
|
||||
*fpp++ = file;
|
||||
fpl->count++;
|
||||
}
|
||||
|
||||
if (!fpl->user)
|
||||
fpl->user = get_uid(current_user());
|
||||
|
||||
return num;
|
||||
}
|
||||
|
||||
@@ -119,6 +124,7 @@ void __scm_destroy(struct scm_cookie *scm)
|
||||
scm->fp = NULL;
|
||||
for (i=fpl->count-1; i>=0; i--)
|
||||
fput(fpl->fp[i]);
|
||||
free_uid(fpl->user);
|
||||
kfree(fpl);
|
||||
}
|
||||
}
|
||||
@@ -337,6 +343,7 @@ struct scm_fp_list *scm_fp_dup(struct scm_fp_list *fpl)
|
||||
for (i = 0; i < fpl->count; i++)
|
||||
get_file(fpl->fp[i]);
|
||||
new_fpl->max = new_fpl->count;
|
||||
new_fpl->user = get_uid(fpl->user);
|
||||
}
|
||||
return new_fpl;
|
||||
}
|
||||
|
||||
@@ -747,10 +747,8 @@ void mesh_plink_broken(struct sta_info *sta)
|
||||
static void mesh_path_node_reclaim(struct rcu_head *rp)
|
||||
{
|
||||
struct mpath_node *node = container_of(rp, struct mpath_node, rcu);
|
||||
struct ieee80211_sub_if_data *sdata = node->mpath->sdata;
|
||||
|
||||
del_timer_sync(&node->mpath->timer);
|
||||
atomic_dec(&sdata->u.mesh.mpaths);
|
||||
kfree(node->mpath);
|
||||
kfree(node);
|
||||
}
|
||||
@@ -758,8 +756,9 @@ static void mesh_path_node_reclaim(struct rcu_head *rp)
|
||||
/* needs to be called with the corresponding hashwlock taken */
|
||||
static void __mesh_path_del(struct mesh_table *tbl, struct mpath_node *node)
|
||||
{
|
||||
struct mesh_path *mpath;
|
||||
mpath = node->mpath;
|
||||
struct mesh_path *mpath = node->mpath;
|
||||
struct ieee80211_sub_if_data *sdata = node->mpath->sdata;
|
||||
|
||||
spin_lock(&mpath->state_lock);
|
||||
mpath->flags |= MESH_PATH_RESOLVING;
|
||||
if (mpath->is_gate)
|
||||
@@ -767,6 +766,7 @@ static void __mesh_path_del(struct mesh_table *tbl, struct mpath_node *node)
|
||||
hlist_del_rcu(&node->list);
|
||||
call_rcu(&node->rcu, mesh_path_node_reclaim);
|
||||
spin_unlock(&mpath->state_lock);
|
||||
atomic_dec(&sdata->u.mesh.mpaths);
|
||||
atomic_dec(&tbl->entries);
|
||||
}
|
||||
|
||||
|
||||
@@ -311,6 +311,21 @@ static void death_by_timeout(unsigned long ul_conntrack)
|
||||
nf_ct_put(ct);
|
||||
}
|
||||
|
||||
static inline bool
|
||||
nf_ct_key_equal(struct nf_conntrack_tuple_hash *h,
|
||||
const struct nf_conntrack_tuple *tuple,
|
||||
u16 zone)
|
||||
{
|
||||
struct nf_conn *ct = nf_ct_tuplehash_to_ctrack(h);
|
||||
|
||||
/* A conntrack can be recreated with the equal tuple,
|
||||
* so we need to check that the conntrack is confirmed
|
||||
*/
|
||||
return nf_ct_tuple_equal(tuple, &h->tuple) &&
|
||||
nf_ct_zone(ct) == zone &&
|
||||
nf_ct_is_confirmed(ct);
|
||||
}
|
||||
|
||||
/*
|
||||
* Warning :
|
||||
* - Caller must take a reference on returned object
|
||||
@@ -332,8 +347,7 @@ ____nf_conntrack_find(struct net *net, u16 zone,
|
||||
local_bh_disable();
|
||||
begin:
|
||||
hlist_nulls_for_each_entry_rcu(h, n, &net->ct.hash[bucket], hnnode) {
|
||||
if (nf_ct_tuple_equal(tuple, &h->tuple) &&
|
||||
nf_ct_zone(nf_ct_tuplehash_to_ctrack(h)) == zone) {
|
||||
if (nf_ct_key_equal(h, tuple, zone)) {
|
||||
NF_CT_STAT_INC(net, found);
|
||||
local_bh_enable();
|
||||
return h;
|
||||
@@ -380,8 +394,7 @@ begin:
|
||||
!atomic_inc_not_zero(&ct->ct_general.use)))
|
||||
h = NULL;
|
||||
else {
|
||||
if (unlikely(!nf_ct_tuple_equal(tuple, &h->tuple) ||
|
||||
nf_ct_zone(ct) != zone)) {
|
||||
if (unlikely(!nf_ct_key_equal(h, tuple, zone))) {
|
||||
nf_ct_put(ct);
|
||||
goto begin;
|
||||
}
|
||||
|
||||
@@ -177,12 +177,6 @@ static struct rds_connection *__rds_conn_create(__be32 laddr, __be32 faddr,
|
||||
}
|
||||
}
|
||||
|
||||
if (trans == NULL) {
|
||||
kmem_cache_free(rds_conn_slab, conn);
|
||||
conn = ERR_PTR(-ENODEV);
|
||||
goto out;
|
||||
}
|
||||
|
||||
conn->c_trans = trans;
|
||||
|
||||
ret = trans->conn_alloc(conn, gfp);
|
||||
|
||||
+3
-1
@@ -955,11 +955,13 @@ int rds_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg,
|
||||
release_sock(sk);
|
||||
}
|
||||
|
||||
/* racing with another thread binding seems ok here */
|
||||
lock_sock(sk);
|
||||
if (daddr == 0 || rs->rs_bound_addr == 0) {
|
||||
release_sock(sk);
|
||||
ret = -ENOTCONN; /* XXX not a great errno */
|
||||
goto out;
|
||||
}
|
||||
release_sock(sk);
|
||||
|
||||
/* size of rm including all sgs */
|
||||
ret = rds_rm_size(msg, payload_len);
|
||||
|
||||
+7
-15
@@ -51,7 +51,6 @@
|
||||
struct rfkill {
|
||||
spinlock_t lock;
|
||||
|
||||
const char *name;
|
||||
enum rfkill_type type;
|
||||
|
||||
unsigned long state;
|
||||
@@ -75,6 +74,7 @@ struct rfkill {
|
||||
struct delayed_work poll_work;
|
||||
struct work_struct uevent_work;
|
||||
struct work_struct sync_work;
|
||||
char name[];
|
||||
};
|
||||
#define to_rfkill(d) container_of(d, struct rfkill, dev)
|
||||
|
||||
@@ -875,14 +875,14 @@ struct rfkill * __must_check rfkill_alloc(const char *name,
|
||||
if (WARN_ON(type == RFKILL_TYPE_ALL || type >= NUM_RFKILL_TYPES))
|
||||
return NULL;
|
||||
|
||||
rfkill = kzalloc(sizeof(*rfkill), GFP_KERNEL);
|
||||
rfkill = kzalloc(sizeof(*rfkill) + strlen(name) + 1, GFP_KERNEL);
|
||||
if (!rfkill)
|
||||
return NULL;
|
||||
|
||||
spin_lock_init(&rfkill->lock);
|
||||
INIT_LIST_HEAD(&rfkill->node);
|
||||
rfkill->type = type;
|
||||
rfkill->name = name;
|
||||
strcpy(rfkill->name, name);
|
||||
rfkill->ops = ops;
|
||||
rfkill->data = ops_data;
|
||||
|
||||
@@ -1092,17 +1092,6 @@ static unsigned int rfkill_fop_poll(struct file *file, poll_table *wait)
|
||||
return res;
|
||||
}
|
||||
|
||||
static bool rfkill_readable(struct rfkill_data *data)
|
||||
{
|
||||
bool r;
|
||||
|
||||
mutex_lock(&data->mtx);
|
||||
r = !list_empty(&data->events);
|
||||
mutex_unlock(&data->mtx);
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
static ssize_t rfkill_fop_read(struct file *file, char __user *buf,
|
||||
size_t count, loff_t *pos)
|
||||
{
|
||||
@@ -1119,8 +1108,11 @@ static ssize_t rfkill_fop_read(struct file *file, char __user *buf,
|
||||
goto out;
|
||||
}
|
||||
mutex_unlock(&data->mtx);
|
||||
/* since we re-check and it just compares pointers,
|
||||
* using !list_empty() without locking isn't a problem
|
||||
*/
|
||||
ret = wait_event_interruptible(data->read_wait,
|
||||
rfkill_readable(data));
|
||||
!list_empty(&data->events));
|
||||
mutex_lock(&data->mtx);
|
||||
|
||||
if (ret)
|
||||
|
||||
+1
-1
@@ -1221,7 +1221,7 @@ int qword_get(char **bpp, char *dest, int bufsize)
|
||||
if (bp[0] == '\\' && bp[1] == 'x') {
|
||||
/* HEX STRING */
|
||||
bp += 2;
|
||||
while (len < bufsize) {
|
||||
while (len < bufsize - 1) {
|
||||
int h, l;
|
||||
|
||||
h = hex_to_bin(bp[0]);
|
||||
|
||||
+2
-2
@@ -1514,7 +1514,7 @@ static void unix_detach_fds(struct scm_cookie *scm, struct sk_buff *skb)
|
||||
UNIXCB(skb).fp = NULL;
|
||||
|
||||
for (i = scm->fp->count-1; i >= 0; i--)
|
||||
unix_notinflight(scm->fp->fp[i]);
|
||||
unix_notinflight(scm->fp->user, scm->fp->fp[i]);
|
||||
}
|
||||
|
||||
static void unix_destruct_scm(struct sk_buff *skb)
|
||||
@@ -1579,7 +1579,7 @@ static int unix_attach_fds(struct scm_cookie *scm, struct sk_buff *skb)
|
||||
return -ENOMEM;
|
||||
|
||||
for (i = scm->fp->count - 1; i >= 0; i--)
|
||||
unix_inflight(scm->fp->fp[i]);
|
||||
unix_inflight(scm->fp->user, scm->fp->fp[i]);
|
||||
return max_level;
|
||||
}
|
||||
|
||||
|
||||
+4
-4
@@ -122,7 +122,7 @@ struct sock *unix_get_socket(struct file *filp)
|
||||
* descriptor if it is for an AF_UNIX socket.
|
||||
*/
|
||||
|
||||
void unix_inflight(struct file *fp)
|
||||
void unix_inflight(struct user_struct *user, struct file *fp)
|
||||
{
|
||||
struct sock *s = unix_get_socket(fp);
|
||||
|
||||
@@ -139,11 +139,11 @@ void unix_inflight(struct file *fp)
|
||||
}
|
||||
unix_tot_inflight++;
|
||||
}
|
||||
fp->f_cred->user->unix_inflight++;
|
||||
user->unix_inflight++;
|
||||
spin_unlock(&unix_gc_lock);
|
||||
}
|
||||
|
||||
void unix_notinflight(struct file *fp)
|
||||
void unix_notinflight(struct user_struct *user, struct file *fp)
|
||||
{
|
||||
struct sock *s = unix_get_socket(fp);
|
||||
|
||||
@@ -157,7 +157,7 @@ void unix_notinflight(struct file *fp)
|
||||
list_del_init(&u->link);
|
||||
unix_tot_inflight--;
|
||||
}
|
||||
fp->f_cred->user->unix_inflight--;
|
||||
user->unix_inflight--;
|
||||
spin_unlock(&unix_gc_lock);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user