This pull request contains updates for UBI and UBIFS
UBI: - Use bitmap API to allocate bitmaps - New attach mode, disable_fm, to attach without fastmap - Fixes for various typos in comments UBIFS: - Fix for a deadlock when setting xattrs for encrypted file - Fix for an assertion failures when truncating encrypted files - Fixes for various typos in comments -----BEGIN PGP SIGNATURE----- iQJKBAABCAA0FiEEdgfidid8lnn52cLTZvlZhesYu8EFAmNJymMWHHJpY2hhcmRA c2lnbWEtc3Rhci5hdAAKCRBm+VmF6xi7wRuRD/0cAP02dtaUvOHrPqBf1VA/gMdt hxsscSbxrbIaSyrc/Olc4uI0rqmUzijr8AI3YBqrIQvZGxrjhDE/O2ai7dQ4wzku J+ynLaH5GRzqLtnf1yBc2ss5rkhLeuoQ2H7z7PV6v4dyqjDQYCWCHGUIbPD8XEMq m0cOJfw1COPDYz/R4OVH40qDWq/D9okr3siV15xmKV+9+dRZqqKmKay4WRjktuQd 34ryO5Hl8ynlIUdonjtLGn5I+q2ZTggrHwEhwFPWdQIytOiyWkPUQK+vPiyjTdH2 O7sHifqlPLOJcqBHxM64pVXyPg/f9nFWsLv25RodWu9BfXA3K9eOY1dyGr9In1ly RXyToXLeVOwkvVgTTBwaBlPBVwJmGWdklxErgx3ZbhZ/HarPafFjT8Fkt+c/tGny Yb7A3zo33oy8hJRApaTijtab7evtAH2lRxqRewssY9yEAoxiPuwAfHempom+CWQj WdaZjbvb3uQodQSSVBbdl9X5lmaF1eSoAEr7o09mA+MOT7jB80yxm/SoXEg+cdPj fVRMRt2ciCE84i96l4XmjhB9sFIw6XrRYDMAP9BVd6Lxm9o+Fv6rzC4ApbnJasK0 56M0dUgec+EZ8WyJiJJF/uOrNYq/r4OYnohmMChErGsY8cF3orhEb+Dh2oOm944E giHLrLLHJFZofFBFrw== =UVHq -----END PGP SIGNATURE----- Merge tag 'for-linus-6.1-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/rw/ubifs Pull UBI and UBIFS updates from Richard Weinberger: "UBI: - Use bitmap API to allocate bitmaps - New attach mode, disable_fm, to attach without fastmap - Fixes for various typos in comments UBIFS: - Fix for a deadlock when setting xattrs for encrypted file - Fix for an assertion failures when truncating encrypted files - Fixes for various typos in comments" * tag 'for-linus-6.1-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/rw/ubifs: ubi: fastmap: Add fastmap control support for 'UBI_IOCATT' ioctl ubi: fastmap: Use the bitmap API to allocate bitmaps ubifs: Fix AA deadlock when setting xattr for encrypted file ubifs: Fix UBIFS ro fail due to truncate in the encrypted directory mtd: ubi: drop unexpected word 'a' in comments ubi: block: Fix typos in comments ubi: fastmap: Fix typo in comments ubi: Fix repeated words in comments ubi: ubi-media.h: Fix comment typo ubi: block: Remove in vain semicolon ubifs: Fix ubifs_check_dir_empty() kernel-doc comment
This commit is contained in:
commit
b7cef0d21c
@ -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.
|
||||
|
@ -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];
|
||||
};
|
||||
|
||||
/*
|
||||
|
Loading…
Reference in New Issue
Block a user