aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2016-10-23 19:58:55 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2016-10-23 19:58:55 -0400
commit5ff93abc7a2aff167a91bf4ccd47bd0789f86fc0 (patch)
tree0fb05d3be5c7998fa15c19c40221e4a3fbbf8622 /fs
parentc761923cb80700cf8d907377e374d21b08c0ff77 (diff)
parentc83ed4c9dbb358b9e7707486e167e940d48bfeed (diff)
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
Diffstat (limited to 'fs')
-rw-r--r--fs/ubifs/dir.c20
-rw-r--r--fs/ubifs/xattr.c2
2 files changed, 11 insertions, 11 deletions
diff --git a/fs/ubifs/dir.c b/fs/ubifs/dir.c
index c8f60df2733e..bd4a5e8ce441 100644
--- a/fs/ubifs/dir.c
+++ b/fs/ubifs/dir.c
@@ -439,7 +439,7 @@ static unsigned int vfs_dent_type(uint8_t type)
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:
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,
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,
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,
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 = {
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,
diff --git a/fs/ubifs/xattr.c b/fs/ubifs/xattr.c
index 6c2f4d41ed73..d9f9615bfd71 100644
--- a/fs/ubifs/xattr.c
+++ b/fs/ubifs/xattr.c
@@ -172,6 +172,7 @@ out_cancel:
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:
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);