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