diff options
Diffstat (limited to 'fs/xfs')
| -rw-r--r-- | fs/xfs/linux-2.6/xfs_sync.c | 6 | ||||
| -rw-r--r-- | fs/xfs/xfs_dfrag.c | 10 | ||||
| -rw-r--r-- | fs/xfs/xfs_log_recover.c | 31 |
3 files changed, 31 insertions, 16 deletions
diff --git a/fs/xfs/linux-2.6/xfs_sync.c b/fs/xfs/linux-2.6/xfs_sync.c index 2ed035354c26..a608e72fa405 100644 --- a/fs/xfs/linux-2.6/xfs_sync.c +++ b/fs/xfs/linux-2.6/xfs_sync.c | |||
| @@ -371,7 +371,11 @@ xfs_quiesce_attr( | |||
| 371 | /* flush inodes and push all remaining buffers out to disk */ | 371 | /* flush inodes and push all remaining buffers out to disk */ |
| 372 | xfs_quiesce_fs(mp); | 372 | xfs_quiesce_fs(mp); |
| 373 | 373 | ||
| 374 | ASSERT_ALWAYS(atomic_read(&mp->m_active_trans) == 0); | 374 | /* |
| 375 | * Just warn here till VFS can correctly support | ||
| 376 | * read-only remount without racing. | ||
| 377 | */ | ||
| 378 | WARN_ON(atomic_read(&mp->m_active_trans) != 0); | ||
| 375 | 379 | ||
| 376 | /* Push the superblock and write an unmount record */ | 380 | /* Push the superblock and write an unmount record */ |
| 377 | error = xfs_log_sbcount(mp, 1); | 381 | error = xfs_log_sbcount(mp, 1); |
diff --git a/fs/xfs/xfs_dfrag.c b/fs/xfs/xfs_dfrag.c index b4c1ee713492..f8278cfcc1d3 100644 --- a/fs/xfs/xfs_dfrag.c +++ b/fs/xfs/xfs_dfrag.c | |||
| @@ -55,17 +55,11 @@ xfs_swapext( | |||
| 55 | struct file *file, *target_file; | 55 | struct file *file, *target_file; |
| 56 | int error = 0; | 56 | int error = 0; |
| 57 | 57 | ||
| 58 | sxp = kmem_alloc(sizeof(xfs_swapext_t), KM_MAYFAIL); | ||
| 59 | if (!sxp) { | ||
| 60 | error = XFS_ERROR(ENOMEM); | ||
| 61 | goto out; | ||
| 62 | } | ||
| 63 | |||
| 64 | /* Pull information for the target fd */ | 58 | /* Pull information for the target fd */ |
| 65 | file = fget((int)sxp->sx_fdtarget); | 59 | file = fget((int)sxp->sx_fdtarget); |
| 66 | if (!file) { | 60 | if (!file) { |
| 67 | error = XFS_ERROR(EINVAL); | 61 | error = XFS_ERROR(EINVAL); |
| 68 | goto out_free_sxp; | 62 | goto out; |
| 69 | } | 63 | } |
| 70 | 64 | ||
| 71 | if (!(file->f_mode & FMODE_WRITE) || (file->f_flags & O_APPEND)) { | 65 | if (!(file->f_mode & FMODE_WRITE) || (file->f_flags & O_APPEND)) { |
| @@ -109,8 +103,6 @@ xfs_swapext( | |||
| 109 | fput(target_file); | 103 | fput(target_file); |
| 110 | out_put_file: | 104 | out_put_file: |
| 111 | fput(file); | 105 | fput(file); |
| 112 | out_free_sxp: | ||
| 113 | kmem_free(sxp); | ||
| 114 | out: | 106 | out: |
| 115 | return error; | 107 | return error; |
| 116 | } | 108 | } |
diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index 35cca98bd94c..b1047de2fffd 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c | |||
| @@ -70,16 +70,21 @@ STATIC void xlog_recover_check_summary(xlog_t *); | |||
| 70 | xfs_buf_t * | 70 | xfs_buf_t * |
| 71 | xlog_get_bp( | 71 | xlog_get_bp( |
| 72 | xlog_t *log, | 72 | xlog_t *log, |
| 73 | int num_bblks) | 73 | int nbblks) |
| 74 | { | 74 | { |
| 75 | ASSERT(num_bblks > 0); | 75 | if (nbblks <= 0 || nbblks > log->l_logBBsize) { |
| 76 | xlog_warn("XFS: Invalid block length (0x%x) given for buffer", nbblks); | ||
| 77 | XFS_ERROR_REPORT("xlog_get_bp(1)", | ||
| 78 | XFS_ERRLEVEL_HIGH, log->l_mp); | ||
| 79 | return NULL; | ||
| 80 | } | ||
| 76 | 81 | ||
| 77 | if (log->l_sectbb_log) { | 82 | if (log->l_sectbb_log) { |
| 78 | if (num_bblks > 1) | 83 | if (nbblks > 1) |
| 79 | num_bblks += XLOG_SECTOR_ROUNDUP_BBCOUNT(log, 1); | 84 | nbblks += XLOG_SECTOR_ROUNDUP_BBCOUNT(log, 1); |
| 80 | num_bblks = XLOG_SECTOR_ROUNDUP_BBCOUNT(log, num_bblks); | 85 | nbblks = XLOG_SECTOR_ROUNDUP_BBCOUNT(log, nbblks); |
| 81 | } | 86 | } |
| 82 | return xfs_buf_get_noaddr(BBTOB(num_bblks), log->l_mp->m_logdev_targp); | 87 | return xfs_buf_get_noaddr(BBTOB(nbblks), log->l_mp->m_logdev_targp); |
| 83 | } | 88 | } |
| 84 | 89 | ||
| 85 | void | 90 | void |
| @@ -102,6 +107,13 @@ xlog_bread( | |||
| 102 | { | 107 | { |
| 103 | int error; | 108 | int error; |
| 104 | 109 | ||
| 110 | if (nbblks <= 0 || nbblks > log->l_logBBsize) { | ||
| 111 | xlog_warn("XFS: Invalid block length (0x%x) given for buffer", nbblks); | ||
| 112 | XFS_ERROR_REPORT("xlog_bread(1)", | ||
| 113 | XFS_ERRLEVEL_HIGH, log->l_mp); | ||
| 114 | return EFSCORRUPTED; | ||
| 115 | } | ||
| 116 | |||
| 105 | if (log->l_sectbb_log) { | 117 | if (log->l_sectbb_log) { |
| 106 | blk_no = XLOG_SECTOR_ROUNDDOWN_BLKNO(log, blk_no); | 118 | blk_no = XLOG_SECTOR_ROUNDDOWN_BLKNO(log, blk_no); |
| 107 | nbblks = XLOG_SECTOR_ROUNDUP_BBCOUNT(log, nbblks); | 119 | nbblks = XLOG_SECTOR_ROUNDUP_BBCOUNT(log, nbblks); |
| @@ -139,6 +151,13 @@ xlog_bwrite( | |||
| 139 | { | 151 | { |
| 140 | int error; | 152 | int error; |
| 141 | 153 | ||
| 154 | if (nbblks <= 0 || nbblks > log->l_logBBsize) { | ||
| 155 | xlog_warn("XFS: Invalid block length (0x%x) given for buffer", nbblks); | ||
| 156 | XFS_ERROR_REPORT("xlog_bwrite(1)", | ||
| 157 | XFS_ERRLEVEL_HIGH, log->l_mp); | ||
| 158 | return EFSCORRUPTED; | ||
| 159 | } | ||
| 160 | |||
| 142 | if (log->l_sectbb_log) { | 161 | if (log->l_sectbb_log) { |
| 143 | blk_no = XLOG_SECTOR_ROUNDDOWN_BLKNO(log, blk_no); | 162 | blk_no = XLOG_SECTOR_ROUNDDOWN_BLKNO(log, blk_no); |
| 144 | nbblks = XLOG_SECTOR_ROUNDUP_BBCOUNT(log, nbblks); | 163 | nbblks = XLOG_SECTOR_ROUNDUP_BBCOUNT(log, nbblks); |
