mirror of
https://github.com/torvalds/linux
synced 2024-09-06 18:01:05 +00:00
Two small fixes from Xiubo and myself, marked for stable.
-----BEGIN PGP SIGNATURE----- iQFHBAABCAAxFiEEydHwtzie9C7TfviiSn/eOAIR84sFAmQA0uETHGlkcnlvbW92 QGdtYWlsLmNvbQAKCRBKf944AhHzi92pB/4yZ7Go/7j2zb84N9nEYPCHV23v1vED YGZIiWHYv6X3dJyTYpcU7Mn9TF00naTGDKi9NpTZjKOUIkibXPFJfbG7Dh4T2HhN TKw9EbldCaXE1mR7o+g/mrVQFM1PIR1VbtIeszL3eD2qO0aXEGyBMvPfUNqFX/M7 lNWVjuglIaYUL235Uid/wt0zfmPDvtGD24fjpN0e22UQh/aBFnodIDpa/AapsFKp yifzqe/ADbvgnHwOhMiEMG1gRFd3vywVfPDQmQ41oSMnf7yTtLWE9t47wTfyoTY5 IwZY2K1H51QJej/mObYJmClp/y81xSLXEydFdQ571MqZbDeDfQeM23/7 =cWWl -----END PGP SIGNATURE----- Merge tag 'ceph-for-6.3-rc1' of https://github.com/ceph/ceph-client Pull ceph fixes from Ilya Dryomov: "Two small fixes from Xiubo and myself, marked for stable" * tag 'ceph-for-6.3-rc1' of https://github.com/ceph/ceph-client: rbd: avoid use-after-free in do_rbd_add() when rbd_dev_create() fails ceph: update the time stamps and try to drop the suid/sgid
This commit is contained in:
commit
c3f9b9fa10
|
@ -5291,8 +5291,7 @@ static void rbd_dev_release(struct device *dev)
|
||||||
module_put(THIS_MODULE);
|
module_put(THIS_MODULE);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct rbd_device *__rbd_dev_create(struct rbd_client *rbdc,
|
static struct rbd_device *__rbd_dev_create(struct rbd_spec *spec)
|
||||||
struct rbd_spec *spec)
|
|
||||||
{
|
{
|
||||||
struct rbd_device *rbd_dev;
|
struct rbd_device *rbd_dev;
|
||||||
|
|
||||||
|
@ -5337,9 +5336,6 @@ static struct rbd_device *__rbd_dev_create(struct rbd_client *rbdc,
|
||||||
rbd_dev->dev.parent = &rbd_root_dev;
|
rbd_dev->dev.parent = &rbd_root_dev;
|
||||||
device_initialize(&rbd_dev->dev);
|
device_initialize(&rbd_dev->dev);
|
||||||
|
|
||||||
rbd_dev->rbd_client = rbdc;
|
|
||||||
rbd_dev->spec = spec;
|
|
||||||
|
|
||||||
return rbd_dev;
|
return rbd_dev;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5352,12 +5348,10 @@ static struct rbd_device *rbd_dev_create(struct rbd_client *rbdc,
|
||||||
{
|
{
|
||||||
struct rbd_device *rbd_dev;
|
struct rbd_device *rbd_dev;
|
||||||
|
|
||||||
rbd_dev = __rbd_dev_create(rbdc, spec);
|
rbd_dev = __rbd_dev_create(spec);
|
||||||
if (!rbd_dev)
|
if (!rbd_dev)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
rbd_dev->opts = opts;
|
|
||||||
|
|
||||||
/* get an id and fill in device name */
|
/* get an id and fill in device name */
|
||||||
rbd_dev->dev_id = ida_simple_get(&rbd_dev_id_ida, 0,
|
rbd_dev->dev_id = ida_simple_get(&rbd_dev_id_ida, 0,
|
||||||
minor_to_rbd_dev_id(1 << MINORBITS),
|
minor_to_rbd_dev_id(1 << MINORBITS),
|
||||||
|
@ -5374,6 +5368,10 @@ static struct rbd_device *rbd_dev_create(struct rbd_client *rbdc,
|
||||||
/* we have a ref from do_rbd_add() */
|
/* we have a ref from do_rbd_add() */
|
||||||
__module_get(THIS_MODULE);
|
__module_get(THIS_MODULE);
|
||||||
|
|
||||||
|
rbd_dev->rbd_client = rbdc;
|
||||||
|
rbd_dev->spec = spec;
|
||||||
|
rbd_dev->opts = opts;
|
||||||
|
|
||||||
dout("%s rbd_dev %p dev_id %d\n", __func__, rbd_dev, rbd_dev->dev_id);
|
dout("%s rbd_dev %p dev_id %d\n", __func__, rbd_dev, rbd_dev->dev_id);
|
||||||
return rbd_dev;
|
return rbd_dev;
|
||||||
|
|
||||||
|
@ -6735,7 +6733,7 @@ static int rbd_dev_probe_parent(struct rbd_device *rbd_dev, int depth)
|
||||||
goto out_err;
|
goto out_err;
|
||||||
}
|
}
|
||||||
|
|
||||||
parent = __rbd_dev_create(rbd_dev->rbd_client, rbd_dev->parent_spec);
|
parent = __rbd_dev_create(rbd_dev->parent_spec);
|
||||||
if (!parent) {
|
if (!parent) {
|
||||||
ret = -ENOMEM;
|
ret = -ENOMEM;
|
||||||
goto out_err;
|
goto out_err;
|
||||||
|
@ -6745,8 +6743,8 @@ static int rbd_dev_probe_parent(struct rbd_device *rbd_dev, int depth)
|
||||||
* Images related by parent/child relationships always share
|
* Images related by parent/child relationships always share
|
||||||
* rbd_client and spec/parent_spec, so bump their refcounts.
|
* rbd_client and spec/parent_spec, so bump their refcounts.
|
||||||
*/
|
*/
|
||||||
__rbd_get_client(rbd_dev->rbd_client);
|
parent->rbd_client = __rbd_get_client(rbd_dev->rbd_client);
|
||||||
rbd_spec_get(rbd_dev->parent_spec);
|
parent->spec = rbd_spec_get(rbd_dev->parent_spec);
|
||||||
|
|
||||||
__set_bit(RBD_DEV_FLAG_READONLY, &parent->flags);
|
__set_bit(RBD_DEV_FLAG_READONLY, &parent->flags);
|
||||||
|
|
||||||
|
|
|
@ -2098,6 +2098,9 @@ static long ceph_fallocate(struct file *file, int mode,
|
||||||
loff_t endoff = 0;
|
loff_t endoff = 0;
|
||||||
loff_t size;
|
loff_t size;
|
||||||
|
|
||||||
|
dout("%s %p %llx.%llx mode %x, offset %llu length %llu\n", __func__,
|
||||||
|
inode, ceph_vinop(inode), mode, offset, length);
|
||||||
|
|
||||||
if (mode != (FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE))
|
if (mode != (FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE))
|
||||||
return -EOPNOTSUPP;
|
return -EOPNOTSUPP;
|
||||||
|
|
||||||
|
@ -2132,6 +2135,10 @@ static long ceph_fallocate(struct file *file, int mode,
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto unlock;
|
goto unlock;
|
||||||
|
|
||||||
|
ret = file_modified(file);
|
||||||
|
if (ret)
|
||||||
|
goto put_caps;
|
||||||
|
|
||||||
filemap_invalidate_lock(inode->i_mapping);
|
filemap_invalidate_lock(inode->i_mapping);
|
||||||
ceph_fscache_invalidate(inode, false);
|
ceph_fscache_invalidate(inode, false);
|
||||||
ceph_zero_pagecache_range(inode, offset, length);
|
ceph_zero_pagecache_range(inode, offset, length);
|
||||||
|
@ -2147,6 +2154,7 @@ static long ceph_fallocate(struct file *file, int mode,
|
||||||
}
|
}
|
||||||
filemap_invalidate_unlock(inode->i_mapping);
|
filemap_invalidate_unlock(inode->i_mapping);
|
||||||
|
|
||||||
|
put_caps:
|
||||||
ceph_put_cap_refs(ci, got);
|
ceph_put_cap_refs(ci, got);
|
||||||
unlock:
|
unlock:
|
||||||
inode_unlock(inode);
|
inode_unlock(inode);
|
||||||
|
|
Loading…
Reference in a new issue