History

Merge tag 'upstream-4.9-rc2' of git://git.infradead.org/linux-ubifs

Pull UBI[FS] fixes from Richard Weinberger: "This contains fixes for issues in both UBI and UBIFS: - Fallout from the merge window, refactoring UBI code introduced some issues. - Fixes for an UBIFS readdir bug which can cause getdents() to busy loop for ever and a bug in the UBIFS xattr code" * tag 'upstream-4.9-rc2' of git://git.infradead.org/linux-ubifs: ubifs: Abort readdir upon error UBI: Fix crash in try_recover_peb() ubi: fix swapped arguments to call to ubi_alloc_aeb ubifs: Fix xattr_names length in exit paths ubifs: Rename ubifs_rename2

Linus Torvalds committed 10 years ago

Commit 5ff93ab2 parents c761923 c83ed4c4 files · +13 −12Browse files

Unified · Split

4 files
  1. drivers/mtd/ubi/eba.c +1 −0
  2. drivers/mtd/ubi/fastmap.c +1 −1
  3. fs/ubifs/dir.c +9 −11
  4. fs/ubifs/xattr.c +2 −0
drivers/mtd/ubi/eba.c+1−0
@@ -741,6 +741,7 @@ static int try_recover_peb(struct ubi_volume *vol, int pnum, int lnum, · 740 unmodified lines
741 goto out_put;741 goto out_put;
742 }742 }
743 743
744 vid_hdr = ubi_get_vid_hdr(vidb);
744 ubi_assert(vid_hdr->vol_type == UBI_VID_DYNAMIC);745 ubi_assert(vid_hdr->vol_type == UBI_VID_DYNAMIC);
745 746
746 mutex_lock(&ubi->buf_mutex);747 mutex_lock(&ubi->buf_mutex);
drivers/mtd/ubi/fastmap.c+1−1
@@ -287,7 +287,7 @@ static int update_vol(struct ubi_device *ubi, struct ubi_attach_info *ai, · 286 unmodified lines
287 287
288 /* new_aeb is newer */288 /* new_aeb is newer */
289 if (cmp_res & 1) {289 if (cmp_res & 1) {
290 victim = ubi_alloc_aeb(ai, aeb->ec, aeb->pnum);290 victim = ubi_alloc_aeb(ai, aeb->pnum, aeb->ec);
291 if (!victim)291 if (!victim)
292 return -ENOMEM;292 return -ENOMEM;
293 293
fs/ubifs/dir.c+9−11
@@ -439,7 +439,7 @@ static unsigned int vfs_dent_type(uint8_t type) · 438 unmodified lines
439 */439 */
440static int ubifs_readdir(struct file *file, struct dir_context *ctx)440static int ubifs_readdir(struct file *file, struct dir_context *ctx)
441{441{
442 int err;442 int err = 0;
443 struct qstr nm;443 struct qstr nm;
444 union ubifs_key key;444 union ubifs_key key;
445 struct ubifs_dent_node *dent;445 struct ubifs_dent_node *dent;
@@ -541,14 +541,12 @@ out: · 95 unmodified lines
541 kfree(file->private_data);541 kfree(file->private_data);
542 file->private_data = NULL;542 file->private_data = NULL;
543 543
544 if (err != -ENOENT) {544 if (err != -ENOENT)
545 ubifs_err(c, "cannot find next direntry, error %d", err);545 ubifs_err(c, "cannot find next direntry, error %d", err);
546 return err;
547 }
548 546
549 /* 2 is a special value indicating that there are no more direntries */547 /* 2 is a special value indicating that there are no more direntries */
550 ctx->pos = 2;548 ctx->pos = 2;
551 return 0;549 return err;
552}550}
553 551
554/* Free saved readdir() state when the directory is closed */552/* Free saved readdir() state when the directory is closed */
@@ -1060,9 +1058,9 @@ static void unlock_4_inodes(struct inode *inode1, struct inode *inode2, · 505 unmodified lines
1060 mutex_unlock(&ubifs_inode(inode1)->ui_mutex);1058 mutex_unlock(&ubifs_inode(inode1)->ui_mutex);
1061}1059}
1062 1060
1063static int ubifs_rename(struct inode *old_dir, struct dentry *old_dentry,1061static int do_rename(struct inode *old_dir, struct dentry *old_dentry,
1064 struct inode *new_dir, struct dentry *new_dentry,1062 struct inode *new_dir, struct dentry *new_dentry,
1065 unsigned int flags)1063 unsigned int flags)
1066{1064{
1067 struct ubifs_info *c = old_dir->i_sb->s_fs_info;1065 struct ubifs_info *c = old_dir->i_sb->s_fs_info;
1068 struct inode *old_inode = d_inode(old_dentry);1066 struct inode *old_inode = d_inode(old_dentry);
@@ -1323,7 +1321,7 @@ static int ubifs_xrename(struct inode *old_dir, struct dentry *old_dentry, · 254 unmodified lines
1323 return err;1321 return err;
1324}1322}
1325 1323
1326static int ubifs_rename2(struct inode *old_dir, struct dentry *old_dentry,1324static int ubifs_rename(struct inode *old_dir, struct dentry *old_dentry,
1327 struct inode *new_dir, struct dentry *new_dentry,1325 struct inode *new_dir, struct dentry *new_dentry,
1328 unsigned int flags)1326 unsigned int flags)
1329{1327{
@@ -1336,7 +1334,7 @@ static int ubifs_rename2(struct inode *old_dir, struct dentry *old_dentry, · 6 unmodified lines
1336 if (flags & RENAME_EXCHANGE)1334 if (flags & RENAME_EXCHANGE)
1337 return ubifs_xrename(old_dir, old_dentry, new_dir, new_dentry);1335 return ubifs_xrename(old_dir, old_dentry, new_dir, new_dentry);
1338 1336
1339 return ubifs_rename(old_dir, old_dentry, new_dir, new_dentry, flags);1337 return do_rename(old_dir, old_dentry, new_dir, new_dentry, flags);
1340}1338}
1341 1339
1342int ubifs_getattr(struct vfsmount *mnt, struct dentry *dentry,1340int ubifs_getattr(struct vfsmount *mnt, struct dentry *dentry,
@@ -1387,7 +1385,7 @@ const struct inode_operations ubifs_dir_inode_operations = { · 44 unmodified lines
1387 .mkdir = ubifs_mkdir,1385 .mkdir = ubifs_mkdir,
1388 .rmdir = ubifs_rmdir,1386 .rmdir = ubifs_rmdir,
1389 .mknod = ubifs_mknod,1387 .mknod = ubifs_mknod,
1390 .rename = ubifs_rename2,1388 .rename = ubifs_rename,
1391 .setattr = ubifs_setattr,1389 .setattr = ubifs_setattr,
1392 .getattr = ubifs_getattr,1390 .getattr = ubifs_getattr,
1393 .listxattr = ubifs_listxattr,1391 .listxattr = ubifs_listxattr,
fs/ubifs/xattr.c+2−0
@@ -172,6 +172,7 @@ out_cancel: · 171 unmodified lines
172 host_ui->xattr_cnt -= 1;172 host_ui->xattr_cnt -= 1;
173 host_ui->xattr_size -= CALC_DENT_SIZE(nm->len);173 host_ui->xattr_size -= CALC_DENT_SIZE(nm->len);
174 host_ui->xattr_size -= CALC_XATTR_BYTES(size);174 host_ui->xattr_size -= CALC_XATTR_BYTES(size);
175 host_ui->xattr_names -= nm->len;
175 mutex_unlock(&host_ui->ui_mutex);176 mutex_unlock(&host_ui->ui_mutex);
176out_free:177out_free:
177 make_bad_inode(inode);178 make_bad_inode(inode);
@@ -478,6 +479,7 @@ out_cancel: · 300 unmodified lines
478 host_ui->xattr_cnt += 1;479 host_ui->xattr_cnt += 1;
479 host_ui->xattr_size += CALC_DENT_SIZE(nm->len);480 host_ui->xattr_size += CALC_DENT_SIZE(nm->len);
480 host_ui->xattr_size += CALC_XATTR_BYTES(ui->data_len);481 host_ui->xattr_size += CALC_XATTR_BYTES(ui->data_len);
482 host_ui->xattr_names += nm->len;
481 mutex_unlock(&host_ui->ui_mutex);483 mutex_unlock(&host_ui->ui_mutex);
482 ubifs_release_budget(c, &req);484 ubifs_release_budget(c, &req);
483 make_bad_inode(inode);485 make_bad_inode(inode);