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

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