diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2016-10-23 19:58:55 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2016-10-23 19:58:55 -0400 |
commit | 5ff93abc7a2aff167a91bf4ccd47bd0789f86fc0 (patch) | |
tree | 0fb05d3be5c7998fa15c19c40221e4a3fbbf8622 /fs | |
parent | c761923cb80700cf8d907377e374d21b08c0ff77 (diff) | |
parent | c83ed4c9dbb358b9e7707486e167e940d48bfeed (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.c | 20 | ||||
-rw-r--r-- | fs/ubifs/xattr.c | 2 |
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 | */ |
440 | static int ubifs_readdir(struct file *file, struct dir_context *ctx) | 440 | static 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 | ||
1063 | static int ubifs_rename(struct inode *old_dir, struct dentry *old_dentry, | 1061 | static 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 | ||
1326 | static int ubifs_rename2(struct inode *old_dir, struct dentry *old_dentry, | 1324 | static 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 | ||
1342 | int ubifs_getattr(struct vfsmount *mnt, struct dentry *dentry, | 1340 | int 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); |
176 | out_free: | 177 | out_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); |