diff options
| -rw-r--r-- | drivers/char/raw.c | 2 | ||||
| -rw-r--r-- | drivers/staging/android/logger.c | 13 | ||||
| -rw-r--r-- | fs/block_dev.c | 3 | ||||
| -rw-r--r-- | fs/isofs/inode.c | 24 | ||||
| -rw-r--r-- | fs/isofs/namei.c | 22 | ||||
| -rw-r--r-- | fs/namei.c | 2 | ||||
| -rw-r--r-- | fs/overlayfs/readdir.c | 17 | ||||
| -rw-r--r-- | include/linux/fs.h | 10 | ||||
| -rw-r--r-- | include/linux/rcupdate.h | 15 |
9 files changed, 50 insertions, 58 deletions
diff --git a/drivers/char/raw.c b/drivers/char/raw.c index 0102dc788608..a24891b97547 100644 --- a/drivers/char/raw.c +++ b/drivers/char/raw.c | |||
| @@ -285,7 +285,7 @@ static long raw_ctl_compat_ioctl(struct file *file, unsigned int cmd, | |||
| 285 | 285 | ||
| 286 | static const struct file_operations raw_fops = { | 286 | static const struct file_operations raw_fops = { |
| 287 | .read = new_sync_read, | 287 | .read = new_sync_read, |
| 288 | .read_iter = generic_file_read_iter, | 288 | .read_iter = blkdev_read_iter, |
| 289 | .write = new_sync_write, | 289 | .write = new_sync_write, |
| 290 | .write_iter = blkdev_write_iter, | 290 | .write_iter = blkdev_write_iter, |
| 291 | .fsync = blkdev_fsync, | 291 | .fsync = blkdev_fsync, |
diff --git a/drivers/staging/android/logger.c b/drivers/staging/android/logger.c index 28b93d39a94e..a673ffa34aa3 100644 --- a/drivers/staging/android/logger.c +++ b/drivers/staging/android/logger.c | |||
| @@ -420,7 +420,7 @@ static ssize_t logger_write_iter(struct kiocb *iocb, struct iov_iter *from) | |||
| 420 | struct logger_log *log = file_get_log(iocb->ki_filp); | 420 | struct logger_log *log = file_get_log(iocb->ki_filp); |
| 421 | struct logger_entry header; | 421 | struct logger_entry header; |
| 422 | struct timespec now; | 422 | struct timespec now; |
| 423 | size_t len, count; | 423 | size_t len, count, w_off; |
| 424 | 424 | ||
| 425 | count = min_t(size_t, iocb->ki_nbytes, LOGGER_ENTRY_MAX_PAYLOAD); | 425 | count = min_t(size_t, iocb->ki_nbytes, LOGGER_ENTRY_MAX_PAYLOAD); |
| 426 | 426 | ||
| @@ -452,11 +452,14 @@ static ssize_t logger_write_iter(struct kiocb *iocb, struct iov_iter *from) | |||
| 452 | memcpy(log->buffer + log->w_off, &header, len); | 452 | memcpy(log->buffer + log->w_off, &header, len); |
| 453 | memcpy(log->buffer, (char *)&header + len, sizeof(header) - len); | 453 | memcpy(log->buffer, (char *)&header + len, sizeof(header) - len); |
| 454 | 454 | ||
| 455 | len = min(count, log->size - log->w_off); | 455 | /* Work with a copy until we are ready to commit the whole entry */ |
| 456 | w_off = logger_offset(log, log->w_off + sizeof(struct logger_entry)); | ||
| 456 | 457 | ||
| 457 | if (copy_from_iter(log->buffer + log->w_off, len, from) != len) { | 458 | len = min(count, log->size - w_off); |
| 459 | |||
| 460 | if (copy_from_iter(log->buffer + w_off, len, from) != len) { | ||
| 458 | /* | 461 | /* |
| 459 | * Note that by not updating w_off, this abandons the | 462 | * Note that by not updating log->w_off, this abandons the |
| 460 | * portion of the new entry that *was* successfully | 463 | * portion of the new entry that *was* successfully |
| 461 | * copied, just above. This is intentional to avoid | 464 | * copied, just above. This is intentional to avoid |
| 462 | * message corruption from missing fragments. | 465 | * message corruption from missing fragments. |
| @@ -470,7 +473,7 @@ static ssize_t logger_write_iter(struct kiocb *iocb, struct iov_iter *from) | |||
| 470 | return -EFAULT; | 473 | return -EFAULT; |
| 471 | } | 474 | } |
| 472 | 475 | ||
| 473 | log->w_off = logger_offset(log, log->w_off + count); | 476 | log->w_off = logger_offset(log, w_off + count); |
| 474 | mutex_unlock(&log->mutex); | 477 | mutex_unlock(&log->mutex); |
| 475 | 478 | ||
| 476 | /* wake up any blocked readers */ | 479 | /* wake up any blocked readers */ |
diff --git a/fs/block_dev.c b/fs/block_dev.c index cc9d4114cda0..1d9c9f3754f8 100644 --- a/fs/block_dev.c +++ b/fs/block_dev.c | |||
| @@ -1585,7 +1585,7 @@ ssize_t blkdev_write_iter(struct kiocb *iocb, struct iov_iter *from) | |||
| 1585 | } | 1585 | } |
| 1586 | EXPORT_SYMBOL_GPL(blkdev_write_iter); | 1586 | EXPORT_SYMBOL_GPL(blkdev_write_iter); |
| 1587 | 1587 | ||
| 1588 | static ssize_t blkdev_read_iter(struct kiocb *iocb, struct iov_iter *to) | 1588 | ssize_t blkdev_read_iter(struct kiocb *iocb, struct iov_iter *to) |
| 1589 | { | 1589 | { |
| 1590 | struct file *file = iocb->ki_filp; | 1590 | struct file *file = iocb->ki_filp; |
| 1591 | struct inode *bd_inode = file->f_mapping->host; | 1591 | struct inode *bd_inode = file->f_mapping->host; |
| @@ -1599,6 +1599,7 @@ static ssize_t blkdev_read_iter(struct kiocb *iocb, struct iov_iter *to) | |||
| 1599 | iov_iter_truncate(to, size); | 1599 | iov_iter_truncate(to, size); |
| 1600 | return generic_file_read_iter(iocb, to); | 1600 | return generic_file_read_iter(iocb, to); |
| 1601 | } | 1601 | } |
| 1602 | EXPORT_SYMBOL_GPL(blkdev_read_iter); | ||
| 1602 | 1603 | ||
| 1603 | /* | 1604 | /* |
| 1604 | * Try to release a page associated with block device when the system | 1605 | * Try to release a page associated with block device when the system |
diff --git a/fs/isofs/inode.c b/fs/isofs/inode.c index 881b3bd0143f..fe839b915116 100644 --- a/fs/isofs/inode.c +++ b/fs/isofs/inode.c | |||
| @@ -29,13 +29,9 @@ | |||
| 29 | #define BEQUIET | 29 | #define BEQUIET |
| 30 | 30 | ||
| 31 | static int isofs_hashi(const struct dentry *parent, struct qstr *qstr); | 31 | static int isofs_hashi(const struct dentry *parent, struct qstr *qstr); |
| 32 | static int isofs_hash(const struct dentry *parent, struct qstr *qstr); | ||
| 33 | static int isofs_dentry_cmpi(const struct dentry *parent, | 32 | static int isofs_dentry_cmpi(const struct dentry *parent, |
| 34 | const struct dentry *dentry, | 33 | const struct dentry *dentry, |
| 35 | unsigned int len, const char *str, const struct qstr *name); | 34 | unsigned int len, const char *str, const struct qstr *name); |
| 36 | static int isofs_dentry_cmp(const struct dentry *parent, | ||
| 37 | const struct dentry *dentry, | ||
| 38 | unsigned int len, const char *str, const struct qstr *name); | ||
| 39 | 35 | ||
| 40 | #ifdef CONFIG_JOLIET | 36 | #ifdef CONFIG_JOLIET |
| 41 | static int isofs_hashi_ms(const struct dentry *parent, struct qstr *qstr); | 37 | static int isofs_hashi_ms(const struct dentry *parent, struct qstr *qstr); |
| @@ -135,10 +131,6 @@ static const struct super_operations isofs_sops = { | |||
| 135 | 131 | ||
| 136 | static const struct dentry_operations isofs_dentry_ops[] = { | 132 | static const struct dentry_operations isofs_dentry_ops[] = { |
| 137 | { | 133 | { |
| 138 | .d_hash = isofs_hash, | ||
| 139 | .d_compare = isofs_dentry_cmp, | ||
| 140 | }, | ||
| 141 | { | ||
| 142 | .d_hash = isofs_hashi, | 134 | .d_hash = isofs_hashi, |
| 143 | .d_compare = isofs_dentry_cmpi, | 135 | .d_compare = isofs_dentry_cmpi, |
| 144 | }, | 136 | }, |
| @@ -258,25 +250,12 @@ static int isofs_dentry_cmp_common( | |||
| 258 | } | 250 | } |
| 259 | 251 | ||
| 260 | static int | 252 | static int |
| 261 | isofs_hash(const struct dentry *dentry, struct qstr *qstr) | ||
| 262 | { | ||
| 263 | return isofs_hash_common(qstr, 0); | ||
| 264 | } | ||
| 265 | |||
| 266 | static int | ||
| 267 | isofs_hashi(const struct dentry *dentry, struct qstr *qstr) | 253 | isofs_hashi(const struct dentry *dentry, struct qstr *qstr) |
| 268 | { | 254 | { |
| 269 | return isofs_hashi_common(qstr, 0); | 255 | return isofs_hashi_common(qstr, 0); |
| 270 | } | 256 | } |
| 271 | 257 | ||
| 272 | static int | 258 | static int |
| 273 | isofs_dentry_cmp(const struct dentry *parent, const struct dentry *dentry, | ||
| 274 | unsigned int len, const char *str, const struct qstr *name) | ||
| 275 | { | ||
| 276 | return isofs_dentry_cmp_common(len, str, name, 0, 0); | ||
| 277 | } | ||
| 278 | |||
| 279 | static int | ||
| 280 | isofs_dentry_cmpi(const struct dentry *parent, const struct dentry *dentry, | 259 | isofs_dentry_cmpi(const struct dentry *parent, const struct dentry *dentry, |
| 281 | unsigned int len, const char *str, const struct qstr *name) | 260 | unsigned int len, const char *str, const struct qstr *name) |
| 282 | { | 261 | { |
| @@ -930,7 +909,8 @@ root_found: | |||
| 930 | if (opt.check == 'r') | 909 | if (opt.check == 'r') |
| 931 | table++; | 910 | table++; |
| 932 | 911 | ||
| 933 | s->s_d_op = &isofs_dentry_ops[table]; | 912 | if (table) |
| 913 | s->s_d_op = &isofs_dentry_ops[table - 1]; | ||
| 934 | 914 | ||
| 935 | /* get the root dentry */ | 915 | /* get the root dentry */ |
| 936 | s->s_root = d_make_root(inode); | 916 | s->s_root = d_make_root(inode); |
diff --git a/fs/isofs/namei.c b/fs/isofs/namei.c index 95295640d9c8..7b543e6b6526 100644 --- a/fs/isofs/namei.c +++ b/fs/isofs/namei.c | |||
| @@ -18,25 +18,10 @@ static int | |||
| 18 | isofs_cmp(struct dentry *dentry, const char *compare, int dlen) | 18 | isofs_cmp(struct dentry *dentry, const char *compare, int dlen) |
| 19 | { | 19 | { |
| 20 | struct qstr qstr; | 20 | struct qstr qstr; |
| 21 | |||
| 22 | if (!compare) | ||
| 23 | return 1; | ||
| 24 | |||
| 25 | /* check special "." and ".." files */ | ||
| 26 | if (dlen == 1) { | ||
| 27 | /* "." */ | ||
| 28 | if (compare[0] == 0) { | ||
| 29 | if (!dentry->d_name.len) | ||
| 30 | return 0; | ||
| 31 | compare = "."; | ||
| 32 | } else if (compare[0] == 1) { | ||
| 33 | compare = ".."; | ||
| 34 | dlen = 2; | ||
| 35 | } | ||
| 36 | } | ||
| 37 | |||
| 38 | qstr.name = compare; | 21 | qstr.name = compare; |
| 39 | qstr.len = dlen; | 22 | qstr.len = dlen; |
| 23 | if (likely(!dentry->d_op)) | ||
| 24 | return dentry->d_name.len != dlen || memcmp(dentry->d_name.name, compare, dlen); | ||
| 40 | return dentry->d_op->d_compare(NULL, NULL, dentry->d_name.len, dentry->d_name.name, &qstr); | 25 | return dentry->d_op->d_compare(NULL, NULL, dentry->d_name.len, dentry->d_name.name, &qstr); |
| 41 | } | 26 | } |
| 42 | |||
