mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-06 10:58:48 +09:00
Merge 41410965c3 ("Merge tag 'pci-v6.1-fixes-1' of git://git.kernel.org/pub/scm/linux/kernel/git/helgaas/pci") into android-mainline
Steps on the way to 6.1-rc1 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com> Change-Id: Ieb81934101707565f273f63e998714a8b3bd2ba9
This commit is contained in:
@@ -803,7 +803,7 @@ void __iomem *marvel_ioportmap (unsigned long addr)
|
||||
return (void __iomem *)addr;
|
||||
}
|
||||
|
||||
unsigned u8
|
||||
u8
|
||||
marvel_ioread8(const void __iomem *xaddr)
|
||||
{
|
||||
unsigned long addr = (unsigned long) xaddr;
|
||||
|
||||
@@ -36,7 +36,6 @@ extern int console_write_chan(struct chan *chan, const char *buf,
|
||||
int len);
|
||||
extern int console_open_chan(struct line *line, struct console *co);
|
||||
extern void deactivate_chan(struct chan *chan, int irq);
|
||||
extern void reactivate_chan(struct chan *chan, int irq);
|
||||
extern void chan_enable_winch(struct chan *chan, struct tty_port *port);
|
||||
extern int enable_chan(struct line *line);
|
||||
extern void close_chan(struct line *line);
|
||||
|
||||
@@ -283,7 +283,7 @@ struct unplugged_pages {
|
||||
};
|
||||
|
||||
static DEFINE_MUTEX(plug_mem_mutex);
|
||||
static unsigned long long unplugged_pages_count = 0;
|
||||
static unsigned long long unplugged_pages_count;
|
||||
static LIST_HEAD(unplugged_pages);
|
||||
static int unplug_index = UNPLUGGED_PER_PAGE;
|
||||
|
||||
@@ -846,13 +846,12 @@ static int notify_panic(struct notifier_block *self, unsigned long unused1,
|
||||
|
||||
mconsole_notify(notify_socket, MCONSOLE_PANIC, message,
|
||||
strlen(message) + 1);
|
||||
return 0;
|
||||
return NOTIFY_DONE;
|
||||
}
|
||||
|
||||
static struct notifier_block panic_exit_notifier = {
|
||||
.notifier_call = notify_panic,
|
||||
.next = NULL,
|
||||
.priority = 1
|
||||
.notifier_call = notify_panic,
|
||||
.priority = INT_MAX, /* run as soon as possible */
|
||||
};
|
||||
|
||||
static int add_notifier(void)
|
||||
|
||||
@@ -122,7 +122,7 @@ static int __init mmapper_init(void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void mmapper_exit(void)
|
||||
static void __exit mmapper_exit(void)
|
||||
{
|
||||
misc_deregister(&mmapper_dev);
|
||||
}
|
||||
|
||||
@@ -265,7 +265,7 @@ static void uml_net_poll_controller(struct net_device *dev)
|
||||
static void uml_net_get_drvinfo(struct net_device *dev,
|
||||
struct ethtool_drvinfo *info)
|
||||
{
|
||||
strlcpy(info->driver, DRIVER_NAME, sizeof(info->driver));
|
||||
strscpy(info->driver, DRIVER_NAME, sizeof(info->driver));
|
||||
}
|
||||
|
||||
static const struct ethtool_ops uml_net_ethtool_ops = {
|
||||
|
||||
@@ -106,7 +106,7 @@ static const struct tty_operations ssl_ops = {
|
||||
/* Changed by ssl_init and referenced by ssl_exit, which are both serialized
|
||||
* by being an initcall and exitcall, respectively.
|
||||
*/
|
||||
static int ssl_init_done = 0;
|
||||
static int ssl_init_done;
|
||||
|
||||
static void ssl_console_write(struct console *c, const char *string,
|
||||
unsigned len)
|
||||
|
||||
@@ -88,7 +88,7 @@ static int con_remove(int n, char **error_out)
|
||||
}
|
||||
|
||||
/* Set in an initcall, checked in an exitcall */
|
||||
static int con_init_done = 0;
|
||||
static int con_init_done;
|
||||
|
||||
static int con_install(struct tty_driver *driver, struct tty_struct *tty)
|
||||
{
|
||||
|
||||
@@ -1555,7 +1555,7 @@ static void do_io(struct io_thread_req *req, struct io_desc *desc)
|
||||
int kernel_fd = -1;
|
||||
|
||||
/* Only changed by the io thread. XXX: currently unused. */
|
||||
static int io_count = 0;
|
||||
static int io_count;
|
||||
|
||||
int io_thread(void *arg)
|
||||
{
|
||||
|
||||
@@ -1372,7 +1372,7 @@ static void vector_net_poll_controller(struct net_device *dev)
|
||||
static void vector_net_get_drvinfo(struct net_device *dev,
|
||||
struct ethtool_drvinfo *info)
|
||||
{
|
||||
strlcpy(info->driver, DRIVER_NAME, sizeof(info->driver));
|
||||
strscpy(info->driver, DRIVER_NAME, sizeof(info->driver));
|
||||
}
|
||||
|
||||
static int vector_net_load_bpf_flash(struct net_device *dev,
|
||||
|
||||
@@ -857,7 +857,7 @@ void *pci_root_bus_fwnode(struct pci_bus *bus)
|
||||
return um_pci_fwnode;
|
||||
}
|
||||
|
||||
static int um_pci_init(void)
|
||||
static int __init um_pci_init(void)
|
||||
{
|
||||
int err, i;
|
||||
|
||||
@@ -940,7 +940,7 @@ free:
|
||||
}
|
||||
module_init(um_pci_init);
|
||||
|
||||
static void um_pci_exit(void)
|
||||
static void __exit um_pci_exit(void)
|
||||
{
|
||||
unregister_virtio_driver(&um_pci_virtio_driver);
|
||||
irq_domain_remove(um_pci_msi_domain);
|
||||
|
||||
@@ -374,45 +374,48 @@ static irqreturn_t vu_req_read_message(struct virtio_uml_device *vu_dev,
|
||||
u8 extra_payload[512];
|
||||
} msg;
|
||||
int rc;
|
||||
irqreturn_t irq_rc = IRQ_NONE;
|
||||
|
||||
rc = vhost_user_recv_req(vu_dev, &msg.msg,
|
||||
sizeof(msg.msg.payload) +
|
||||
sizeof(msg.extra_payload));
|
||||
while (1) {
|
||||
rc = vhost_user_recv_req(vu_dev, &msg.msg,
|
||||
sizeof(msg.msg.payload) +
|
||||
sizeof(msg.extra_payload));
|
||||
if (rc)
|
||||
break;
|
||||
|
||||
vu_dev->recv_rc = rc;
|
||||
if (rc)
|
||||
return IRQ_NONE;
|
||||
|
||||
switch (msg.msg.header.request) {
|
||||
case VHOST_USER_SLAVE_CONFIG_CHANGE_MSG:
|
||||
vu_dev->config_changed_irq = true;
|
||||
response = 0;
|
||||
break;
|
||||
case VHOST_USER_SLAVE_VRING_CALL:
|
||||
virtio_device_for_each_vq((&vu_dev->vdev), vq) {
|
||||
if (vq->index == msg.msg.payload.vring_state.index) {
|
||||
response = 0;
|
||||
vu_dev->vq_irq_vq_map |= BIT_ULL(vq->index);
|
||||
break;
|
||||
switch (msg.msg.header.request) {
|
||||
case VHOST_USER_SLAVE_CONFIG_CHANGE_MSG:
|
||||
vu_dev->config_changed_irq = true;
|
||||
response = 0;
|
||||
break;
|
||||
case VHOST_USER_SLAVE_VRING_CALL:
|
||||
virtio_device_for_each_vq((&vu_dev->vdev), vq) {
|
||||
if (vq->index == msg.msg.payload.vring_state.index) {
|
||||
response = 0;
|
||||
vu_dev->vq_irq_vq_map |= BIT_ULL(vq->index);
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case VHOST_USER_SLAVE_IOTLB_MSG:
|
||||
/* not supported - VIRTIO_F_ACCESS_PLATFORM */
|
||||
case VHOST_USER_SLAVE_VRING_HOST_NOTIFIER_MSG:
|
||||
/* not supported - VHOST_USER_PROTOCOL_F_HOST_NOTIFIER */
|
||||
default:
|
||||
vu_err(vu_dev, "unexpected slave request %d\n",
|
||||
msg.msg.header.request);
|
||||
}
|
||||
break;
|
||||
case VHOST_USER_SLAVE_IOTLB_MSG:
|
||||
/* not supported - VIRTIO_F_ACCESS_PLATFORM */
|
||||
case VHOST_USER_SLAVE_VRING_HOST_NOTIFIER_MSG:
|
||||
/* not supported - VHOST_USER_PROTOCOL_F_HOST_NOTIFIER */
|
||||
default:
|
||||
vu_err(vu_dev, "unexpected slave request %d\n",
|
||||
msg.msg.header.request);
|
||||
}
|
||||
|
||||
if (ev && !vu_dev->suspended)
|
||||
time_travel_add_irq_event(ev);
|
||||
if (ev && !vu_dev->suspended)
|
||||
time_travel_add_irq_event(ev);
|
||||
|
||||
if (msg.msg.header.flags & VHOST_USER_FLAG_NEED_REPLY)
|
||||
vhost_user_reply(vu_dev, &msg.msg, response);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
if (msg.msg.header.flags & VHOST_USER_FLAG_NEED_REPLY)
|
||||
vhost_user_reply(vu_dev, &msg.msg, response);
|
||||
irq_rc = IRQ_HANDLED;
|
||||
};
|
||||
/* mask EAGAIN as we try non-blocking read until socket is empty */
|
||||
vu_dev->recv_rc = (rc == -EAGAIN) ? 0 : rc;
|
||||
return irq_rc;
|
||||
}
|
||||
|
||||
static irqreturn_t vu_req_interrupt(int irq, void *data)
|
||||
|
||||
@@ -169,7 +169,7 @@ __uml_setup("iomem=", parse_iomem,
|
||||
);
|
||||
|
||||
/*
|
||||
* This list is constructed in parse_iomem and addresses filled in in
|
||||
* This list is constructed in parse_iomem and addresses filled in
|
||||
* setup_iomem, both of which run during early boot. Afterwards, it's
|
||||
* unchanged.
|
||||
*/
|
||||
|
||||
@@ -96,7 +96,7 @@ static int show_cpuinfo(struct seq_file *m, void *v)
|
||||
|
||||
static void *c_start(struct seq_file *m, loff_t *pos)
|
||||
{
|
||||
return *pos < NR_CPUS ? cpu_data + *pos : NULL;
|
||||
return *pos < nr_cpu_ids ? cpu_data + *pos : NULL;
|
||||
}
|
||||
|
||||
static void *c_next(struct seq_file *m, void *v, loff_t *pos)
|
||||
@@ -132,7 +132,7 @@ static int have_root __initdata;
|
||||
static int have_console __initdata;
|
||||
|
||||
/* Set in uml_mem_setup and modified in linux_main */
|
||||
long long physmem_size = 32 * 1024 * 1024;
|
||||
long long physmem_size = 64 * 1024 * 1024;
|
||||
EXPORT_SYMBOL(physmem_size);
|
||||
|
||||
static const char *usage_string =
|
||||
@@ -247,13 +247,13 @@ static int panic_exit(struct notifier_block *self, unsigned long unused1,
|
||||
bust_spinlocks(0);
|
||||
uml_exitcode = 1;
|
||||
os_dump_core();
|
||||
return 0;
|
||||
|
||||
return NOTIFY_DONE;
|
||||
}
|
||||
|
||||
static struct notifier_block panic_exit_notifier = {
|
||||
.notifier_call = panic_exit,
|
||||
.next = NULL,
|
||||
.priority = 0
|
||||
.notifier_call = panic_exit,
|
||||
.priority = INT_MAX - 1, /* run as 2nd notifier, won't return */
|
||||
};
|
||||
|
||||
void uml_finishsetup(void)
|
||||
@@ -416,7 +416,7 @@ void __init setup_arch(char **cmdline_p)
|
||||
read_initrd();
|
||||
|
||||
paging_init();
|
||||
strlcpy(boot_command_line, command_line, COMMAND_LINE_SIZE);
|
||||
strscpy(boot_command_line, command_line, COMMAND_LINE_SIZE);
|
||||
*cmdline_p = command_line;
|
||||
setup_hostinfo(host_info, sizeof host_info);
|
||||
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
#include <os.h>
|
||||
|
||||
/* Changed by set_umid_arg */
|
||||
static int umid_inited = 0;
|
||||
static int umid_inited;
|
||||
|
||||
static int __init set_umid_arg(char *name, int *add)
|
||||
{
|
||||
|
||||
@@ -48,7 +48,7 @@ void hmem_register_device(int target_nid, struct resource *r)
|
||||
rc = platform_device_add_data(pdev, &info, sizeof(info));
|
||||
if (rc < 0) {
|
||||
pr_err("hmem memregion_info allocation failure for %pr\n", &res);
|
||||
goto out_pdev;
|
||||
goto out_resource;
|
||||
}
|
||||
|
||||
rc = platform_device_add_resources(pdev, &res, 1);
|
||||
@@ -66,7 +66,7 @@ void hmem_register_device(int target_nid, struct resource *r)
|
||||
return;
|
||||
|
||||
out_resource:
|
||||
put_device(&pdev->dev);
|
||||
platform_device_put(pdev);
|
||||
out_pdev:
|
||||
memregion_free(id);
|
||||
}
|
||||
|
||||
@@ -363,7 +363,7 @@ static void dax_free_inode(struct inode *inode)
|
||||
{
|
||||
struct dax_device *dax_dev = to_dax_dev(inode);
|
||||
if (inode->i_rdev)
|
||||
ida_simple_remove(&dax_minor_ida, iminor(inode));
|
||||
ida_free(&dax_minor_ida, iminor(inode));
|
||||
kmem_cache_free(dax_cache, dax_dev);
|
||||
}
|
||||
|
||||
@@ -445,7 +445,7 @@ struct dax_device *alloc_dax(void *private, const struct dax_operations *ops)
|
||||
if (WARN_ON_ONCE(ops && !ops->zero_page_range))
|
||||
return ERR_PTR(-EINVAL);
|
||||
|
||||
minor = ida_simple_get(&dax_minor_ida, 0, MINORMASK+1, GFP_KERNEL);
|
||||
minor = ida_alloc_max(&dax_minor_ida, MINORMASK, GFP_KERNEL);
|
||||
if (minor < 0)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
@@ -459,7 +459,7 @@ struct dax_device *alloc_dax(void *private, const struct dax_operations *ops)
|
||||
return dax_dev;
|
||||
|
||||
err_dev:
|
||||
ida_simple_remove(&dax_minor_ida, minor);
|
||||
ida_free(&dax_minor_ida, minor);
|
||||
return ERR_PTR(-ENOMEM);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(alloc_dax);
|
||||
|
||||
@@ -1379,6 +1379,9 @@ static int i3c_master_reattach_i3c_dev(struct i3c_dev_desc *dev,
|
||||
i3c_bus_set_addr_slot_status(&master->bus,
|
||||
dev->info.dyn_addr,
|
||||
I3C_ADDR_SLOT_I3C_DEV);
|
||||
if (old_dyn_addr)
|
||||
i3c_bus_set_addr_slot_status(&master->bus, old_dyn_addr,
|
||||
I3C_ADDR_SLOT_FREE);
|
||||
}
|
||||
|
||||
if (master->ops->reattach_i3c_dev) {
|
||||
@@ -1908,10 +1911,6 @@ int i3c_master_add_i3c_dev_locked(struct i3c_master_controller *master,
|
||||
i3c_master_free_i3c_dev(olddev);
|
||||
}
|
||||
|
||||
ret = i3c_master_reattach_i3c_dev(newdev, old_dyn_addr);
|
||||
if (ret)
|
||||
goto err_detach_dev;
|
||||
|
||||
/*
|
||||
* Depending on our previous state, the expected dynamic address might
|
||||
* differ:
|
||||
|
||||
@@ -409,7 +409,7 @@ int ubiblock_create(struct ubi_volume_info *vi)
|
||||
ret = blk_mq_alloc_tag_set(&dev->tag_set);
|
||||
if (ret) {
|
||||
dev_err(disk_to_dev(dev->gd), "blk_mq_alloc_tag_set failed");
|
||||
goto out_free_dev;;
|
||||
goto out_free_dev;
|
||||
}
|
||||
|
||||
|
||||
@@ -441,7 +441,7 @@ int ubiblock_create(struct ubi_volume_info *vi)
|
||||
|
||||
/*
|
||||
* Create one workqueue per volume (per registered block device).
|
||||
* Rembember workqueues are cheap, they're not threads.
|
||||
* Remember workqueues are cheap, they're not threads.
|
||||
*/
|
||||
dev->wq = alloc_workqueue("%s", 0, 0, gd->disk_name);
|
||||
if (!dev->wq) {
|
||||
|
||||
@@ -807,6 +807,7 @@ static int autoresize(struct ubi_device *ubi, int vol_id)
|
||||
* @ubi_num: number to assign to the new UBI device
|
||||
* @vid_hdr_offset: VID header offset
|
||||
* @max_beb_per1024: maximum expected number of bad PEB per 1024 PEBs
|
||||
* @disable_fm: whether disable fastmap
|
||||
*
|
||||
* This function attaches MTD device @mtd_dev to UBI and assign @ubi_num number
|
||||
* to the newly created UBI device, unless @ubi_num is %UBI_DEV_NUM_AUTO, in
|
||||
@@ -814,11 +815,15 @@ static int autoresize(struct ubi_device *ubi, int vol_id)
|
||||
* automatically. Returns the new UBI device number in case of success and a
|
||||
* negative error code in case of failure.
|
||||
*
|
||||
* If @disable_fm is true, ubi doesn't create new fastmap even the module param
|
||||
* 'fm_autoconvert' is set, and existed old fastmap will be destroyed after
|
||||
* doing full scanning.
|
||||
*
|
||||
* Note, the invocations of this function has to be serialized by the
|
||||
* @ubi_devices_mutex.
|
||||
*/
|
||||
int ubi_attach_mtd_dev(struct mtd_info *mtd, int ubi_num,
|
||||
int vid_hdr_offset, int max_beb_per1024)
|
||||
int vid_hdr_offset, int max_beb_per1024, bool disable_fm)
|
||||
{
|
||||
struct ubi_device *ubi;
|
||||
int i, err;
|
||||
@@ -921,7 +926,7 @@ int ubi_attach_mtd_dev(struct mtd_info *mtd, int ubi_num,
|
||||
UBI_FM_MIN_POOL_SIZE);
|
||||
|
||||
ubi->fm_wl_pool.max_size = ubi->fm_pool.max_size / 2;
|
||||
ubi->fm_disabled = !fm_autoconvert;
|
||||
ubi->fm_disabled = (!fm_autoconvert || disable_fm) ? 1 : 0;
|
||||
if (fm_debug)
|
||||
ubi_enable_dbg_chk_fastmap(ubi);
|
||||
|
||||
@@ -962,7 +967,7 @@ int ubi_attach_mtd_dev(struct mtd_info *mtd, int ubi_num,
|
||||
if (!ubi->fm_buf)
|
||||
goto out_free;
|
||||
#endif
|
||||
err = ubi_attach(ubi, 0);
|
||||
err = ubi_attach(ubi, disable_fm ? 1 : 0);
|
||||
if (err) {
|
||||
ubi_err(ubi, "failed to attach mtd%d, error %d",
|
||||
mtd->index, err);
|
||||
@@ -1242,7 +1247,8 @@ static int __init ubi_init(void)
|
||||
|
||||
mutex_lock(&ubi_devices_mutex);
|
||||
err = ubi_attach_mtd_dev(mtd, p->ubi_num,
|
||||
p->vid_hdr_offs, p->max_beb_per1024);
|
||||
p->vid_hdr_offs, p->max_beb_per1024,
|
||||
false);
|
||||
mutex_unlock(&ubi_devices_mutex);
|
||||
if (err < 0) {
|
||||
pr_err("UBI error: cannot attach mtd%d\n",
|
||||
|
||||
@@ -672,7 +672,7 @@ static int verify_rsvol_req(const struct ubi_device *ubi,
|
||||
* @req: volumes re-name request
|
||||
*
|
||||
* This is a helper function for the volume re-name IOCTL which validates the
|
||||
* the request, opens the volume and calls corresponding volumes management
|
||||
* request, opens the volume and calls corresponding volumes management
|
||||
* function. Returns zero in case of success and a negative error code in case
|
||||
* of failure.
|
||||
*/
|
||||
@@ -1041,7 +1041,7 @@ static long ctrl_cdev_ioctl(struct file *file, unsigned int cmd,
|
||||
*/
|
||||
mutex_lock(&ubi_devices_mutex);
|
||||
err = ubi_attach_mtd_dev(mtd, req.ubi_num, req.vid_hdr_offset,
|
||||
req.max_beb_per1024);
|
||||
req.max_beb_per1024, !!req.disable_fm);
|
||||
mutex_unlock(&ubi_devices_mutex);
|
||||
if (err < 0)
|
||||
put_mtd_device(mtd);
|
||||
|
||||
@@ -377,7 +377,7 @@ static int leb_write_lock(struct ubi_device *ubi, int vol_id, int lnum)
|
||||
*
|
||||
* This function locks a logical eraseblock for writing if there is no
|
||||
* contention and does nothing if there is contention. Returns %0 in case of
|
||||
* success, %1 in case of contention, and and a negative error code in case of
|
||||
* success, %1 in case of contention, and a negative error code in case of
|
||||
* failure.
|
||||
*/
|
||||
static int leb_write_trylock(struct ubi_device *ubi, int vol_id, int lnum)
|
||||
|
||||
@@ -20,8 +20,7 @@ static inline unsigned long *init_seen(struct ubi_device *ubi)
|
||||
if (!ubi_dbg_chk_fastmap(ubi))
|
||||
return NULL;
|
||||
|
||||
ret = kcalloc(BITS_TO_LONGS(ubi->peb_count), sizeof(unsigned long),
|
||||
GFP_KERNEL);
|
||||
ret = bitmap_zalloc(ubi->peb_count, GFP_KERNEL);
|
||||
if (!ret)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
@@ -34,7 +33,7 @@ static inline unsigned long *init_seen(struct ubi_device *ubi)
|
||||
*/
|
||||
static inline void free_seen(unsigned long *seen)
|
||||
{
|
||||
kfree(seen);
|
||||
bitmap_free(seen);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1108,8 +1107,7 @@ int ubi_fastmap_init_checkmap(struct ubi_volume *vol, int leb_count)
|
||||
if (!ubi->fast_attach)
|
||||
return 0;
|
||||
|
||||
vol->checkmap = kcalloc(BITS_TO_LONGS(leb_count), sizeof(unsigned long),
|
||||
GFP_KERNEL);
|
||||
vol->checkmap = bitmap_zalloc(leb_count, GFP_KERNEL);
|
||||
if (!vol->checkmap)
|
||||
return -ENOMEM;
|
||||
|
||||
@@ -1118,7 +1116,7 @@ int ubi_fastmap_init_checkmap(struct ubi_volume *vol, int leb_count)
|
||||
|
||||
void ubi_fastmap_destroy_checkmap(struct ubi_volume *vol)
|
||||
{
|
||||
kfree(vol->checkmap);
|
||||
bitmap_free(vol->checkmap);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -1147,7 +1147,7 @@ fail:
|
||||
* @ubi: UBI device description object
|
||||
* @pnum: the physical eraseblock number to check
|
||||
*
|
||||
* This function returns zero if the erase counter header is all right and and
|
||||
* This function returns zero if the erase counter header is all right and
|
||||
* a negative error code if not or if an error occurred.
|
||||
*/
|
||||
static int self_check_peb_ec_hdr(const struct ubi_device *ubi, int pnum)
|
||||
|
||||
@@ -131,7 +131,7 @@ enum {
|
||||
* is changed radically. This field is duplicated in the volume identifier
|
||||
* header.
|
||||
*
|
||||
* The @vid_hdr_offset and @data_offset fields contain the offset of the the
|
||||
* The @vid_hdr_offset and @data_offset fields contain the offset of the
|
||||
* volume identifier header and user data, relative to the beginning of the
|
||||
* physical eraseblock. These values have to be the same for all physical
|
||||
* eraseblocks.
|
||||
|
||||
@@ -86,7 +86,7 @@ void ubi_err(const struct ubi_device *ubi, const char *fmt, ...);
|
||||
* Error codes returned by the I/O sub-system.
|
||||
*
|
||||
* UBI_IO_FF: the read region of flash contains only 0xFFs
|
||||
* UBI_IO_FF_BITFLIPS: the same as %UBI_IO_FF, but also also there was a data
|
||||
* UBI_IO_FF_BITFLIPS: the same as %UBI_IO_FF, but also there was a data
|
||||
* integrity error reported by the MTD driver
|
||||
* (uncorrectable ECC error in case of NAND)
|
||||
* UBI_IO_BAD_HDR: the EC or VID header is corrupted (bad magic or CRC)
|
||||
@@ -281,7 +281,7 @@ struct ubi_eba_leb_desc {
|
||||
|
||||
/**
|
||||
* struct ubi_volume - UBI volume description data structure.
|
||||
* @dev: device object to make use of the the Linux device model
|
||||
* @dev: device object to make use of the Linux device model
|
||||
* @cdev: character device object to create character device
|
||||
* @ubi: reference to the UBI device description object
|
||||
* @vol_id: volume ID
|
||||
@@ -439,7 +439,7 @@ struct ubi_debug_info {
|
||||
|
||||
/**
|
||||
* struct ubi_device - UBI device description structure
|
||||
* @dev: UBI device object to use the the Linux device model
|
||||
* @dev: UBI device object to use the Linux device model
|
||||
* @cdev: character device object to create character device
|
||||
* @ubi_num: UBI device number
|
||||
* @ubi_name: UBI device name
|
||||
@@ -937,7 +937,8 @@ int ubi_io_write_vid_hdr(struct ubi_device *ubi, int pnum,
|
||||
|
||||
/* build.c */
|
||||
int ubi_attach_mtd_dev(struct mtd_info *mtd, int ubi_num,
|
||||
int vid_hdr_offset, int max_beb_per1024);
|
||||
int vid_hdr_offset, int max_beb_per1024,
|
||||
bool disable_fm);
|
||||
int ubi_detach_mtd_dev(int ubi_num, int anyway);
|
||||
struct ubi_device *ubi_get_device(int ubi_num);
|
||||
void ubi_put_device(struct ubi_device *ubi);
|
||||
|
||||
@@ -623,7 +623,7 @@ void ubi_free_volume(struct ubi_device *ubi, struct ubi_volume *vol)
|
||||
* @ubi: UBI device description object
|
||||
* @vol_id: volume ID
|
||||
*
|
||||
* Returns zero if volume is all right and a a negative error code if not.
|
||||
* Returns zero if volume is all right and a negative error code if not.
|
||||
*/
|
||||
static int self_check_volume(struct ubi_device *ubi, int vol_id)
|
||||
{
|
||||
@@ -776,7 +776,7 @@ fail:
|
||||
* self_check_volumes - check information about all volumes.
|
||||
* @ubi: UBI device description object
|
||||
*
|
||||
* Returns zero if volumes are all right and a a negative error code if not.
|
||||
* Returns zero if volumes are all right and a negative error code if not.
|
||||
*/
|
||||
static int self_check_volumes(struct ubi_device *ubi)
|
||||
{
|
||||
|
||||
@@ -376,7 +376,7 @@ static struct ubi_wl_entry *find_mean_wl_entry(struct ubi_device *ubi,
|
||||
* refill_wl_user_pool().
|
||||
* @ubi: UBI device description object
|
||||
*
|
||||
* This function returns a a wear leveling entry in case of success and
|
||||
* This function returns a wear leveling entry in case of success and
|
||||
* NULL in case of failure.
|
||||
*/
|
||||
static struct ubi_wl_entry *wl_get_wle(struct ubi_device *ubi)
|
||||
@@ -429,7 +429,7 @@ static int prot_queue_del(struct ubi_device *ubi, int pnum)
|
||||
/**
|
||||
* sync_erase - synchronously erase a physical eraseblock.
|
||||
* @ubi: UBI device description object
|
||||
* @e: the the physical eraseblock to erase
|
||||
* @e: the physical eraseblock to erase
|
||||
* @torture: if the physical eraseblock has to be tortured
|
||||
*
|
||||
* This function returns zero in case of success and a negative error code in
|
||||
@@ -1016,7 +1016,7 @@ static int ensure_wear_leveling(struct ubi_device *ubi, int nested)
|
||||
|
||||
/*
|
||||
* If the ubi->scrub tree is not empty, scrubbing is needed, and the
|
||||
* the WL worker has to be scheduled anyway.
|
||||
* WL worker has to be scheduled anyway.
|
||||
*/
|
||||
if (!ubi->scrub.rb_node) {
|
||||
#ifdef CONFIG_MTD_UBI_FASTMAP
|
||||
@@ -1464,7 +1464,7 @@ static bool scrub_possible(struct ubi_device *ubi, struct ubi_wl_entry *e)
|
||||
* ubi_bitflip_check - Check an eraseblock for bitflips and scrub it if needed.
|
||||
* @ubi: UBI device description object
|
||||
* @pnum: the physical eraseblock to schedule
|
||||
* @force: dont't read the block, assume bitflips happened and take action.
|
||||
* @force: don't read the block, assume bitflips happened and take action.
|
||||
*
|
||||
* This function reads the given eraseblock and checks if bitflips occured.
|
||||
* In case of bitflips, the eraseblock is scheduled for scrubbing.
|
||||
|
||||
@@ -170,15 +170,12 @@ EXPORT_SYMBOL(nvdimm_namespace_disk_name);
|
||||
|
||||
const uuid_t *nd_dev_to_uuid(struct device *dev)
|
||||
{
|
||||
if (!dev)
|
||||
return &uuid_null;
|
||||
|
||||
if (is_namespace_pmem(dev)) {
|
||||
if (dev && is_namespace_pmem(dev)) {
|
||||
struct nd_namespace_pmem *nspm = to_nd_namespace_pmem(dev);
|
||||
|
||||
return nspm->uuid;
|
||||
} else
|
||||
return &uuid_null;
|
||||
}
|
||||
return &uuid_null;
|
||||
}
|
||||
EXPORT_SYMBOL(nd_dev_to_uuid);
|
||||
|
||||
@@ -388,7 +385,7 @@ static resource_size_t init_dpa_allocation(struct nd_label_id *label_id,
|
||||
*
|
||||
* BLK-space is valid as long as it does not precede a PMEM
|
||||
* allocation in a given region. PMEM-space must be contiguous
|
||||
* and adjacent to an existing existing allocation (if one
|
||||
* and adjacent to an existing allocation (if one
|
||||
* exists). If reserving PMEM any space is valid.
|
||||
*/
|
||||
static void space_valid(struct nd_region *nd_region, struct nvdimm_drvdata *ndd,
|
||||
@@ -839,7 +836,6 @@ static ssize_t size_store(struct device *dev,
|
||||
{
|
||||
struct nd_region *nd_region = to_nd_region(dev->parent);
|
||||
unsigned long long val;
|
||||
uuid_t **uuid = NULL;
|
||||
int rc;
|
||||
|
||||
rc = kstrtoull(buf, 0, &val);
|
||||
@@ -853,16 +849,12 @@ static ssize_t size_store(struct device *dev,
|
||||
if (rc >= 0)
|
||||
rc = nd_namespace_label_update(nd_region, dev);
|
||||
|
||||
if (is_namespace_pmem(dev)) {
|
||||
/* setting size zero == 'delete namespace' */
|
||||
if (rc == 0 && val == 0 && is_namespace_pmem(dev)) {
|
||||
struct nd_namespace_pmem *nspm = to_nd_namespace_pmem(dev);
|
||||
|
||||
uuid = &nspm->uuid;
|
||||
}
|
||||
|
||||
if (rc == 0 && val == 0 && uuid) {
|
||||
/* setting size zero == 'delete namespace' */
|
||||
kfree(*uuid);
|
||||
*uuid = NULL;
|
||||
kfree(nspm->uuid);
|
||||
nspm->uuid = NULL;
|
||||
}
|
||||
|
||||
dev_dbg(dev, "%llx %s (%d)\n", val, rc < 0 ? "fail" : "success", rc);
|
||||
|
||||
@@ -509,16 +509,13 @@ static ssize_t align_store(struct device *dev,
|
||||
{
|
||||
struct nd_region *nd_region = to_nd_region(dev);
|
||||
unsigned long val, dpa;
|
||||
u32 remainder;
|
||||
u32 mappings, remainder;
|
||||
int rc;
|
||||
|
||||
rc = kstrtoul(buf, 0, &val);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
if (!nd_region->ndr_mappings)
|
||||
return -ENXIO;
|
||||
|
||||
/*
|
||||
* Ensure space-align is evenly divisible by the region
|
||||
* interleave-width because the kernel typically has no facility
|
||||
@@ -526,7 +523,8 @@ static ssize_t align_store(struct device *dev,
|
||||
* contribute to the tail capacity in system-physical-address
|
||||
* space for the namespace.
|
||||
*/
|
||||
dpa = div_u64_rem(val, nd_region->ndr_mappings, &remainder);
|
||||
mappings = max_t(u32, 1, nd_region->ndr_mappings);
|
||||
dpa = div_u64_rem(val, mappings, &remainder);
|
||||
if (!is_power_of_2(dpa) || dpa < PAGE_SIZE
|
||||
|| val > region_size(nd_region) || remainder)
|
||||
return -EINVAL;
|
||||
@@ -1096,7 +1094,7 @@ int nvdimm_flush(struct nd_region *nd_region, struct bio *bio)
|
||||
return rc;
|
||||
}
|
||||
/**
|
||||
* nvdimm_flush - flush any posted write queues between the cpu and pmem media
|
||||
* generic_nvdimm_flush() - flush any posted write queues between the cpu and pmem media
|
||||
* @nd_region: interleaved pmem region
|
||||
*/
|
||||
int generic_nvdimm_flush(struct nd_region *nd_region)
|
||||
|
||||
@@ -408,7 +408,7 @@ static int security_overwrite(struct nvdimm *nvdimm, unsigned int keyid)
|
||||
return rc;
|
||||
}
|
||||
|
||||
void __nvdimm_security_overwrite_query(struct nvdimm *nvdimm)
|
||||
static void __nvdimm_security_overwrite_query(struct nvdimm *nvdimm)
|
||||
{
|
||||
struct nvdimm_bus *nvdimm_bus = walk_to_nvdimm_bus(&nvdimm->dev);
|
||||
int rc;
|
||||
|
||||
@@ -1768,10 +1768,7 @@ static void adjust_bridge_window(struct pci_dev *bridge, struct resource *res,
|
||||
}
|
||||
|
||||
res->end = res->start + new_size - 1;
|
||||
|
||||
/* If the resource is part of the add_list remove it now */
|
||||
if (add_list)
|
||||
remove_from_list(add_list, res);
|
||||
remove_from_list(add_list, res);
|
||||
}
|
||||
|
||||
static void pci_bus_distribute_available_resources(struct pci_bus *bus,
|
||||
@@ -1926,8 +1923,6 @@ static void pci_bridge_distribute_available_resources(struct pci_dev *bridge,
|
||||
if (!bridge->is_hotplug_bridge)
|
||||
return;
|
||||
|
||||
pci_dbg(bridge, "distributing available resources\n");
|
||||
|
||||
/* Take the initial extra resources from the hotplug port */
|
||||
available_io = bridge->resource[PCI_BRIDGE_IO_WINDOW];
|
||||
available_mmio = bridge->resource[PCI_BRIDGE_MEM_WINDOW];
|
||||
@@ -1939,59 +1934,6 @@ static void pci_bridge_distribute_available_resources(struct pci_dev *bridge,
|
||||
available_mmio_pref);
|
||||
}
|
||||
|
||||
static bool pci_bridge_resources_not_assigned(struct pci_dev *dev)
|
||||
{
|
||||
const struct resource *r;
|
||||
|
||||
/*
|
||||
* Check the child device's resources and if they are not yet
|
||||
* assigned it means we are configuring them (not the boot
|
||||
* firmware) so we should be able to extend the upstream
|
||||
* bridge's (that's the hotplug downstream PCIe port) resources
|
||||
* in the same way we do with the normal hotplug case.
|
||||
*/
|
||||
r = &dev->resource[PCI_BRIDGE_IO_WINDOW];
|
||||
if (!r->flags || !(r->flags & IORESOURCE_STARTALIGN))
|
||||
return false;
|
||||
r = &dev->resource[PCI_BRIDGE_MEM_WINDOW];
|
||||
if (!r->flags || !(r->flags & IORESOURCE_STARTALIGN))
|
||||
return false;
|
||||
r = &dev->resource[PCI_BRIDGE_PREF_MEM_WINDOW];
|
||||
if (!r->flags || !(r->flags & IORESOURCE_STARTALIGN))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static void pci_root_bus_distribute_available_resources(struct pci_bus *bus,
|
||||
struct list_head *add_list)
|
||||
{
|
||||
struct pci_dev *dev, *bridge = bus->self;
|
||||
|
||||
for_each_pci_bridge(dev, bus) {
|
||||
struct pci_bus *b;
|
||||
|
||||
b = dev->subordinate;
|
||||
if (!b)
|
||||
continue;
|
||||
|
||||
/*
|
||||
* Need to check "bridge" here too because it is NULL
|
||||
* in case of root bus.
|
||||
*/
|
||||
if (bridge && pci_bridge_resources_not_assigned(dev)) {
|
||||
pci_bridge_distribute_available_resources(bridge, add_list);
|
||||
/*
|
||||
* There is only PCIe upstream port on the bus
|
||||
* so we don't need to go futher.
|
||||
*/
|
||||
return;
|
||||
}
|
||||
|
||||
pci_root_bus_distribute_available_resources(b, add_list);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* First try will not touch PCI bridge res.
|
||||
* Second and later try will clear small leaf bridge res.
|
||||
@@ -2031,8 +1973,6 @@ again:
|
||||
*/
|
||||
__pci_bus_size_bridges(bus, add_list);
|
||||
|
||||
pci_root_bus_distribute_available_resources(bus, add_list);
|
||||
|
||||
/* Depth last, allocate resources and update the hardware. */
|
||||
__pci_bus_assign_resources(bus, add_list, &fail_head);
|
||||
if (add_list)
|
||||
|
||||
@@ -423,6 +423,7 @@ config RTC_DRV_ISL1208
|
||||
|
||||
config RTC_DRV_ISL12022
|
||||
tristate "Intersil ISL12022"
|
||||
select REGMAP_I2C
|
||||
help
|
||||
If you say yes here you get support for the
|
||||
Intersil ISL12022 RTC chip.
|
||||
|
||||
@@ -1352,10 +1352,10 @@ static void cmos_check_acpi_rtc_status(struct device *dev,
|
||||
|
||||
static int cmos_pnp_probe(struct pnp_dev *pnp, const struct pnp_device_id *id)
|
||||
{
|
||||
cmos_wake_setup(&pnp->dev);
|
||||
int irq, ret;
|
||||
|
||||
if (pnp_port_start(pnp, 0) == 0x70 && !pnp_irq_valid(pnp, 0)) {
|
||||
unsigned int irq = 0;
|
||||
irq = 0;
|
||||
#ifdef CONFIG_X86
|
||||
/* Some machines contain a PNP entry for the RTC, but
|
||||
* don't define the IRQ. It should always be safe to
|
||||
@@ -1364,13 +1364,17 @@ static int cmos_pnp_probe(struct pnp_dev *pnp, const struct pnp_device_id *id)
|
||||
if (nr_legacy_irqs())
|
||||
irq = RTC_IRQ;
|
||||
#endif
|
||||
return cmos_do_probe(&pnp->dev,
|
||||
pnp_get_resource(pnp, IORESOURCE_IO, 0), irq);
|
||||
} else {
|
||||
return cmos_do_probe(&pnp->dev,
|
||||
pnp_get_resource(pnp, IORESOURCE_IO, 0),
|
||||
pnp_irq(pnp, 0));
|
||||
irq = pnp_irq(pnp, 0);
|
||||
}
|
||||
|
||||
ret = cmos_do_probe(&pnp->dev, pnp_get_resource(pnp, IORESOURCE_IO, 0), irq);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
cmos_wake_setup(&pnp->dev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void cmos_pnp_remove(struct pnp_dev *pnp)
|
||||
@@ -1454,10 +1458,9 @@ static inline void cmos_of_init(struct platform_device *pdev) {}
|
||||
static int __init cmos_platform_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct resource *resource;
|
||||
int irq;
|
||||
int irq, ret;
|
||||
|
||||
cmos_of_init(pdev);
|
||||
cmos_wake_setup(&pdev->dev);
|
||||
|
||||
if (RTC_IOMAPPED)
|
||||
resource = platform_get_resource(pdev, IORESOURCE_IO, 0);
|
||||
@@ -1467,7 +1470,13 @@ static int __init cmos_platform_probe(struct platform_device *pdev)
|
||||
if (irq < 0)
|
||||
irq = -1;
|
||||
|
||||
return cmos_do_probe(&pdev->dev, resource, irq);
|
||||
ret = cmos_do_probe(&pdev->dev, resource, irq);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
cmos_wake_setup(&pdev->dev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cmos_platform_remove(struct platform_device *pdev)
|
||||
|
||||
@@ -132,7 +132,7 @@ ds1685_rtc_bin2bcd(struct ds1685_priv *rtc, u8 val, u8 bin_mask, u8 bcd_mask)
|
||||
}
|
||||
|
||||
/**
|
||||
* s1685_rtc_check_mday - check validity of the day of month.
|
||||
* ds1685_rtc_check_mday - check validity of the day of month.
|
||||
* @rtc: pointer to the ds1685 rtc structure.
|
||||
* @mday: day of month.
|
||||
*
|
||||
|
||||
@@ -265,18 +265,17 @@ static int gamecube_rtc_read_offset_from_sram(struct priv *d)
|
||||
* SRAM address as on previous consoles.
|
||||
*/
|
||||
ret = regmap_read(d->regmap, RTC_SRAM_BIAS, &d->rtc_bias);
|
||||
if (ret) {
|
||||
pr_err("failed to get the RTC bias\n");
|
||||
iounmap(hw_srnprot);
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Reset SRAM access to how it was before, our job here is done. */
|
||||
if (old != 0x7bf)
|
||||
iowrite32be(old, hw_srnprot);
|
||||
|
||||
iounmap(hw_srnprot);
|
||||
|
||||
return 0;
|
||||
if (ret)
|
||||
pr_err("failed to get the RTC bias\n");
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static const struct regmap_range rtc_rd_ranges[] = {
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
#include <linux/err.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/regmap.h>
|
||||
|
||||
/* ISL register offsets */
|
||||
#define ISL12022_REG_SC 0x00
|
||||
@@ -42,83 +43,32 @@ static struct i2c_driver isl12022_driver;
|
||||
|
||||
struct isl12022 {
|
||||
struct rtc_device *rtc;
|
||||
|
||||
bool write_enabled; /* true if write enable is set */
|
||||
struct regmap *regmap;
|
||||
};
|
||||
|
||||
|
||||
static int isl12022_read_regs(struct i2c_client *client, uint8_t reg,
|
||||
uint8_t *data, size_t n)
|
||||
{
|
||||
struct i2c_msg msgs[] = {
|
||||
{
|
||||
.addr = client->addr,
|
||||
.flags = 0,
|
||||
.len = 1,
|
||||
.buf = data
|
||||
}, /* setup read ptr */
|
||||
{
|
||||
.addr = client->addr,
|
||||
.flags = I2C_M_RD,
|
||||
.len = n,
|
||||
.buf = data
|
||||
}
|
||||
};
|
||||
|
||||
int ret;
|
||||
|
||||
data[0] = reg;
|
||||
ret = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs));
|
||||
if (ret != ARRAY_SIZE(msgs)) {
|
||||
dev_err(&client->dev, "%s: read error, ret=%d\n",
|
||||
__func__, ret);
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static int isl12022_write_reg(struct i2c_client *client,
|
||||
uint8_t reg, uint8_t val)
|
||||
{
|
||||
uint8_t data[2] = { reg, val };
|
||||
int err;
|
||||
|
||||
err = i2c_master_send(client, data, sizeof(data));
|
||||
if (err != sizeof(data)) {
|
||||
dev_err(&client->dev,
|
||||
"%s: err=%d addr=%02x, data=%02x\n",
|
||||
__func__, err, data[0], data[1]);
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* In the routines that deal directly with the isl12022 hardware, we use
|
||||
* rtc_time -- month 0-11, hour 0-23, yr = calendar year-epoch.
|
||||
*/
|
||||
static int isl12022_rtc_read_time(struct device *dev, struct rtc_time *tm)
|
||||
{
|
||||
struct i2c_client *client = to_i2c_client(dev);
|
||||
struct isl12022 *isl12022 = dev_get_drvdata(dev);
|
||||
struct regmap *regmap = isl12022->regmap;
|
||||
uint8_t buf[ISL12022_REG_INT + 1];
|
||||
int ret;
|
||||
|
||||
ret = isl12022_read_regs(client, ISL12022_REG_SC, buf, sizeof(buf));
|
||||
ret = regmap_bulk_read(regmap, ISL12022_REG_SC, buf, sizeof(buf));
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (buf[ISL12022_REG_SR] & (ISL12022_SR_LBAT85 | ISL12022_SR_LBAT75)) {
|
||||
dev_warn(&client->dev,
|
||||
dev_warn(dev,
|
||||
"voltage dropped below %u%%, "
|
||||
"date and time is not reliable.\n",
|
||||
buf[ISL12022_REG_SR] & ISL12022_SR_LBAT85 ? 85 : 75);
|
||||
}
|
||||
|
||||
dev_dbg(&client->dev,
|
||||
dev_dbg(dev,
|
||||
"%s: raw data is sec=%02x, min=%02x, hr=%02x, "
|
||||
"mday=%02x, mon=%02x, year=%02x, wday=%02x, "
|
||||
"sr=%02x, int=%02x",
|
||||
@@ -141,65 +91,25 @@ static int isl12022_rtc_read_time(struct device *dev, struct rtc_time *tm)
|
||||
tm->tm_mon = bcd2bin(buf[ISL12022_REG_MO] & 0x1F) - 1;
|
||||
tm->tm_year = bcd2bin(buf[ISL12022_REG_YR]) + 100;
|
||||
|
||||
dev_dbg(&client->dev, "%s: secs=%d, mins=%d, hours=%d, "
|
||||
"mday=%d, mon=%d, year=%d, wday=%d\n",
|
||||
__func__,
|
||||
tm->tm_sec, tm->tm_min, tm->tm_hour,
|
||||
tm->tm_mday, tm->tm_mon, tm->tm_year, tm->tm_wday);
|
||||
dev_dbg(dev, "%s: %ptR\n", __func__, tm);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int isl12022_rtc_set_time(struct device *dev, struct rtc_time *tm)
|
||||
{
|
||||
struct i2c_client *client = to_i2c_client(dev);
|
||||
struct isl12022 *isl12022 = i2c_get_clientdata(client);
|
||||
size_t i;
|
||||
struct isl12022 *isl12022 = dev_get_drvdata(dev);
|
||||
struct regmap *regmap = isl12022->regmap;
|
||||
int ret;
|
||||
uint8_t buf[ISL12022_REG_DW + 1];
|
||||
|
||||
dev_dbg(&client->dev, "%s: secs=%d, mins=%d, hours=%d, "
|
||||
"mday=%d, mon=%d, year=%d, wday=%d\n",
|
||||
__func__,
|
||||
tm->tm_sec, tm->tm_min, tm->tm_hour,
|
||||
tm->tm_mday, tm->tm_mon, tm->tm_year, tm->tm_wday);
|
||||
dev_dbg(dev, "%s: %ptR\n", __func__, tm);
|
||||
|
||||
if (!isl12022->write_enabled) {
|
||||
|
||||
ret = isl12022_read_regs(client, ISL12022_REG_INT, buf, 1);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/* Check if WRTC (write rtc enable) is set factory default is
|
||||
* 0 (not set) */
|
||||
if (!(buf[0] & ISL12022_INT_WRTC)) {
|
||||
dev_info(&client->dev,
|
||||
"init write enable and 24 hour format\n");
|
||||
|
||||
/* Set the write enable bit. */
|
||||
ret = isl12022_write_reg(client,
|
||||
ISL12022_REG_INT,
|
||||
buf[0] | ISL12022_INT_WRTC);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/* Write to any RTC register to start RTC, we use the
|
||||
* HR register, setting the MIL bit to use the 24 hour
|
||||
* format. */
|
||||
ret = isl12022_read_regs(client, ISL12022_REG_HR,
|
||||
buf, 1);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = isl12022_write_reg(client,
|
||||
ISL12022_REG_HR,
|
||||
buf[0] | ISL12022_HR_MIL);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
||||
isl12022->write_enabled = true;
|
||||
}
|
||||
/* Ensure the write enable bit is set. */
|
||||
ret = regmap_update_bits(regmap, ISL12022_REG_INT,
|
||||
ISL12022_INT_WRTC, ISL12022_INT_WRTC);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/* hours, minutes and seconds */
|
||||
buf[ISL12022_REG_SC] = bin2bcd(tm->tm_sec);
|
||||
@@ -216,15 +126,8 @@ static int isl12022_rtc_set_time(struct device *dev, struct rtc_time *tm)
|
||||
|
||||
buf[ISL12022_REG_DW] = tm->tm_wday & 0x07;
|
||||
|
||||
/* write register's data */
|
||||
for (i = 0; i < ARRAY_SIZE(buf); i++) {
|
||||
ret = isl12022_write_reg(client, ISL12022_REG_SC + i,
|
||||
buf[ISL12022_REG_SC + i]);
|
||||
if (ret)
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
return 0;
|
||||
return regmap_bulk_write(isl12022->regmap, ISL12022_REG_SC,
|
||||
buf, sizeof(buf));
|
||||
}
|
||||
|
||||
static const struct rtc_class_ops isl12022_rtc_ops = {
|
||||
@@ -232,6 +135,12 @@ static const struct rtc_class_ops isl12022_rtc_ops = {
|
||||
.set_time = isl12022_rtc_set_time,
|
||||
};
|
||||
|
||||
static const struct regmap_config regmap_config = {
|
||||
.reg_bits = 8,
|
||||
.val_bits = 8,
|
||||
.use_single_write = true,
|
||||
};
|
||||
|
||||
static int isl12022_probe(struct i2c_client *client)
|
||||
{
|
||||
struct isl12022 *isl12022;
|
||||
@@ -243,13 +152,23 @@ static int isl12022_probe(struct i2c_client *client)
|
||||
GFP_KERNEL);
|
||||
if (!isl12022)
|
||||
return -ENOMEM;
|
||||
dev_set_drvdata(&client->dev, isl12022);
|
||||
|
||||
i2c_set_clientdata(client, isl12022);
|
||||
isl12022->regmap = devm_regmap_init_i2c(client, ®map_config);
|
||||
if (IS_ERR(isl12022->regmap)) {
|
||||
dev_err(&client->dev, "regmap allocation failed\n");
|
||||
return PTR_ERR(isl12022->regmap);
|
||||
}
|
||||
|
||||
isl12022->rtc = devm_rtc_device_register(&client->dev,
|
||||
isl12022_driver.driver.name,
|
||||
&isl12022_rtc_ops, THIS_MODULE);
|
||||
return PTR_ERR_OR_ZERO(isl12022->rtc);
|
||||
isl12022->rtc = devm_rtc_allocate_device(&client->dev);
|
||||
if (IS_ERR(isl12022->rtc))
|
||||
return PTR_ERR(isl12022->rtc);
|
||||
|
||||
isl12022->rtc->ops = &isl12022_rtc_ops;
|
||||
isl12022->rtc->range_min = RTC_TIMESTAMP_BEGIN_2000;
|
||||
isl12022->rtc->range_max = RTC_TIMESTAMP_END_2099;
|
||||
|
||||
return devm_rtc_register_device(isl12022->rtc);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_OF
|
||||
|
||||
@@ -257,11 +257,6 @@ static void jz4740_rtc_power_off(void)
|
||||
kernel_halt();
|
||||
}
|
||||
|
||||
static void jz4740_rtc_clk_disable(void *data)
|
||||
{
|
||||
clk_disable_unprepare(data);
|
||||
}
|
||||
|
||||
static const struct of_device_id jz4740_rtc_of_match[] = {
|
||||
{ .compatible = "ingenic,jz4740-rtc", .data = (void *)ID_JZ4740 },
|
||||
{ .compatible = "ingenic,jz4760-rtc", .data = (void *)ID_JZ4760 },
|
||||
@@ -329,23 +324,9 @@ static int jz4740_rtc_probe(struct platform_device *pdev)
|
||||
if (IS_ERR(rtc->base))
|
||||
return PTR_ERR(rtc->base);
|
||||
|
||||
clk = devm_clk_get(dev, "rtc");
|
||||
if (IS_ERR(clk)) {
|
||||
dev_err(dev, "Failed to get RTC clock\n");
|
||||
return PTR_ERR(clk);
|
||||
}
|
||||
|
||||
ret = clk_prepare_enable(clk);
|
||||
if (ret) {
|
||||
dev_err(dev, "Failed to enable clock\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = devm_add_action_or_reset(dev, jz4740_rtc_clk_disable, clk);
|
||||
if (ret) {
|
||||
dev_err(dev, "Failed to register devm action\n");
|
||||
return ret;
|
||||
}
|
||||
clk = devm_clk_get_enabled(dev, "rtc");
|
||||
if (IS_ERR(clk))
|
||||
return dev_err_probe(dev, PTR_ERR(clk), "Failed to get RTC clock\n");
|
||||
|
||||
spin_lock_init(&rtc->lock);
|
||||
|
||||
|
||||
@@ -193,23 +193,6 @@ static int mpfs_rtc_alarm_irq_enable(struct device *dev, unsigned int enabled)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline struct clk *mpfs_rtc_init_clk(struct device *dev)
|
||||
{
|
||||
struct clk *clk;
|
||||
int ret;
|
||||
|
||||
clk = devm_clk_get(dev, "rtc");
|
||||
if (IS_ERR(clk))
|
||||
return clk;
|
||||
|
||||
ret = clk_prepare_enable(clk);
|
||||
if (ret)
|
||||
return ERR_PTR(ret);
|
||||
|
||||
devm_add_action_or_reset(dev, (void (*) (void *))clk_disable_unprepare, clk);
|
||||
return clk;
|
||||
}
|
||||
|
||||
static irqreturn_t mpfs_rtc_wakeup_irq_handler(int irq, void *dev)
|
||||
{
|
||||
struct mpfs_rtc_dev *rtcdev = dev;
|
||||
@@ -233,7 +216,7 @@ static int mpfs_rtc_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct mpfs_rtc_dev *rtcdev;
|
||||
struct clk *clk;
|
||||
u32 prescaler;
|
||||
unsigned long prescaler;
|
||||
int wakeup_irq, ret;
|
||||
|
||||
rtcdev = devm_kzalloc(&pdev->dev, sizeof(struct mpfs_rtc_dev), GFP_KERNEL);
|
||||
@@ -251,7 +234,7 @@ static int mpfs_rtc_probe(struct platform_device *pdev)
|
||||
/* range is capped by alarm max, lower reg is 31:0 & upper is 10:0 */
|
||||
rtcdev->rtc->range_max = GENMASK_ULL(42, 0);
|
||||
|
||||
clk = mpfs_rtc_init_clk(&pdev->dev);
|
||||
clk = devm_clk_get_enabled(&pdev->dev, "rtc");
|
||||
if (IS_ERR(clk))
|
||||
return PTR_ERR(clk);
|
||||
|
||||
@@ -275,14 +258,13 @@ static int mpfs_rtc_probe(struct platform_device *pdev)
|
||||
|
||||
/* prescaler hardware adds 1 to reg value */
|
||||
prescaler = clk_get_rate(devm_clk_get(&pdev->dev, "rtcref")) - 1;
|
||||
|
||||
if (prescaler > MAX_PRESCALER_COUNT) {
|
||||
dev_dbg(&pdev->dev, "invalid prescaler %d\n", prescaler);
|
||||
dev_dbg(&pdev->dev, "invalid prescaler %lu\n", prescaler);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
writel(prescaler, rtcdev->base + PRESCALER_REG);
|
||||
dev_info(&pdev->dev, "prescaler set to: 0x%X \r\n", prescaler);
|
||||
dev_info(&pdev->dev, "prescaler set to: %lu\n", prescaler);
|
||||
|
||||
device_init_wakeup(&pdev->dev, true);
|
||||
ret = dev_pm_set_wake_irq(&pdev->dev, wakeup_irq);
|
||||
|
||||
@@ -291,14 +291,6 @@ static const struct rtc_class_ops mxc_rtc_ops = {
|
||||
.alarm_irq_enable = mxc_rtc_alarm_irq_enable,
|
||||
};
|
||||
|
||||
static void mxc_rtc_action(void *p)
|
||||
{
|
||||
struct rtc_plat_data *pdata = p;
|
||||
|
||||
clk_disable_unprepare(pdata->clk_ref);
|
||||
clk_disable_unprepare(pdata->clk_ipg);
|
||||
}
|
||||
|
||||
static int mxc_rtc_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct rtc_device *rtc;
|
||||
@@ -341,33 +333,18 @@ static int mxc_rtc_probe(struct platform_device *pdev)
|
||||
rtc->range_max = (1 << 16) * 86400ULL - 1;
|
||||
}
|
||||
|
||||
pdata->clk_ipg = devm_clk_get(&pdev->dev, "ipg");
|
||||
pdata->clk_ipg = devm_clk_get_enabled(&pdev->dev, "ipg");
|
||||
if (IS_ERR(pdata->clk_ipg)) {
|
||||
dev_err(&pdev->dev, "unable to get ipg clock!\n");
|
||||
return PTR_ERR(pdata->clk_ipg);
|
||||
}
|
||||
|
||||
ret = clk_prepare_enable(pdata->clk_ipg);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
pdata->clk_ref = devm_clk_get(&pdev->dev, "ref");
|
||||
pdata->clk_ref = devm_clk_get_enabled(&pdev->dev, "ref");
|
||||
if (IS_ERR(pdata->clk_ref)) {
|
||||
clk_disable_unprepare(pdata->clk_ipg);
|
||||
dev_err(&pdev->dev, "unable to get ref clock!\n");
|
||||
return PTR_ERR(pdata->clk_ref);
|
||||
}
|
||||
|
||||
ret = clk_prepare_enable(pdata->clk_ref);
|
||||
if (ret) {
|
||||
clk_disable_unprepare(pdata->clk_ipg);
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = devm_add_action_or_reset(&pdev->dev, mxc_rtc_action, pdata);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
rate = clk_get_rate(pdata->clk_ref);
|
||||
|
||||
if (rate == 32768)
|
||||
|
||||
@@ -521,10 +521,9 @@ static int rv3028_param_get(struct device *dev, struct rtc_param *param)
|
||||
{
|
||||
struct rv3028_data *rv3028 = dev_get_drvdata(dev);
|
||||
int ret;
|
||||
u32 value;
|
||||
|
||||
switch(param->param) {
|
||||
u32 value;
|
||||
|
||||
case RTC_PARAM_BACKUP_SWITCH_MODE:
|
||||
ret = regmap_read(rv3028->regmap, RV3028_BACKUP, &value);
|
||||
if (ret < 0)
|
||||
@@ -554,9 +553,9 @@ static int rv3028_param_get(struct device *dev, struct rtc_param *param)
|
||||
static int rv3028_param_set(struct device *dev, struct rtc_param *param)
|
||||
{
|
||||
struct rv3028_data *rv3028 = dev_get_drvdata(dev);
|
||||
u8 mode;
|
||||
|
||||
switch(param->param) {
|
||||
u8 mode;
|
||||
case RTC_PARAM_BACKUP_SWITCH_MODE:
|
||||
switch (param->uvalue) {
|
||||
case RTC_BSM_DISABLED:
|
||||
|
||||
@@ -107,6 +107,8 @@ static void stmp3xxx_wdt_register(struct platform_device *rtc_pdev)
|
||||
wdt_pdev->dev.parent = &rtc_pdev->dev;
|
||||
wdt_pdev->dev.platform_data = &wdt_pdata;
|
||||
rc = platform_device_add(wdt_pdev);
|
||||
if (rc)
|
||||
platform_device_put(wdt_pdev);
|
||||
}
|
||||
|
||||
if (rc)
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
#include <linux/module.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/sys_soc.h>
|
||||
#include <linux/property.h>
|
||||
#include <linux/regmap.h>
|
||||
#include <linux/rtc.h>
|
||||
@@ -45,14 +46,6 @@
|
||||
#define K3RTC_MIN_OFFSET (-277761)
|
||||
#define K3RTC_MAX_OFFSET (277778)
|
||||
|
||||
/**
|
||||
* struct ti_k3_rtc_soc_data - Private of compatible data for ti-k3-rtc
|
||||
* @unlock_irq_erratum: Has erratum for unlock infinite IRQs (erratum i2327)
|
||||
*/
|
||||
struct ti_k3_rtc_soc_data {
|
||||
const bool unlock_irq_erratum;
|
||||
};
|
||||
|
||||
static const struct regmap_config ti_k3_rtc_regmap_config = {
|
||||
.name = "peripheral-registers",
|
||||
.reg_bits = 32,
|
||||
@@ -118,7 +111,6 @@ static const struct reg_field ti_rtc_reg_fields[] = {
|
||||
* @rtc_dev: rtc device
|
||||
* @regmap: rtc mmio regmap
|
||||
* @r_fields: rtc register fields
|
||||
* @soc: SoC compatible match data
|
||||
*/
|
||||
struct ti_k3_rtc {
|
||||
unsigned int irq;
|
||||
@@ -127,7 +119,6 @@ struct ti_k3_rtc {
|
||||
struct rtc_device *rtc_dev;
|
||||
struct regmap *regmap;
|
||||
struct regmap_field *r_fields[K3_RTC_MAX_FIELDS];
|
||||
const struct ti_k3_rtc_soc_data *soc;
|
||||
};
|
||||
|
||||
static int k3rtc_field_read(struct ti_k3_rtc *priv, enum ti_k3_rtc_fields f)
|
||||
@@ -190,11 +181,22 @@ static int k3rtc_unlock_rtc(struct ti_k3_rtc *priv)
|
||||
|
||||
/* Skip fence since we are going to check the unlock bit as fence */
|
||||
ret = regmap_field_read_poll_timeout(priv->r_fields[K3RTC_UNLOCK], ret,
|
||||
!ret, 2, priv->sync_timeout_us);
|
||||
ret, 2, priv->sync_timeout_us);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* This is the list of SoCs affected by TI's i2327 errata causing the RTC
|
||||
* state-machine to break if not unlocked fast enough during boot. These
|
||||
* SoCs must have the bootloader unlock this device very early in the
|
||||
* boot-flow before we (Linux) can use this device.
|
||||
*/
|
||||
static const struct soc_device_attribute has_erratum_i2327[] = {
|
||||
{ .family = "AM62X", .revision = "SR1.0" },
|
||||
{ /* sentinel */ }
|
||||
};
|
||||
|
||||
static int k3rtc_configure(struct device *dev)
|
||||
{
|
||||
int ret;
|
||||
@@ -208,7 +210,7 @@ static int k3rtc_configure(struct device *dev)
|
||||
*
|
||||
* In such occurrence, it is assumed that the RTC module is unusable
|
||||
*/
|
||||
if (priv->soc->unlock_irq_erratum) {
|
||||
if (soc_device_match(has_erratum_i2327)) {
|
||||
ret = k3rtc_check_unlocked(priv);
|
||||
/* If there is an error OR if we are locked, return error */
|
||||
if (ret) {
|
||||
@@ -513,21 +515,12 @@ static struct nvmem_config ti_k3_rtc_nvmem_config = {
|
||||
|
||||
static int k3rtc_get_32kclk(struct device *dev, struct ti_k3_rtc *priv)
|
||||
{
|
||||
int ret;
|
||||
struct clk *clk;
|
||||
|
||||
clk = devm_clk_get(dev, "osc32k");
|
||||
clk = devm_clk_get_enabled(dev, "osc32k");
|
||||
if (IS_ERR(clk))
|
||||
return PTR_ERR(clk);
|
||||
|
||||
ret = clk_prepare_enable(clk);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = devm_add_action_or_reset(dev, (void (*)(void *))clk_disable_unprepare, clk);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
priv->rate_32k = clk_get_rate(clk);
|
||||
|
||||
/* Make sure we are exact 32k clock. Else, try to compensate delay */
|
||||
@@ -542,24 +535,19 @@ static int k3rtc_get_32kclk(struct device *dev, struct ti_k3_rtc *priv)
|
||||
*/
|
||||
priv->sync_timeout_us = (u32)(DIV_ROUND_UP_ULL(1000000, priv->rate_32k) * 4);
|
||||
|
||||
return ret;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int k3rtc_get_vbusclk(struct device *dev, struct ti_k3_rtc *priv)
|
||||
{
|
||||
int ret;
|
||||
struct clk *clk;
|
||||
|
||||
/* Note: VBUS isn't a context clock, it is needed for hardware operation */
|
||||
clk = devm_clk_get(dev, "vbus");
|
||||
clk = devm_clk_get_enabled(dev, "vbus");
|
||||
if (IS_ERR(clk))
|
||||
return PTR_ERR(clk);
|
||||
|
||||
ret = clk_prepare_enable(clk);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
return devm_add_action_or_reset(dev, (void (*)(void *))clk_disable_unprepare, clk);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ti_k3_rtc_probe(struct platform_device *pdev)
|
||||
@@ -602,8 +590,6 @@ static int ti_k3_rtc_probe(struct platform_device *pdev)
|
||||
if (IS_ERR(priv->rtc_dev))
|
||||
return PTR_ERR(priv->rtc_dev);
|
||||
|
||||
priv->soc = of_device_get_match_data(dev);
|
||||
|
||||
priv->rtc_dev->ops = &ti_k3_rtc_ops;
|
||||
priv->rtc_dev->range_max = (1ULL << 48) - 1; /* 48Bit seconds */
|
||||
ti_k3_rtc_nvmem_config.priv = priv;
|
||||
@@ -635,12 +621,8 @@ static int ti_k3_rtc_probe(struct platform_device *pdev)
|
||||
return devm_rtc_nvmem_register(priv->rtc_dev, &ti_k3_rtc_nvmem_config);
|
||||
}
|
||||
|
||||
static const struct ti_k3_rtc_soc_data ti_k3_am62_data = {
|
||||
.unlock_irq_erratum = true,
|
||||
};
|
||||
|
||||
static const struct of_device_id ti_k3_rtc_of_match_table[] = {
|
||||
{.compatible = "ti,am62-rtc", .data = &ti_k3_am62_data},
|
||||
{.compatible = "ti,am62-rtc" },
|
||||
{}
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, ti_k3_rtc_of_match_table);
|
||||
|
||||
@@ -103,7 +103,7 @@ static char *__dentry_name(struct dentry *dentry, char *name)
|
||||
*/
|
||||
BUG_ON(p + strlen(p) + 1 != name + PATH_MAX);
|
||||
|
||||
strlcpy(name, root, PATH_MAX);
|
||||
strscpy(name, root, PATH_MAX);
|
||||
if (len > p - name) {
|
||||
__putname(name);
|
||||
return NULL;
|
||||
|
||||
@@ -24,6 +24,17 @@ static bool ubifs_crypt_empty_dir(struct inode *inode)
|
||||
return ubifs_check_dir_empty(inode) == 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* ubifs_encrypt - Encrypt data.
|
||||
* @inode: inode which refers to the data node
|
||||
* @dn: data node to encrypt
|
||||
* @in_len: length of data to be compressed
|
||||
* @out_len: allocated memory size for the data area of @dn
|
||||
* @block: logical block number of the block
|
||||
*
|
||||
* This function encrypt a possibly-compressed data in the data node.
|
||||
* The encrypted data length will store in @out_len.
|
||||
*/
|
||||
int ubifs_encrypt(const struct inode *inode, struct ubifs_data_node *dn,
|
||||
unsigned int in_len, unsigned int *out_len, int block)
|
||||
{
|
||||
|
||||
@@ -68,13 +68,14 @@ static int inherit_flags(const struct inode *dir, umode_t mode)
|
||||
* @c: UBIFS file-system description object
|
||||
* @dir: parent directory inode
|
||||
* @mode: inode mode flags
|
||||
* @is_xattr: whether the inode is xattr inode
|
||||
*
|
||||
* This function finds an unused inode number, allocates new inode and
|
||||
* initializes it. Returns new inode in case of success and an error code in
|
||||
* case of failure.
|
||||
*/
|
||||
struct inode *ubifs_new_inode(struct ubifs_info *c, struct inode *dir,
|
||||
umode_t mode)
|
||||
umode_t mode, bool is_xattr)
|
||||
{
|
||||
int err;
|
||||
struct inode *inode;
|
||||
@@ -99,10 +100,12 @@ struct inode *ubifs_new_inode(struct ubifs_info *c, struct inode *dir,
|
||||
current_time(inode);
|
||||
inode->i_mapping->nrpages = 0;
|
||||
|
||||
err = fscrypt_prepare_new_inode(dir, inode, &encrypted);
|
||||
if (err) {
|
||||
ubifs_err(c, "fscrypt_prepare_new_inode failed: %i", err);
|
||||
goto out_iput;
|
||||
if (!is_xattr) {
|
||||
err = fscrypt_prepare_new_inode(dir, inode, &encrypted);
|
||||
if (err) {
|
||||
ubifs_err(c, "fscrypt_prepare_new_inode failed: %i", err);
|
||||
goto out_iput;
|
||||
}
|
||||
}
|
||||
|
||||
switch (mode & S_IFMT) {
|
||||
@@ -309,7 +312,7 @@ static int ubifs_create(struct user_namespace *mnt_userns, struct inode *dir,
|
||||
|
||||
sz_change = CALC_DENT_SIZE(fname_len(&nm));
|
||||
|
||||
inode = ubifs_new_inode(c, dir, mode);
|
||||
inode = ubifs_new_inode(c, dir, mode, false);
|
||||
if (IS_ERR(inode)) {
|
||||
err = PTR_ERR(inode);
|
||||
goto out_fname;
|
||||
@@ -370,7 +373,7 @@ static struct inode *create_whiteout(struct inode *dir, struct dentry *dentry)
|
||||
if (err)
|
||||
return ERR_PTR(err);
|
||||
|
||||
inode = ubifs_new_inode(c, dir, mode);
|
||||
inode = ubifs_new_inode(c, dir, mode, false);
|
||||
if (IS_ERR(inode)) {
|
||||
err = PTR_ERR(inode);
|
||||
goto out_free;
|
||||
@@ -463,7 +466,7 @@ static int ubifs_tmpfile(struct user_namespace *mnt_userns, struct inode *dir,
|
||||
return err;
|
||||
}
|
||||
|
||||
inode = ubifs_new_inode(c, dir, mode);
|
||||
inode = ubifs_new_inode(c, dir, mode, false);
|
||||
if (IS_ERR(inode)) {
|
||||
err = PTR_ERR(inode);
|
||||
goto out_budg;
|
||||
@@ -873,7 +876,7 @@ out_fname:
|
||||
}
|
||||
|
||||
/**
|
||||
* check_dir_empty - check if a directory is empty or not.
|
||||
* ubifs_check_dir_empty - check if a directory is empty or not.
|
||||
* @dir: VFS inode object of the directory to check
|
||||
*
|
||||
* This function checks if directory @dir is empty. Returns zero if the
|
||||
@@ -1005,7 +1008,7 @@ static int ubifs_mkdir(struct user_namespace *mnt_userns, struct inode *dir,
|
||||
|
||||
sz_change = CALC_DENT_SIZE(fname_len(&nm));
|
||||
|
||||
inode = ubifs_new_inode(c, dir, S_IFDIR | mode);
|
||||
inode = ubifs_new_inode(c, dir, S_IFDIR | mode, false);
|
||||
if (IS_ERR(inode)) {
|
||||
err = PTR_ERR(inode);
|
||||
goto out_fname;
|
||||
@@ -1092,7 +1095,7 @@ static int ubifs_mknod(struct user_namespace *mnt_userns, struct inode *dir,
|
||||
|
||||
sz_change = CALC_DENT_SIZE(fname_len(&nm));
|
||||
|
||||
inode = ubifs_new_inode(c, dir, mode);
|
||||
inode = ubifs_new_inode(c, dir, mode, false);
|
||||
if (IS_ERR(inode)) {
|
||||
kfree(dev);
|
||||
err = PTR_ERR(inode);
|
||||
@@ -1174,7 +1177,7 @@ static int ubifs_symlink(struct user_namespace *mnt_userns, struct inode *dir,
|
||||
|
||||
sz_change = CALC_DENT_SIZE(fname_len(&nm));
|
||||
|
||||
inode = ubifs_new_inode(c, dir, S_IFLNK | S_IRWXUGO);
|
||||
inode = ubifs_new_inode(c, dir, S_IFLNK | S_IRWXUGO, false);
|
||||
if (IS_ERR(inode)) {
|
||||
err = PTR_ERR(inode);
|
||||
goto out_fname;
|
||||
|
||||
@@ -1472,23 +1472,25 @@ out_free:
|
||||
* @block: data block number
|
||||
* @dn: data node to re-compress
|
||||
* @new_len: new length
|
||||
* @dn_size: size of the data node @dn in memory
|
||||
*
|
||||
* This function is used when an inode is truncated and the last data node of
|
||||
* the inode has to be re-compressed/encrypted and re-written.
|
||||
*/
|
||||
static int truncate_data_node(const struct ubifs_info *c, const struct inode *inode,
|
||||
unsigned int block, struct ubifs_data_node *dn,
|
||||
int *new_len)
|
||||
int *new_len, int dn_size)
|
||||
{
|
||||
void *buf;
|
||||
int err, dlen, compr_type, out_len, old_dlen;
|
||||
int err, dlen, compr_type, out_len, data_size;
|
||||
|
||||
out_len = le32_to_cpu(dn->size);
|
||||
buf = kmalloc_array(out_len, WORST_COMPR_FACTOR, GFP_NOFS);
|
||||
if (!buf)
|
||||
return -ENOMEM;
|
||||
|
||||
dlen = old_dlen = le32_to_cpu(dn->ch.len) - UBIFS_DATA_NODE_SZ;
|
||||
dlen = le32_to_cpu(dn->ch.len) - UBIFS_DATA_NODE_SZ;
|
||||
data_size = dn_size - UBIFS_DATA_NODE_SZ;
|
||||
compr_type = le16_to_cpu(dn->compr_type);
|
||||
|
||||
if (IS_ENCRYPTED(inode)) {
|
||||
@@ -1508,11 +1510,11 @@ static int truncate_data_node(const struct ubifs_info *c, const struct inode *in
|
||||
}
|
||||
|
||||
if (IS_ENCRYPTED(inode)) {
|
||||
err = ubifs_encrypt(inode, dn, out_len, &old_dlen, block);
|
||||
err = ubifs_encrypt(inode, dn, out_len, &data_size, block);
|
||||
if (err)
|
||||
goto out;
|
||||
|
||||
out_len = old_dlen;
|
||||
out_len = data_size;
|
||||
} else {
|
||||
dn->compr_size = 0;
|
||||
}
|
||||
@@ -1550,6 +1552,7 @@ int ubifs_jnl_truncate(struct ubifs_info *c, const struct inode *inode,
|
||||
struct ubifs_trun_node *trun;
|
||||
struct ubifs_data_node *dn;
|
||||
int err, dlen, len, lnum, offs, bit, sz, sync = IS_SYNC(inode);
|
||||
int dn_size;
|
||||
struct ubifs_inode *ui = ubifs_inode(inode);
|
||||
ino_t inum = inode->i_ino;
|
||||
unsigned int blk;
|
||||
@@ -1562,10 +1565,13 @@ int ubifs_jnl_truncate(struct ubifs_info *c, const struct inode *inode,
|
||||
ubifs_assert(c, S_ISREG(inode->i_mode));
|
||||
ubifs_assert(c, mutex_is_locked(&ui->ui_mutex));
|
||||
|
||||
sz = UBIFS_TRUN_NODE_SZ + UBIFS_INO_NODE_SZ +
|
||||
UBIFS_MAX_DATA_NODE_SZ * WORST_COMPR_FACTOR;
|
||||
dn_size = COMPRESSED_DATA_NODE_BUF_SZ;
|
||||
|
||||
sz += ubifs_auth_node_sz(c);
|
||||
if (IS_ENCRYPTED(inode))
|
||||
dn_size += UBIFS_CIPHER_BLOCK_SIZE;
|
||||
|
||||
sz = UBIFS_TRUN_NODE_SZ + UBIFS_INO_NODE_SZ +
|
||||
dn_size + ubifs_auth_node_sz(c);
|
||||
|
||||
ino = kmalloc(sz, GFP_NOFS);
|
||||
if (!ino)
|
||||
@@ -1596,15 +1602,15 @@ int ubifs_jnl_truncate(struct ubifs_info *c, const struct inode *inode,
|
||||
if (dn_len <= 0 || dn_len > UBIFS_BLOCK_SIZE) {
|
||||
ubifs_err(c, "bad data node (block %u, inode %lu)",
|
||||
blk, inode->i_ino);
|
||||
ubifs_dump_node(c, dn, sz - UBIFS_INO_NODE_SZ -
|
||||
UBIFS_TRUN_NODE_SZ);
|
||||
ubifs_dump_node(c, dn, dn_size);
|
||||
goto out_free;
|
||||
}
|
||||
|
||||
if (dn_len <= dlen)
|
||||
dlen = 0; /* Nothing to do */
|
||||
else {
|
||||
err = truncate_data_node(c, inode, blk, dn, &dlen);
|
||||
err = truncate_data_node(c, inode, blk, dn,
|
||||
&dlen, dn_size);
|
||||
if (err)
|
||||
goto out_free;
|
||||
}
|
||||
|
||||
@@ -2026,7 +2026,7 @@ int ubifs_update_time(struct inode *inode, struct timespec64 *time, int flags);
|
||||
|
||||
/* dir.c */
|
||||
struct inode *ubifs_new_inode(struct ubifs_info *c, struct inode *dir,
|
||||
umode_t mode);
|
||||
umode_t mode, bool is_xattr);
|
||||
int ubifs_getattr(struct user_namespace *mnt_userns, const struct path *path, struct kstat *stat,
|
||||
u32 request_mask, unsigned int flags);
|
||||
int ubifs_check_dir_empty(struct inode *dir);
|
||||
|
||||
@@ -110,7 +110,7 @@ static int create_xattr(struct ubifs_info *c, struct inode *host,
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
inode = ubifs_new_inode(c, host, S_IFREG | S_IRWXUGO);
|
||||
inode = ubifs_new_inode(c, host, S_IFREG | S_IRWXUGO, true);
|
||||
if (IS_ERR(inode)) {
|
||||
err = PTR_ERR(inode);
|
||||
goto out_budg;
|
||||
|
||||
@@ -247,6 +247,7 @@ enum {
|
||||
* @vid_hdr_offset: VID header offset (use defaults if %0)
|
||||
* @max_beb_per1024: maximum expected number of bad PEB per 1024 PEBs
|
||||
* @padding: reserved for future, not used, has to be zeroed
|
||||
* @disable_fm: whether disable fastmap
|
||||
*
|
||||
* This data structure is used to specify MTD device UBI has to attach and the
|
||||
* parameters it has to use. The number which should be assigned to the new UBI
|
||||
@@ -281,13 +282,18 @@ enum {
|
||||
* eraseblocks for new bad eraseblocks, but attempts to use available
|
||||
* eraseblocks (if any). The accepted range is 0-768. If 0 is given, the
|
||||
* default kernel value of %CONFIG_MTD_UBI_BEB_LIMIT will be used.
|
||||
*
|
||||
* If @disable_fm is not zero, ubi doesn't create new fastmap even the module
|
||||
* param 'fm_autoconvert' is set, and existed old fastmap will be destroyed
|
||||
* after doing full scanning.
|
||||
*/
|
||||
struct ubi_attach_req {
|
||||
__s32 ubi_num;
|
||||
__s32 mtd_num;
|
||||
__s32 vid_hdr_offset;
|
||||
__s16 max_beb_per1024;
|
||||
__s8 padding[10];
|
||||
__s8 disable_fm;
|
||||
__s8 padding[9];
|
||||
};
|
||||
|
||||
/*
|
||||
|
||||
Reference in New Issue
Block a user