diff options
Diffstat (limited to 'fs')
-rw-r--r-- | fs/adfs/super.c | 16 | ||||
-rw-r--r-- | fs/affs/super.c | 4 | ||||
-rw-r--r-- | fs/befs/linuxvfs.c | 3 | ||||
-rw-r--r-- | fs/binfmt_elf_fdpic.c | 25 | ||||
-rw-r--r-- | fs/buffer.c | 6 | ||||
-rw-r--r-- | fs/compat.c | 89 | ||||
-rw-r--r-- | fs/cramfs/inode.c | 39 | ||||
-rw-r--r-- | fs/cramfs/uncompress.c | 2 | ||||
-rw-r--r-- | fs/drop_caches.c | 2 | ||||
-rw-r--r-- | fs/efs/super.c | 20 | ||||
-rw-r--r-- | fs/ext3/dir.c | 2 | ||||
-rw-r--r-- | fs/ext3/file.c | 2 | ||||
-rw-r--r-- | fs/ext3/inode.c | 139 | ||||
-rw-r--r-- | fs/ext3/ioctl.c | 59 | ||||
-rw-r--r-- | fs/ext3/namei.c | 29 | ||||
-rw-r--r-- | fs/fat/inode.c | 6 | ||||
-rw-r--r-- | fs/fs-writeback.c | 29 | ||||
-rw-r--r-- | fs/hfs/super.c | 3 | ||||
-rw-r--r-- | fs/hfsplus/super.c | 3 | ||||
-rw-r--r-- | fs/hpfs/super.c | 3 | ||||
-rw-r--r-- | fs/hppfs/hppfs.c | 7 | ||||
-rw-r--r-- | fs/isofs/inode.c | 3 | ||||
-rw-r--r-- | fs/jbd/journal.c | 34 | ||||
-rw-r--r-- | fs/minix/inode.c | 11 | ||||
-rw-r--r-- | fs/omfs/inode.c | 5 | ||||
-rw-r--r-- | fs/proc/meminfo.c | 2 | ||||
-rw-r--r-- | fs/proc/task_nommu.c | 4 | ||||
-rw-r--r-- | fs/qnx4/inode.c | 3 | ||||
-rw-r--r-- | fs/quota/dquot.c | 2 | ||||
-rw-r--r-- | fs/read_write.c | 50 | ||||
-rw-r--r-- | fs/reiserfs/Kconfig | 1 | ||||
-rw-r--r-- | fs/reiserfs/super.c | 5 | ||||
-rw-r--r-- | fs/squashfs/super.c | 3 | ||||
-rw-r--r-- | fs/sysv/inode.c | 3 | ||||
-rw-r--r-- | fs/ufs/super.c | 3 |
35 files changed, 426 insertions, 191 deletions
diff --git a/fs/adfs/super.c b/fs/adfs/super.c index 7f83a46f2b7e..dd9becca4241 100644 --- a/fs/adfs/super.c +++ b/fs/adfs/super.c | |||
@@ -219,16 +219,20 @@ static int adfs_remount(struct super_block *sb, int *flags, char *data) | |||
219 | 219 | ||
220 | static int adfs_statfs(struct dentry *dentry, struct kstatfs *buf) | 220 | static int adfs_statfs(struct dentry *dentry, struct kstatfs *buf) |
221 | { | 221 | { |
222 | struct adfs_sb_info *asb = ADFS_SB(dentry->d_sb); | 222 | struct super_block *sb = dentry->d_sb; |
223 | struct adfs_sb_info *sbi = ADFS_SB(sb); | ||
224 | u64 id = huge_encode_dev(sb->s_bdev->bd_dev); | ||
223 | 225 | ||
224 | buf->f_type = ADFS_SUPER_MAGIC; | 226 | buf->f_type = ADFS_SUPER_MAGIC; |
225 | buf->f_namelen = asb->s_namelen; | 227 | buf->f_namelen = sbi->s_namelen; |
226 | buf->f_bsize = dentry->d_sb->s_blocksize; | 228 | buf->f_bsize = sb->s_blocksize; |
227 | buf->f_blocks = asb->s_size; | 229 | buf->f_blocks = sbi->s_size; |
228 | buf->f_files = asb->s_ids_per_zone * asb->s_map_size; | 230 | buf->f_files = sbi->s_ids_per_zone * sbi->s_map_size; |
229 | buf->f_bavail = | 231 | buf->f_bavail = |
230 | buf->f_bfree = adfs_map_free(dentry->d_sb); | 232 | buf->f_bfree = adfs_map_free(sb); |
231 | buf->f_ffree = (long)(buf->f_bfree * buf->f_files) / (long)buf->f_blocks; | 233 | buf->f_ffree = (long)(buf->f_bfree * buf->f_files) / (long)buf->f_blocks; |
234 | buf->f_fsid.val[0] = (u32)id; | ||
235 | buf->f_fsid.val[1] = (u32)(id >> 32); | ||
232 | 236 | ||
233 | return 0; | 237 | return 0; |
234 | } | 238 | } |
diff --git a/fs/affs/super.c b/fs/affs/super.c index a19d64b582aa..5ce695e707fe 100644 --- a/fs/affs/super.c +++ b/fs/affs/super.c | |||
@@ -533,6 +533,7 @@ affs_statfs(struct dentry *dentry, struct kstatfs *buf) | |||
533 | { | 533 | { |
534 | struct super_block *sb = dentry->d_sb; | 534 | struct super_block *sb = dentry->d_sb; |
535 | int free; | 535 | int free; |
536 | u64 id = huge_encode_dev(sb->s_bdev->bd_dev); | ||
536 | 537 | ||
537 | pr_debug("AFFS: statfs() partsize=%d, reserved=%d\n",AFFS_SB(sb)->s_partition_size, | 538 | pr_debug("AFFS: statfs() partsize=%d, reserved=%d\n",AFFS_SB(sb)->s_partition_size, |
538 | AFFS_SB(sb)->s_reserved); | 539 | AFFS_SB(sb)->s_reserved); |
@@ -543,6 +544,9 @@ affs_statfs(struct dentry *dentry, struct kstatfs *buf) | |||
543 | buf->f_blocks = AFFS_SB(sb)->s_partition_size - AFFS_SB(sb)->s_reserved; | 544 | buf->f_blocks = AFFS_SB(sb)->s_partition_size - AFFS_SB(sb)->s_reserved; |
544 | buf->f_bfree = free; | 545 | buf->f_bfree = free; |
545 | buf->f_bavail = free; | 546 | buf->f_bavail = free; |
547 | buf->f_fsid.val[0] = (u32)id; | ||
548 | buf->f_fsid.val[1] = (u32)(id >> 32); | ||
549 | buf->f_namelen = 30; | ||
546 | return 0; | 550 | return 0; |
547 | } | 551 | } |
548 | 552 | ||
diff --git a/fs/befs/linuxvfs.c b/fs/befs/linuxvfs.c index d06cb023ad02..76afd0d6b86c 100644 --- a/fs/befs/linuxvfs.c +++ b/fs/befs/linuxvfs.c | |||
@@ -900,6 +900,7 @@ static int | |||
900 | befs_statfs(struct dentry *dentry, struct kstatfs *buf) | 900 | befs_statfs(struct dentry *dentry, struct kstatfs *buf) |
901 | { | 901 | { |
902 | struct super_block *sb = dentry->d_sb; | 902 | struct super_block *sb = dentry->d_sb; |
903 | u64 id = huge_encode_dev(sb->s_bdev->bd_dev); | ||
903 | 904 | ||
904 | befs_debug(sb, "---> befs_statfs()"); | 905 | befs_debug(sb, "---> befs_statfs()"); |
905 | 906 | ||
@@ -910,6 +911,8 @@ befs_statfs(struct dentry *dentry, struct kstatfs *buf) | |||
910 | buf->f_bavail = buf->f_bfree; | 911 | buf->f_bavail = buf->f_bfree; |
911 | buf->f_files = 0; /* UNKNOWN */ | 912 | buf->f_files = 0; /* UNKNOWN */ |
912 | buf->f_ffree = 0; /* UNKNOWN */ | 913 | buf->f_ffree = 0; /* UNKNOWN */ |
914 | buf->f_fsid.val[0] = (u32)id; | ||
915 | buf->f_fsid.val[1] = (u32)(id >> 32); | ||
913 | buf->f_namelen = BEFS_NAME_LEN; | 916 | buf->f_namelen = BEFS_NAME_LEN; |
914 | 917 | ||
915 | befs_debug(sb, "<--- befs_statfs()"); | 918 | befs_debug(sb, "<--- befs_statfs()"); |
diff --git a/fs/binfmt_elf_fdpic.c b/fs/binfmt_elf_fdpic.c index f3e72c5c19f5..70cfc4b84ae0 100644 --- a/fs/binfmt_elf_fdpic.c +++ b/fs/binfmt_elf_fdpic.c | |||
@@ -972,9 +972,12 @@ static int elf_fdpic_map_file_constdisp_on_uclinux( | |||
972 | params->elfhdr_addr = seg->addr; | 972 | params->elfhdr_addr = seg->addr; |
973 | 973 | ||
974 | /* clear any space allocated but not loaded */ | 974 | /* clear any space allocated but not loaded */ |
975 | if (phdr->p_filesz < phdr->p_memsz) | 975 | if (phdr->p_filesz < phdr->p_memsz) { |
976 | clear_user((void *) (seg->addr + phdr->p_filesz), | 976 | ret = clear_user((void *) (seg->addr + phdr->p_filesz), |
977 | phdr->p_memsz - phdr->p_filesz); | 977 | phdr->p_memsz - phdr->p_filesz); |
978 | if (ret) | ||
979 | return ret; | ||
980 | } | ||
978 | 981 | ||
979 | if (mm) { | 982 | if (mm) { |
980 | if (phdr->p_flags & PF_X) { | 983 | if (phdr->p_flags & PF_X) { |
@@ -1014,7 +1017,7 @@ static int elf_fdpic_map_file_by_direct_mmap(struct elf_fdpic_params *params, | |||
1014 | struct elf32_fdpic_loadseg *seg; | 1017 | struct elf32_fdpic_loadseg *seg; |
1015 | struct elf32_phdr *phdr; | 1018 | struct elf32_phdr *phdr; |
1016 | unsigned long load_addr, delta_vaddr; | 1019 | unsigned long load_addr, delta_vaddr; |
1017 | int loop, dvset; | 1020 | int loop, dvset, ret; |
1018 | 1021 | ||
1019 | load_addr = params->load_addr; | 1022 | load_addr = params->load_addr; |
1020 | delta_vaddr = 0; | 1023 | delta_vaddr = 0; |
@@ -1114,7 +1117,9 @@ static int elf_fdpic_map_file_by_direct_mmap(struct elf_fdpic_params *params, | |||
1114 | * PT_LOAD */ | 1117 | * PT_LOAD */ |
1115 | if (prot & PROT_WRITE && disp > 0) { | 1118 | if (prot & PROT_WRITE && disp > 0) { |
1116 | kdebug("clear[%d] ad=%lx sz=%lx", loop, maddr, disp); | 1119 | kdebug("clear[%d] ad=%lx sz=%lx", loop, maddr, disp); |
1117 | clear_user((void __user *) maddr, disp); | 1120 | ret = clear_user((void __user *) maddr, disp); |
1121 | if (ret) | ||
1122 | return ret; | ||
1118 | maddr += disp; | 1123 | maddr += disp; |
1119 | } | 1124 | } |
1120 | 1125 | ||
@@ -1149,15 +1154,19 @@ static int elf_fdpic_map_file_by_direct_mmap(struct elf_fdpic_params *params, | |||
1149 | if (prot & PROT_WRITE && excess1 > 0) { | 1154 | if (prot & PROT_WRITE && excess1 > 0) { |
1150 | kdebug("clear[%d] ad=%lx sz=%lx", | 1155 | kdebug("clear[%d] ad=%lx sz=%lx", |
1151 | loop, maddr + phdr->p_filesz, excess1); | 1156 | loop, maddr + phdr->p_filesz, excess1); |
1152 | clear_user((void __user *) maddr + phdr->p_filesz, | 1157 | ret = clear_user((void __user *) maddr + phdr->p_filesz, |
1153 | excess1); | 1158 | excess1); |
1159 | if (ret) | ||
1160 | return ret; | ||
1154 | } | 1161 | } |
1155 | 1162 | ||
1156 | #else | 1163 | #else |
1157 | if (excess > 0) { | 1164 | if (excess > 0) { |
1158 | kdebug("clear[%d] ad=%lx sz=%lx", | 1165 | kdebug("clear[%d] ad=%lx sz=%lx", |
1159 | loop, maddr + phdr->p_filesz, excess); | 1166 | loop, maddr + phdr->p_filesz, excess); |
1160 | clear_user((void *) maddr + phdr->p_filesz, excess); | 1167 | ret = clear_user((void *) maddr + phdr->p_filesz, excess); |
1168 | if (ret) | ||
1169 | return ret; | ||
1161 | } | 1170 | } |
1162 | #endif | 1171 | #endif |
1163 | 1172 | ||
diff --git a/fs/buffer.c b/fs/buffer.c index f5f8b15a6e40..2963858f0f31 100644 --- a/fs/buffer.c +++ b/fs/buffer.c | |||
@@ -199,13 +199,13 @@ __find_get_block_slow(struct block_device *bdev, sector_t block) | |||
199 | head = page_buffers(page); | 199 | head = page_buffers(page); |
200 | bh = head; | 200 | bh = head; |
201 | do { | 201 | do { |
202 | if (bh->b_blocknr == block) { | 202 | if (!buffer_mapped(bh)) |
203 | all_mapped = 0; | ||
204 | else if (bh->b_blocknr == block) { | ||
203 | ret = bh; | 205 | ret = bh; |
204 | get_bh(bh); | 206 | get_bh(bh); |
205 | goto out_unlock; | 207 | goto out_unlock; |
206 | } | 208 | } |
207 | if (!buffer_mapped(bh)) | ||
208 | all_mapped = 0; | ||
209 | bh = bh->b_this_page; | 209 | bh = bh->b_this_page; |
210 | } while (bh != head); | 210 | } while (bh != head); |
211 | 211 | ||
diff --git a/fs/compat.c b/fs/compat.c index 55efdfebdf5a..440a019256dd 100644 --- a/fs/compat.c +++ b/fs/compat.c | |||
@@ -1195,16 +1195,12 @@ out: | |||
1195 | return ret; | 1195 | return ret; |
1196 | } | 1196 | } |
1197 | 1197 | ||
1198 | asmlinkage ssize_t | 1198 | static size_t compat_readv(struct file *file, |
1199 | compat_sys_readv(unsigned long fd, const struct compat_iovec __user *vec, unsigned long vlen) | 1199 | const struct compat_iovec __user *vec, |
1200 | unsigned long vlen, loff_t *pos) | ||
1200 | { | 1201 | { |
1201 | struct file *file; | ||
1202 | ssize_t ret = -EBADF; | 1202 | ssize_t ret = -EBADF; |
1203 | 1203 | ||
1204 | file = fget(fd); | ||
1205 | if (!file) | ||
1206 | return -EBADF; | ||
1207 | |||
1208 | if (!(file->f_mode & FMODE_READ)) | 1204 | if (!(file->f_mode & FMODE_READ)) |
1209 | goto out; | 1205 | goto out; |
1210 | 1206 | ||
@@ -1212,25 +1208,56 @@ compat_sys_readv(unsigned long fd, const struct compat_iovec __user *vec, unsign | |||
1212 | if (!file->f_op || (!file->f_op->aio_read && !file->f_op->read)) | 1208 | if (!file->f_op || (!file->f_op->aio_read && !file->f_op->read)) |
1213 | goto out; | 1209 | goto out; |
1214 | 1210 | ||
1215 | ret = compat_do_readv_writev(READ, file, vec, vlen, &file->f_pos); | 1211 | ret = compat_do_readv_writev(READ, file, vec, vlen, pos); |
1216 | 1212 | ||
1217 | out: | 1213 | out: |
1218 | if (ret > 0) | 1214 | if (ret > 0) |
1219 | add_rchar(current, ret); | 1215 | add_rchar(current, ret); |
1220 | inc_syscr(current); | 1216 | inc_syscr(current); |
1221 | fput(file); | ||
1222 | return ret; | 1217 | return ret; |
1223 | } | 1218 | } |
1224 | 1219 | ||
1225 | asmlinkage ssize_t | 1220 | asmlinkage ssize_t |
1226 | compat_sys_writev(unsigned long fd, const struct compat_iovec __user *vec, unsigned long vlen) | 1221 | compat_sys_readv(unsigned long fd, const struct compat_iovec __user *vec, |
1222 | unsigned long vlen) | ||
1227 | { | 1223 | { |
1228 | struct file *file; | 1224 | struct file *file; |
1229 | ssize_t ret = -EBADF; | 1225 | int fput_needed; |
1226 | ssize_t ret; | ||
1230 | 1227 | ||
1231 | file = fget(fd); | 1228 | file = fget_light(fd, &fput_needed); |
1232 | if (!file) | 1229 | if (!file) |
1233 | return -EBADF; | 1230 | return -EBADF; |
1231 | ret = compat_readv(file, vec, vlen, &file->f_pos); | ||
1232 | fput_light(file, fput_needed); | ||
1233 | return ret; | ||
1234 | } | ||
1235 | |||
1236 | asmlinkage ssize_t | ||
1237 | compat_sys_preadv(unsigned long fd, const struct compat_iovec __user *vec, | ||
1238 | unsigned long vlen, u32 pos_high, u32 pos_low) | ||
1239 | { | ||
1240 | loff_t pos = ((loff_t)pos_high << 32) | pos_low; | ||
1241 | struct file *file; | ||
1242 | int fput_needed; | ||
1243 | ssize_t ret; | ||
1244 | |||
1245 | if (pos < 0) | ||
1246 | return -EINVAL; | ||
1247 | file = fget_light(fd, &fput_needed); | ||
1248 | if (!file) | ||
1249 | return -EBADF; | ||
1250 | ret = compat_readv(file, vec, vlen, &pos); | ||
1251 | fput_light(file, fput_needed); | ||
1252 | return ret; | ||
1253 | } | ||
1254 | |||
1255 | static size_t compat_writev(struct file *file, | ||
1256 | const struct compat_iovec __user *vec, | ||
1257 | unsigned long vlen, loff_t *pos) | ||
1258 | { | ||
1259 | ssize_t ret = -EBADF; | ||
1260 | |||
1234 | if (!(file->f_mode & FMODE_WRITE)) | 1261 | if (!(file->f_mode & FMODE_WRITE)) |
1235 | goto out; | 1262 | goto out; |
1236 | 1263 | ||
@@ -1238,13 +1265,47 @@ compat_sys_writev(unsigned long fd, const struct compat_iovec __user *vec, unsig | |||
1238 | if (!file->f_op || (!file->f_op->aio_write && !file->f_op->write)) | 1265 | if (!file->f_op || (!file->f_op->aio_write && !file->f_op->write)) |
1239 | goto out; | 1266 | goto out; |
1240 | 1267 | ||
1241 | ret = compat_do_readv_writev(WRITE, file, vec, vlen, &file->f_pos); | 1268 | ret = compat_do_readv_writev(WRITE, file, vec, vlen, pos); |
1242 | 1269 | ||
1243 | out: | 1270 | out: |
1244 | if (ret > 0) | 1271 | if (ret > 0) |
1245 | add_wchar(current, ret); | 1272 | add_wchar(current, ret); |
1246 | inc_syscw(current); | 1273 | inc_syscw(current); |
1247 | fput(file); | 1274 | return ret; |
1275 | } | ||
1276 | |||
1277 | asmlinkage ssize_t | ||
1278 | compat_sys_writev(unsigned long fd, const struct compat_iovec __user *vec, | ||
1279 | unsigned long vlen) | ||
1280 | { | ||
1281 | struct file *file; | ||
1282 | int fput_needed; | ||
1283 | ssize_t ret; | ||
1284 | |||
1285 | file = fget_light(fd, &fput_needed); | ||
1286 | if (!file) | ||
1287 | return -EBADF; | ||
1288 | ret = compat_writev(file, vec, vlen, &file->f_pos); | ||
1289 | fput_light(file, fput_needed); | ||
1290 | return ret; | ||
1291 | } | ||
1292 | |||
1293 | asmlinkage ssize_t | ||
1294 | compat_sys_pwritev(unsigned long fd, const struct compat_iovec __user *vec, | ||
1295 | unsigned long vlen, u32 pos_high, u32 pos_low) | ||
1296 | { | ||
1297 | loff_t pos = ((loff_t)pos_high << 32) | pos_low; | ||
1298 | struct file *file; | ||
1299 | int fput_needed; | ||
1300 | ssize_t ret; | ||
1301 | |||
1302 | if (pos < 0) | ||
1303 | return -EINVAL; | ||
1304 | file = fget_light(fd, &fput_needed); | ||
1305 | if (!file) | ||
1306 | return -EBADF; | ||
1307 | ret = compat_writev(file, vec, vlen, &pos); | ||
1308 | fput_light(file, fput_needed); | ||
1248 | return ret; | 1309 | return ret; |
1249 | } | 1310 | } |
1250 | 1311 | ||
diff --git a/fs/cramfs/inode.c b/fs/cramfs/inode.c index a07338d2d140..dd3634e4c967 100644 --- a/fs/cramfs/inode.c +++ b/fs/cramfs/inode.c | |||
@@ -318,6 +318,7 @@ out: | |||
318 | static int cramfs_statfs(struct dentry *dentry, struct kstatfs *buf) | 318 | static int cramfs_statfs(struct dentry *dentry, struct kstatfs *buf) |
319 | { | 319 | { |
320 | struct super_block *sb = dentry->d_sb; | 320 | struct super_block *sb = dentry->d_sb; |
321 | u64 id = huge_encode_dev(sb->s_bdev->bd_dev); | ||
321 | 322 | ||
322 | buf->f_type = CRAMFS_MAGIC; | 323 | buf->f_type = CRAMFS_MAGIC; |
323 | buf->f_bsize = PAGE_CACHE_SIZE; | 324 | buf->f_bsize = PAGE_CACHE_SIZE; |
@@ -326,6 +327,8 @@ static int cramfs_statfs(struct dentry *dentry, struct kstatfs *buf) | |||
326 | buf->f_bavail = 0; | 327 | buf->f_bavail = 0; |
327 | buf->f_files = CRAMFS_SB(sb)->files; | 328 | buf->f_files = CRAMFS_SB(sb)->files; |
328 | buf->f_ffree = 0; | 329 | buf->f_ffree = 0; |
330 | buf->f_fsid.val[0] = (u32)id; | ||
331 | buf->f_fsid.val[1] = (u32)(id >> 32); | ||
329 | buf->f_namelen = CRAMFS_MAXPATHLEN; | 332 | buf->f_namelen = CRAMFS_MAXPATHLEN; |
330 | return 0; | 333 | return 0; |
331 | } | 334 | } |
@@ -459,11 +462,14 @@ static struct dentry * cramfs_lookup(struct inode *dir, struct dentry *dentry, s | |||
459 | static int cramfs_readpage(struct file *file, struct page * page) | 462 | static int cramfs_readpage(struct file *file, struct page * page) |
460 | { | 463 | { |
461 | struct inode *inode = page->mapping->host; | 464 | struct inode *inode = page->mapping->host; |
462 | u32 maxblock, bytes_filled; | 465 | u32 maxblock; |
466 | int bytes_filled; | ||
463 | void *pgdata; | 467 | void *pgdata; |
464 | 468 | ||
465 | maxblock = (inode->i_size + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT; | 469 | maxblock = (inode->i_size + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT; |
466 | bytes_filled = 0; | 470 | bytes_filled = 0; |
471 | pgdata = kmap(page); | ||
472 | |||
467 | if (page->index < maxblock) { | 473 | if (page->index < maxblock) { |
468 | struct super_block *sb = inode->i_sb; | 474 | struct super_block *sb = inode->i_sb; |
469 | u32 blkptr_offset = OFFSET(inode) + page->index*4; | 475 | u32 blkptr_offset = OFFSET(inode) + page->index*4; |
@@ -472,30 +478,43 @@ static int cramfs_readpage(struct file *file, struct page * page) | |||
472 | start_offset = OFFSET(inode) + maxblock*4; | 478 | start_offset = OFFSET(inode) + maxblock*4; |
473 | mutex_lock(&read_mutex); | 479 | mutex_lock(&read_mutex); |
474 | if (page->index) | 480 | if (page->index) |
475 | start_offset = *(u32 *) cramfs_read(sb, blkptr_offset-4, 4); | 481 | start_offset = *(u32 *) cramfs_read(sb, blkptr_offset-4, |
476 | compr_len = (*(u32 *) cramfs_read(sb, blkptr_offset, 4) - start_offset); | 482 | 4); |
483 | compr_len = (*(u32 *) cramfs_read(sb, blkptr_offset, 4) - | ||
484 | start_offset); | ||
477 | mutex_unlock(&read_mutex); | 485 | mutex_unlock(&read_mutex); |
478 | pgdata = kmap(page); | 486 | |
479 | if (compr_len == 0) | 487 | if (compr_len == 0) |
480 | ; /* hole */ | 488 | ; /* hole */ |
481 | else if (compr_len > (PAGE_CACHE_SIZE << 1)) | 489 | else if (unlikely(compr_len > (PAGE_CACHE_SIZE << 1))) { |
482 | printk(KERN_ERR "cramfs: bad compressed blocksize %u\n", compr_len); | 490 | pr_err("cramfs: bad compressed blocksize %u\n", |
483 | else { | 491 | compr_len); |
492 | goto err; | ||
493 | } else { | ||
484 | mutex_lock(&read_mutex); | 494 | mutex_lock(&read_mutex); |
485 | bytes_filled = cramfs_uncompress_block(pgdata, | 495 | bytes_filled = cramfs_uncompress_block(pgdata, |
486 | PAGE_CACHE_SIZE, | 496 | PAGE_CACHE_SIZE, |
487 | cramfs_read(sb, start_offset, compr_len), | 497 | cramfs_read(sb, start_offset, compr_len), |
488 | compr_len); | 498 | compr_len); |
489 | mutex_unlock(&read_mutex); | 499 | mutex_unlock(&read_mutex); |
500 | if (unlikely(bytes_filled < 0)) | ||
501 | goto err; | ||
490 | } | 502 | } |
491 | } else | 503 | } |
492 | pgdata = kmap(page); | 504 | |
493 | memset(pgdata + bytes_filled, 0, PAGE_CACHE_SIZE - bytes_filled); | 505 | memset(pgdata + bytes_filled, 0, PAGE_CACHE_SIZE - bytes_filled); |
494 | kunmap(page); | ||
495 | flush_dcache_page(page); | 506 | flush_dcache_page(page); |
507 | kunmap(page); | ||
496 | SetPageUptodate(page); | 508 | SetPageUptodate(page); |
497 | unlock_page(page); | 509 | unlock_page(page); |
498 | return 0; | 510 | return 0; |
511 | |||
512 | err: | ||
513 | kunmap(page); | ||
514 | ClearPageUptodate(page); | ||
515 | SetPageError(page); | ||
516 | unlock_page(page); | ||
517 | return 0; | ||
499 | } | 518 | } |
500 | 519 | ||
501 | static const struct address_space_operations cramfs_aops = { | 520 | static const struct address_space_operations cramfs_aops = { |
diff --git a/fs/cramfs/uncompress.c b/fs/cramfs/uncompress.c index fc3ccb74626f..023329800d2e 100644 --- a/fs/cramfs/uncompress.c +++ b/fs/cramfs/uncompress.c | |||
@@ -50,7 +50,7 @@ int cramfs_uncompress_block(void *dst, int dstlen, void *src, int srclen) | |||
50 | err: | 50 | err: |
51 | printk("Error %d while decompressing!\n", err); | 51 | printk("Error %d while decompressing!\n", err); |
52 | printk("%p(%d)->%p(%d)\n", src, srclen, dst, dstlen); | 52 | printk("%p(%d)->%p(%d)\n", src, srclen, dst, dstlen); |
53 | return 0; | 53 | return -EIO; |
54 | } | 54 | } |
55 | 55 | ||
56 | int cramfs_uncompress_init(void) | 56 | int cramfs_uncompress_init(void) |
diff --git a/fs/drop_caches.c b/fs/drop_caches.c index 44d725f612cf..b6a719a909f8 100644 --- a/fs/drop_caches.c +++ b/fs/drop_caches.c | |||
@@ -18,7 +18,7 @@ static void drop_pagecache_sb(struct super_block *sb) | |||
18 | 18 | ||
19 | spin_lock(&inode_lock); | 19 | spin_lock(&inode_lock); |
20 | list_for_each_entry(inode, &sb->s_inodes, i_sb_list) { | 20 | list_for_each_entry(inode, &sb->s_inodes, i_sb_list) { |
21 | if (inode->i_state & (I_FREEING|I_WILL_FREE|I_NEW)) | 21 | if (inode->i_state & (I_FREEING|I_CLEAR|I_WILL_FREE|I_NEW)) |
22 | continue; | 22 | continue; |
23 | if (inode->i_mapping->nrpages == 0) | 23 | if (inode->i_mapping->nrpages == 0) |
24 | continue; | 24 | continue; |
diff --git a/fs/efs/super.c b/fs/efs/super.c index 73b19cfc91fc..f04942810818 100644 --- a/fs/efs/super.c +++ b/fs/efs/super.c | |||
@@ -329,18 +329,22 @@ out_no_fs: | |||
329 | } | 329 | } |
330 | 330 | ||
331 | static int efs_statfs(struct dentry *dentry, struct kstatfs *buf) { | 331 | static int efs_statfs(struct dentry *dentry, struct kstatfs *buf) { |
332 | struct efs_sb_info *sb = SUPER_INFO(dentry->d_sb); | 332 | struct super_block *sb = dentry->d_sb; |
333 | struct efs_sb_info *sbi = SUPER_INFO(sb); | ||
334 | u64 id = huge_encode_dev(sb->s_bdev->bd_dev); | ||
333 | 335 | ||
334 | buf->f_type = EFS_SUPER_MAGIC; /* efs magic number */ | 336 | buf->f_type = EFS_SUPER_MAGIC; /* efs magic number */ |
335 | buf->f_bsize = EFS_BLOCKSIZE; /* blocksize */ | 337 | buf->f_bsize = EFS_BLOCKSIZE; /* blocksize */ |
336 | buf->f_blocks = sb->total_groups * /* total data blocks */ | 338 | buf->f_blocks = sbi->total_groups * /* total data blocks */ |
337 | (sb->group_size - sb->inode_blocks); | 339 | (sbi->group_size - sbi->inode_blocks); |
338 | buf->f_bfree = sb->data_free; /* free data blocks */ | 340 | buf->f_bfree = sbi->data_free; /* free data blocks */ |
339 | buf->f_bavail = sb->data_free; /* free blocks for non-root */ | 341 | buf->f_bavail = sbi->data_free; /* free blocks for non-root */ |
340 | buf->f_files = sb->total_groups * /* total inodes */ | 342 | buf->f_files = sbi->total_groups * /* total inodes */ |
341 | sb->inode_blocks * | 343 | sbi->inode_blocks * |
342 | (EFS_BLOCKSIZE / sizeof(struct efs_dinode)); | 344 | (EFS_BLOCKSIZE / sizeof(struct efs_dinode)); |
343 | buf->f_ffree = sb->inode_free; /* free inodes */ | 345 | buf->f_ffree = sbi->inode_free; /* free inodes */ |
346 | buf->f_fsid.val[0] = (u32)id; | ||
347 | buf->f_fsid.val[1] = (u32)(id >> 32); | ||
344 | buf->f_namelen = EFS_MAXNAMELEN; /* max filename length */ | 348 | buf->f_namelen = EFS_MAXNAMELEN; /* max filename length */ |
345 | 349 | ||
346 | return 0; | 350 | return 0; |
diff --git a/fs/ext3/dir.c b/fs/ext3/dir.c index 5853f4440af4..3d724a95882f 100644 --- a/fs/ext3/dir.c +++ b/fs/ext3/dir.c | |||
@@ -42,7 +42,7 @@ const struct file_operations ext3_dir_operations = { | |||
42 | .llseek = generic_file_llseek, | 42 | .llseek = generic_file_llseek, |
43 | .read = generic_read_dir, | 43 | .read = generic_read_dir, |
44 | .readdir = ext3_readdir, /* we take BKL. needed?*/ | 44 | .readdir = ext3_readdir, /* we take BKL. needed?*/ |
45 | .ioctl = ext3_ioctl, /* BKL held */ | 45 | .unlocked_ioctl = ext3_ioctl, |
46 | #ifdef CONFIG_COMPAT | 46 | #ifdef CONFIG_COMPAT |
47 | .compat_ioctl = ext3_compat_ioctl, | 47 | .compat_ioctl = ext3_compat_ioctl, |
48 | #endif | 48 | #endif |
diff --git a/fs/ext3/file.c b/fs/ext3/file.c index 3be1e0689c9a..521f8238b2fa 100644 --- a/fs/ext3/file.c +++ b/fs/ext3/file.c | |||
@@ -112,7 +112,7 @@ const struct file_operations ext3_file_operations = { | |||
112 | .write = do_sync_write, | 112 | .write = do_sync_write, |
113 | .aio_read = generic_file_aio_read, | 113 | .aio_read = generic_file_aio_read, |
114 | .aio_write = ext3_file_write, | 114 | .aio_write = ext3_file_write, |
115 | .ioctl = ext3_ioctl, | 115 | .unlocked_ioctl = ext3_ioctl, |
116 | #ifdef CONFIG_COMPAT | 116 | #ifdef CONFIG_COMPAT |
117 | .compat_ioctl = ext3_compat_ioctl, | 117 | .compat_ioctl = ext3_compat_ioctl, |
118 | #endif | 118 | #endif |
diff --git a/fs/ext3/inode.c b/fs/ext3/inode.c index 4a09ff169870..d3ef6566b019 100644 --- a/fs/ext3/inode.c +++ b/fs/ext3/inode.c | |||
@@ -1149,12 +1149,15 @@ static int ext3_write_begin(struct file *file, struct address_space *mapping, | |||
1149 | struct page **pagep, void **fsdata) | 1149 | struct page **pagep, void **fsdata) |
1150 | { | 1150 | { |
1151 | struct inode *inode = mapping->host; | 1151 | struct inode *inode = mapping->host; |
1152 | int ret, needed_blocks = ext3_writepage_trans_blocks(inode); | 1152 | int ret; |
1153 | handle_t *handle; | 1153 | handle_t *handle; |
1154 | int retries = 0; | 1154 | int retries = 0; |
1155 | struct page *page; | 1155 | struct page *page; |
1156 | pgoff_t index; | 1156 | pgoff_t index; |
1157 | unsigned from, to; | 1157 | unsigned from, to; |
1158 | /* Reserve one block more for addition to orphan list in case | ||
1159 | * we allocate blocks but write fails for some reason */ | ||
1160 | int needed_blocks = ext3_writepage_trans_blocks(inode) + 1; | ||
1158 | 1161 | ||
1159 | index = pos >> PAGE_CACHE_SHIFT; | 1162 | index = pos >> PAGE_CACHE_SHIFT; |
1160 | from = pos & (PAGE_CACHE_SIZE - 1); | 1163 | from = pos & (PAGE_CACHE_SIZE - 1); |
@@ -1184,15 +1187,20 @@ retry: | |||
1184 | } | 1187 | } |
1185 | write_begin_failed: | 1188 | write_begin_failed: |
1186 | if (ret) { | 1189 | if (ret) { |
1187 | ext3_journal_stop(handle); | ||
1188 | unlock_page(page); | ||
1189 | page_cache_release(page); | ||
1190 | /* | 1190 | /* |
1191 | * block_write_begin may have instantiated a few blocks | 1191 | * block_write_begin may have instantiated a few blocks |
1192 | * outside i_size. Trim these off again. Don't need | 1192 | * outside i_size. Trim these off again. Don't need |
1193 | * i_size_read because we hold i_mutex. | 1193 | * i_size_read because we hold i_mutex. |
1194 | * | ||
1195 | * Add inode to orphan list in case we crash before truncate | ||
1196 | * finishes. | ||
1194 | */ | 1197 | */ |
1195 | if (pos + len > inode->i_size) | 1198 | if (pos + len > inode->i_size) |
1199 | ext3_orphan_add(handle, inode); | ||
1200 | ext3_journal_stop(handle); | ||
1201 | unlock_page(page); | ||
1202 | page_cache_release(page); | ||
1203 | if (pos + len > inode->i_size) | ||
1196 | vmtruncate(inode, inode->i_size); | 1204 | vmtruncate(inode, inode->i_size); |
1197 | } | 1205 | } |
1198 | if (ret == -ENOSPC && ext3_should_retry_alloc(inode->i_sb, &retries)) | 1206 | if (ret == -ENOSPC && ext3_should_retry_alloc(inode->i_sb, &retries)) |
@@ -1211,6 +1219,18 @@ int ext3_journal_dirty_data(handle_t *handle, struct buffer_head *bh) | |||
1211 | return err; | 1219 | return err; |
1212 | } | 1220 | } |
1213 | 1221 | ||
1222 | /* For ordered writepage and write_end functions */ | ||
1223 | static int journal_dirty_data_fn(handle_t *handle, struct buffer_head *bh) | ||
1224 | { | ||
1225 | /* | ||
1226 | * Write could have mapped the buffer but it didn't copy the data in | ||
1227 | * yet. So avoid filing such buffer into a transaction. | ||
1228 | */ | ||
1229 | if (buffer_mapped(bh) && buffer_uptodate(bh)) | ||
1230 | return ext3_journal_dirty_data(handle, bh); | ||
1231 | return 0; | ||
1232 | } | ||
1233 | |||
1214 | /* For write_end() in data=journal mode */ | 1234 | /* For write_end() in data=journal mode */ |
1215 | static int write_end_fn(handle_t *handle, struct buffer_head *bh) | 1235 | static int write_end_fn(handle_t *handle, struct buffer_head *bh) |
1216 | { | 1236 | { |
@@ -1221,26 +1241,20 @@ static int write_end_fn(handle_t *handle, struct buffer_head *bh) | |||
1221 | } | 1241 | } |
1222 | 1242 | ||
1223 | /* | 1243 | /* |
1224 | * Generic write_end handler for ordered and writeback ext3 journal modes. | 1244 | * This is nasty and subtle: ext3_write_begin() could have allocated blocks |
1225 | * We can't use generic_write_end, because that unlocks the page and we need to | 1245 | * for the whole page but later we failed to copy the data in. Update inode |
1226 | * unlock the page after ext3_journal_stop, but ext3_journal_stop must run | 1246 | * size according to what we managed to copy. The rest is going to be |
1227 | * after block_write_end. | 1247 | * truncated in write_end function. |
1228 | */ | 1248 | */ |
1229 | static int ext3_generic_write_end(struct file *file, | 1249 | static void update_file_sizes(struct inode *inode, loff_t pos, unsigned copied) |
1230 | struct address_space *mapping, | ||
1231 | loff_t pos, unsigned len, unsigned copied, | ||
1232 | struct page *page, void *fsdata) | ||
1233 | { | 1250 | { |
1234 | struct inode *inode = file->f_mapping->host; | 1251 | /* What matters to us is i_disksize. We don't write i_size anywhere */ |
1235 | 1252 | if (pos + copied > inode->i_size) | |
1236 | copied = block_write_end(file, mapping, pos, len, copied, page, fsdata); | 1253 | i_size_write(inode, pos + copied); |
1237 | 1254 | if (pos + copied > EXT3_I(inode)->i_disksize) { | |
1238 | if (pos+copied > inode->i_size) { | 1255 | EXT3_I(inode)->i_disksize = pos + copied; |
1239 | i_size_write(inode, pos+copied); | ||
1240 | mark_inode_dirty(inode); | 1256 | mark_inode_dirty(inode); |
1241 | } | 1257 | } |
1242 | |||
1243 | return copied; | ||
1244 | } | 1258 | } |
1245 | 1259 | ||
1246 | /* | 1260 | /* |
@@ -1260,35 +1274,29 @@ static int ext3_ordered_write_end(struct file *file, | |||
1260 | unsigned from, to; | 1274 | unsigned from, to; |
1261 | int ret = 0, ret2; | 1275 | int ret = 0, ret2; |
1262 | 1276 | ||
1263 | from = pos & (PAGE_CACHE_SIZE - 1); | 1277 | copied = block_write_end(file, mapping, pos, len, copied, page, fsdata); |
1264 | to = from + len; | ||
1265 | 1278 | ||
1279 | from = pos & (PAGE_CACHE_SIZE - 1); | ||
1280 | to = from + copied; | ||
1266 | ret = walk_page_buffers(handle, page_buffers(page), | 1281 | ret = walk_page_buffers(handle, page_buffers(page), |
1267 | from, to, NULL, ext3_journal_dirty_data); | 1282 | from, to, NULL, journal_dirty_data_fn); |
1268 | 1283 | ||
1269 | if (ret == 0) { | 1284 | if (ret == 0) |
1270 | /* | 1285 | update_file_sizes(inode, pos, copied); |
1271 | * generic_write_end() will run mark_inode_dirty() if i_size | 1286 | /* |
1272 | * changes. So let's piggyback the i_disksize mark_inode_dirty | 1287 | * There may be allocated blocks outside of i_size because |
1273 | * into that. | 1288 | * we failed to copy some data. Prepare for truncate. |
1274 | */ | 1289 | */ |
1275 | loff_t new_i_size; | 1290 | if (pos + len > inode->i_size) |
1276 | 1291 | ext3_orphan_add(handle, inode); | |
1277 | new_i_size = pos + copied; | ||
1278 | if (new_i_size > EXT3_I(inode)->i_disksize) | ||
1279 | EXT3_I(inode)->i_disksize = new_i_size; | ||
1280 | ret2 = ext3_generic_write_end(file, mapping, pos, len, copied, | ||
1281 | page, fsdata); | ||
1282 | copied = ret2; | ||
1283 | if (ret2 < 0) | ||
1284 | ret = ret2; | ||
1285 | } | ||
1286 | ret2 = ext3_journal_stop(handle); | 1292 | ret2 = ext3_journal_stop(handle); |
1287 | if (!ret) | 1293 | if (!ret) |
1288 | ret = ret2; | 1294 | ret = ret2; |
1289 | unlock_page(page); | 1295 | unlock_page(page); |
1290 | page_cache_release(page); | 1296 | page_cache_release(page); |
1291 | 1297 | ||
1298 | if (pos + len > inode->i_size) | ||
1299 | vmtruncate(inode, inode->i_size); | ||
1292 | return ret ? ret : copied; | 1300 | return ret ? ret : copied; |
1293 | } | 1301 | } |
1294 | 1302 | ||
@@ -1299,25 +1307,22 @@ static int ext3_writeback_write_end(struct file *file, | |||
1299 | { | 1307 | { |
1300 | handle_t *handle = ext3_journal_current_handle(); | 1308 | handle_t *handle = ext3_journal_current_handle(); |
1301 | struct inode *inode = file->f_mapping->host; | 1309 | struct inode *inode = file->f_mapping->host; |
1302 | int ret = 0, ret2; | 1310 | int ret; |
1303 | loff_t new_i_size; | ||
1304 | |||
1305 | new_i_size = pos + copied; | ||
1306 | if (new_i_size > EXT3_I(inode)->i_disksize) | ||
1307 | EXT3_I(inode)->i_disksize = new_i_size; | ||
1308 | |||
1309 | ret2 = ext3_generic_write_end(file, mapping, pos, len, copied, | ||
1310 | page, fsdata); | ||
1311 | copied = ret2; | ||
1312 | if (ret2 < 0) | ||
1313 | ret = ret2; | ||
1314 | 1311 | ||
1315 | ret2 = ext3_journal_stop(handle); | 1312 | copied = block_write_end(file, mapping, pos, len, copied, page, fsdata); |
1316 | if (!ret) | 1313 | update_file_sizes(inode, pos, copied); |
1317 | ret = ret2; | 1314 | /* |
1315 | * There may be allocated blocks outside of i_size because | ||
1316 | * we failed to copy some data. Prepare for truncate. | ||
1317 | */ | ||
1318 | if (pos + len > inode->i_size) | ||
1319 | ext3_orphan_add(handle, inode); | ||
1320 | ret = ext3_journal_stop(handle); | ||
1318 | unlock_page(page); | 1321 | unlock_page(page); |
1319 | page_cache_release(page); | 1322 | page_cache_release(page); |
1320 | 1323 | ||
1324 | if (pos + len > inode->i_size) | ||
1325 | vmtruncate(inode, inode->i_size); | ||
1321 | return ret ? ret : copied; | 1326 | return ret ? ret : copied; |
1322 | } | 1327 | } |
1323 | 1328 | ||
@@ -1338,15 +1343,23 @@ static int ext3_journalled_write_end(struct file *file, | |||
1338 | if (copied < len) { | 1343 | if (copied < len) { |
1339 | if (!PageUptodate(page)) | 1344 | if (!PageUptodate(page)) |
1340 | copied = 0; | 1345 | copied = 0; |
1341 | page_zero_new_buffers(page, from+copied, to); | 1346 | page_zero_new_buffers(page, from + copied, to); |
1347 | to = from + copied; | ||
1342 | } | 1348 | } |
1343 | 1349 | ||
1344 | ret = walk_page_buffers(handle, page_buffers(page), from, | 1350 | ret = walk_page_buffers(handle, page_buffers(page), from, |
1345 | to, &partial, write_end_fn); | 1351 | to, &partial, write_end_fn); |
1346 | if (!partial) | 1352 | if (!partial) |
1347 | SetPageUptodate(page); | 1353 | SetPageUptodate(page); |
1348 | if (pos+copied > inode->i_size) | 1354 | |
1349 | i_size_write(inode, pos+copied); | 1355 | if (pos + copied > inode->i_size) |
1356 | i_size_write(inode, pos + copied); | ||
1357 | /* | ||
1358 | * There may be allocated blocks outside of i_size because | ||
1359 | * we failed to copy some data. Prepare for truncate. | ||
1360 | */ | ||
1361 | if (pos + len > inode->i_size) | ||
1362 | ext3_orphan_add(handle, inode); | ||
1350 | EXT3_I(inode)->i_state |= EXT3_STATE_JDATA; | 1363 | EXT3_I(inode)->i_state |= EXT3_STATE_JDATA; |
1351 | if (inode->i_size > EXT3_I(inode)->i_disksize) { | 1364 | if (inode->i_size > EXT3_I(inode)->i_disksize) { |
1352 | EXT3_I(inode)->i_disksize = inode->i_size; | 1365 | EXT3_I(inode)->i_disksize = inode->i_size; |
@@ -1361,6 +1374,8 @@ static int ext3_journalled_write_end(struct file *file, | |||
1361 | unlock_page(page); | 1374 | unlock_page(page); |
1362 | page_cache_release(page); | 1375 | page_cache_release(page); |
1363 | 1376 | ||
1377 | if (pos + len > inode->i_size) | ||
1378 | vmtruncate(inode, inode->i_size); | ||
1364 | return ret ? ret : copied; | 1379 | return ret ? ret : copied; |
1365 | } | 1380 | } |
1366 | 1381 | ||
@@ -1428,17 +1443,11 @@ static int bput_one(handle_t *handle, struct buffer_head *bh) | |||
1428 | return 0; | 1443 | return 0; |
1429 | } | 1444 | } |
1430 | 1445 | ||
1431 | static int journal_dirty_data_fn(handle_t *handle, struct buffer_head *bh) | ||
1432 | { | ||
1433 | if (buffer_mapped(bh)) | ||
1434 | return ext3_journal_dirty_data(handle, bh); | ||
1435 | return 0; | ||
1436 | } | ||
1437 | |||
1438 | static int buffer_unmapped(handle_t *handle, struct buffer_head *bh) | 1446 | static int buffer_unmapped(handle_t *handle, struct buffer_head *bh) |
1439 | { | 1447 | { |
1440 | return !buffer_mapped(bh); | 1448 | return !buffer_mapped(bh); |
1441 | } | 1449 | } |
1450 | |||
1442 | /* | 1451 | /* |
1443 | * Note that we always start a transaction even if we're not journalling | 1452 | * Note that we always start a transaction even if we're not journalling |
1444 | * data. This is to preserve ordering: any hole instantiation within | 1453 | * data. This is to preserve ordering: any hole instantiation within |
diff --git a/fs/ext3/ioctl.c b/fs/ext3/ioctl.c index 5e86ce9a86e0..88974814783a 100644 --- a/fs/ext3/ioctl.c +++ b/fs/ext3/ioctl.c | |||
@@ -15,12 +15,11 @@ | |||
15 | #include <linux/mount.h> | 15 | #include <linux/mount.h> |
16 | #include <linux/time.h> | 16 | #include <linux/time.h> |
17 | #include <linux/compat.h> | 17 | #include <linux/compat.h> |
18 | #include <linux/smp_lock.h> | ||
19 | #include <asm/uaccess.h> | 18 | #include <asm/uaccess.h> |
20 | 19 | ||
21 | int ext3_ioctl (struct inode * inode, struct file * filp, unsigned int cmd, | 20 | long ext3_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) |
22 | unsigned long arg) | ||
23 | { | 21 | { |
22 | struct inode *inode = filp->f_dentry->d_inode; | ||
24 | struct ext3_inode_info *ei = EXT3_I(inode); | 23 | struct ext3_inode_info *ei = EXT3_I(inode); |
25 | unsigned int flags; | 24 | unsigned int flags; |
26 | unsigned short rsv_window_size; | 25 | unsigned short rsv_window_size; |
@@ -39,29 +38,25 @@ int ext3_ioctl (struct inode * inode, struct file * filp, unsigned int cmd, | |||
39 | unsigned int oldflags; | 38 | unsigned int oldflags; |
40 | unsigned int jflag; | 39 | unsigned int jflag; |
41 | 40 | ||
41 | if (!is_owner_or_cap(inode)) | ||
42 | return -EACCES; | ||
43 | |||
44 | if (get_user(flags, (int __user *) arg)) | ||
45 | return -EFAULT; | ||
46 | |||
42 | err = mnt_want_write(filp->f_path.mnt); | 47 | err = mnt_want_write(filp->f_path.mnt); |
43 | if (err) | 48 | if (err) |
44 | return err; | 49 | return err; |
45 | 50 | ||
46 | if (!is_owner_or_cap(inode)) { | ||
47 | err = -EACCES; | ||
48 | goto flags_out; | ||
49 | } | ||
50 | |||
51 | if (get_user(flags, (int __user *) arg)) { | ||
52 | err = -EFAULT; | ||
53 | goto flags_out; | ||
54 | } | ||
55 | |||
56 | flags = ext3_mask_flags(inode->i_mode, flags); | 51 | flags = ext3_mask_flags(inode->i_mode, flags); |
57 | 52 | ||
58 | mutex_lock(&inode->i_mutex); | 53 | mutex_lock(&inode->i_mutex); |
54 | |||
59 | /* Is it quota file? Do not allow user to mess with it */ | 55 | /* Is it quota file? Do not allow user to mess with it */ |
60 | if (IS_NOQUOTA(inode)) { | 56 | err = -EPERM; |
61 | mutex_unlock(&inode->i_mutex); | 57 | if (IS_NOQUOTA(inode)) |
62 | err = -EPERM; | ||
63 | goto flags_out; | 58 | goto flags_out; |
64 | } | 59 | |
65 | oldflags = ei->i_flags; | 60 | oldflags = ei->i_flags; |
66 | 61 | ||
67 | /* The JOURNAL_DATA flag is modifiable only by root */ | 62 | /* The JOURNAL_DATA flag is modifiable only by root */ |
@@ -74,11 +69,8 @@ int ext3_ioctl (struct inode * inode, struct file * filp, unsigned int cmd, | |||
74 | * This test looks nicer. Thanks to Pauline Middelink | 69 | * This test looks nicer. Thanks to Pauline Middelink |
75 | */ | 70 | */ |
76 | if ((flags ^ oldflags) & (EXT3_APPEND_FL | EXT3_IMMUTABLE_FL)) { | 71 | if ((flags ^ oldflags) & (EXT3_APPEND_FL | EXT3_IMMUTABLE_FL)) { |
77 | if (!capable(CAP_LINUX_IMMUTABLE)) { | 72 | if (!capable(CAP_LINUX_IMMUTABLE)) |
78 | mutex_unlock(&inode->i_mutex); | ||
79 | err = -EPERM; | ||
80 | goto flags_out; | 73 | goto flags_out; |
81 | } | ||
82 | } | 74 | } |
83 | 75 | ||
84 | /* | 76 | /* |
@@ -86,17 +78,12 @@ int ext3_ioctl (struct inode * inode, struct file * filp, unsigned int cmd, | |||
86 | * the relevant capability. | 78 | * the relevant capability. |
87 | */ | 79 | */ |
88 | if ((jflag ^ oldflags) & (EXT3_JOURNAL_DATA_FL)) { | 80 | if ((jflag ^ oldflags) & (EXT3_JOURNAL_DATA_FL)) { |
89 | if (!capable(CAP_SYS_RESOURCE)) { | 81 | if (!capable(CAP_SYS_RESOURCE)) |
90 | mutex_unlock(&inode->i_mutex); | ||
91 | err = -EPERM; | ||
92 | goto flags_out; | 82 | goto flags_out; |
93 | } | ||
94 | } | 83 | } |
95 | 84 | ||
96 | |||
97 | handle = ext3_journal_start(inode, 1); | 85 | handle = ext3_journal_start(inode, 1); |
98 | if (IS_ERR(handle)) { | 86 | if (IS_ERR(handle)) { |
99 | mutex_unlock(&inode->i_mutex); | ||
100 | err = PTR_ERR(handle); | 87 | err = PTR_ERR(handle); |
101 | goto flags_out; | 88 | goto flags_out; |
102 | } | 89 | } |
@@ -116,15 +103,13 @@ int ext3_ioctl (struct inode * inode, struct file * filp, unsigned int cmd, | |||
116 | err = ext3_mark_iloc_dirty(handle, inode, &iloc); | 103 | err = ext3_mark_iloc_dirty(handle, inode, &iloc); |
117 | flags_err: | 104 | flags_err: |
118 | ext3_journal_stop(handle); | 105 | ext3_journal_stop(handle); |
119 | if (err) { | 106 | if (err) |
120 | mutex_unlock(&inode->i_mutex); | 107 | goto flags_out; |
121 | return err; | ||
122 | } | ||
123 | 108 | ||
124 | if ((jflag ^ oldflags) & (EXT3_JOURNAL_DATA_FL)) | 109 | if ((jflag ^ oldflags) & (EXT3_JOURNAL_DATA_FL)) |
125 | err = ext3_change_inode_journal_flag(inode, jflag); | 110 | err = ext3_change_inode_journal_flag(inode, jflag); |
126 | mutex_unlock(&inode->i_mutex); | ||
127 | flags_out: | 111 | flags_out: |
112 | mutex_unlock(&inode->i_mutex); | ||
128 | mnt_drop_write(filp->f_path.mnt); | 113 | mnt_drop_write(filp->f_path.mnt); |
129 | return err; | 114 | return err; |
130 | } | 115 | } |
@@ -140,6 +125,7 @@ flags_out: | |||
140 | 125 | ||
141 | if (!is_owner_or_cap(inode)) | 126 | if (!is_owner_or_cap(inode)) |
142 | return -EPERM; | 127 | return -EPERM; |
128 | |||
143 | err = mnt_want_write(filp->f_path.mnt); | 129 | err = mnt_want_write(filp->f_path.mnt); |
144 | if (err) | 130 | if (err) |
145 | return err; | 131 | return err; |
@@ -147,6 +133,7 @@ flags_out: | |||
147 | err = -EFAULT; | 133 | err = -EFAULT; |
148 | goto setversion_out; | 134 | goto setversion_out; |
149 | } | 135 | } |
136 | |||
150 | handle = ext3_journal_start(inode, 1); | 137 | handle = ext3_journal_start(inode, 1); |
151 | if (IS_ERR(handle)) { | 138 | if (IS_ERR(handle)) { |
152 | err = PTR_ERR(handle); | 139 | err = PTR_ERR(handle); |
@@ -299,9 +286,6 @@ group_add_out: | |||
299 | #ifdef CONFIG_COMPAT | 286 | #ifdef CONFIG_COMPAT |
300 | long ext3_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg) | 287 | long ext3_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg) |
301 | { | 288 | { |
302 | struct inode *inode = file->f_path.dentry->d_inode; | ||
303 | int ret; | ||
304 | |||
305 | /* These are just misnamed, they actually get/put from/to user an int */ | 289 | /* These are just misnamed, they actually get/put from/to user an int */ |
306 | switch (cmd) { | 290 | switch (cmd) { |
307 | case EXT3_IOC32_GETFLAGS: | 291 | case EXT3_IOC32_GETFLAGS: |
@@ -341,9 +325,6 @@ long ext3_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg) | |||
341 | default: | 325 | default: |
342 | return -ENOIOCTLCMD; | 326 | return -ENOIOCTLCMD; |
343 | } | 327 | } |
344 | lock_kernel(); | 328 | return ext3_ioctl(file, cmd, (unsigned long) compat_ptr(arg)); |
345 | ret = ext3_ioctl(inode, file, cmd, (unsigned long) compat_ptr(arg)); | ||
346 | unlock_kernel(); | ||
347 | return ret; | ||
348 | } | 329 | } |
349 | #endif | 330 | #endif |
diff --git a/fs/ext3/namei.c b/fs/ext3/namei.c index e2fc63cbba8b..6ddaa0a42b24 100644 --- a/fs/ext3/namei.c +++ b/fs/ext3/namei.c | |||
@@ -161,12 +161,12 @@ static struct dx_frame *dx_probe(struct qstr *entry, | |||
161 | struct dx_frame *frame, | 161 | struct dx_frame *frame, |
162 | int *err); | 162 | int *err); |
163 | static void dx_release (struct dx_frame *frames); | 163 | static void dx_release (struct dx_frame *frames); |
164 | static int dx_make_map (struct ext3_dir_entry_2 *de, int size, | 164 | static int dx_make_map(struct ext3_dir_entry_2 *de, unsigned blocksize, |
165 | struct dx_hash_info *hinfo, struct dx_map_entry map[]); | 165 | struct dx_hash_info *hinfo, struct dx_map_entry map[]); |
166 | static void dx_sort_map(struct dx_map_entry *map, unsigned count); | 166 | static void dx_sort_map(struct dx_map_entry *map, unsigned count); |
167 | static struct ext3_dir_entry_2 *dx_move_dirents (char *from, char *to, | 167 | static struct ext3_dir_entry_2 *dx_move_dirents (char *from, char *to, |
168 | struct dx_map_entry *offsets, int count); | 168 | struct dx_map_entry *offsets, int count); |
169 | static struct ext3_dir_entry_2* dx_pack_dirents (char *base, int size); | 169 | static struct ext3_dir_entry_2 *dx_pack_dirents(char *base, unsigned blocksize); |
170 | static void dx_insert_block (struct dx_frame *frame, u32 hash, u32 block); | 170 | static void dx_insert_block (struct dx_frame *frame, u32 hash, u32 block); |
171 | static int ext3_htree_next_block(struct inode *dir, __u32 hash, | 171 | static int ext3_htree_next_block(struct inode *dir, __u32 hash, |
172 | struct dx_frame *frame, | 172 | struct dx_frame *frame, |
@@ -708,14 +708,14 @@ errout: | |||
708 | * Create map of hash values, offsets, and sizes, stored at end of block. | 708 | * Create map of hash values, offsets, and sizes, stored at end of block. |
709 | * Returns number of entries mapped. | 709 | * Returns number of entries mapped. |
710 | */ | 710 | */ |
711 | static int dx_make_map (struct ext3_dir_entry_2 *de, int size, | 711 | static int dx_make_map(struct ext3_dir_entry_2 *de, unsigned blocksize, |
712 | struct dx_hash_info *hinfo, struct dx_map_entry *map_tail) | 712 | struct dx_hash_info *hinfo, struct dx_map_entry *map_tail) |
713 | { | 713 | { |
714 | int count = 0; | 714 | int count = 0; |
715 | char *base = (char *) de; | 715 | char *base = (char *) de; |
716 | struct dx_hash_info h = *hinfo; | 716 | struct dx_hash_info h = *hinfo; |
717 | 717 | ||
718 | while ((char *) de < base + size) | 718 | while ((char *) de < base + blocksize) |
719 | { | 719 | { |
720 | if (de->name_len && de->inode) { | 720 | if (de->name_len && de->inode) { |
721 | ext3fs_dirhash(de->name, de->name_len, &h); | 721 | ext3fs_dirhash(de->name, de->name_len, &h); |
@@ -1047,8 +1047,16 @@ static struct dentry *ext3_lookup(struct inode * dir, struct dentry *dentry, str | |||
1047 | return ERR_PTR(-EIO); | 1047 | return ERR_PTR(-EIO); |
1048 | } | 1048 | } |
1049 | inode = ext3_iget(dir->i_sb, ino); | 1049 | inode = ext3_iget(dir->i_sb, ino); |
1050 | if (IS_ERR(inode)) | 1050 | if (unlikely(IS_ERR(inode))) { |
1051 | return ERR_CAST(inode); | 1051 | if (PTR_ERR(inode) == -ESTALE) { |
1052 | ext3_error(dir->i_sb, __func__, | ||
1053 | "deleted inode referenced: %lu", | ||
1054 | ino); | ||
1055 | return ERR_PTR(-EIO); | ||
1056 | } else { | ||
1057 | return ERR_CAST(inode); | ||
1058 | } | ||
1059 | } | ||
1052 | } | 1060 | } |
1053 | return d_splice_alias(inode, dentry); | 1061 | return d_splice_alias(inode, dentry); |
1054 | } | 1062 | } |
@@ -1120,13 +1128,14 @@ dx_move_dirents(char *from, char *to, struct dx_map_entry *map, int count) | |||
1120 | * Compact each dir entry in the range to the minimal rec_len. | 1128 | * Compact each dir entry in the range to the minimal rec_len. |
1121 | * Returns pointer to last entry in range. | 1129 | * Returns pointer to last entry in range. |
1122 | */ | 1130 | */ |
1123 | static struct ext3_dir_entry_2* dx_pack_dirents(char *base, int size) | 1131 | static struct ext3_dir_entry_2 *dx_pack_dirents(char *base, unsigned blocksize) |
1124 | { | 1132 | { |
1125 | struct ext3_dir_entry_2 *next, *to, *prev, *de = (struct ext3_dir_entry_2 *) base; | 1133 | struct ext3_dir_entry_2 *next, *to, *prev; |
1134 | struct ext3_dir_entry_2 *de = (struct ext3_dir_entry_2 *)base; | ||
1126 | unsigned rec_len = 0; | 1135 | unsigned rec_len = 0; |
1127 | 1136 | ||
1128 | prev = to = de; | 1137 | prev = to = de; |
1129 | while ((char*)de < base + size) { | 1138 | while ((char *)de < base + blocksize) { |
1130 | next = ext3_next_entry(de); | 1139 | next = ext3_next_entry(de); |
1131 | if (de->inode && de->name_len) { | 1140 | if (de->inode && de->name_len) { |
1132 | rec_len = EXT3_DIR_REC_LEN(de->name_len); | 1141 | rec_len = EXT3_DIR_REC_LEN(de->name_len); |
diff --git a/fs/fat/inode.c b/fs/fat/inode.c index de0004fe6e00..2cc952e4c3dc 100644 --- a/fs/fat/inode.c +++ b/fs/fat/inode.c | |||
@@ -523,7 +523,9 @@ static int fat_remount(struct super_block *sb, int *flags, char *data) | |||
523 | 523 | ||
524 | static int fat_statfs(struct dentry *dentry, struct kstatfs *buf) | 524 | static int fat_statfs(struct dentry *dentry, struct kstatfs *buf) |
525 | { | 525 | { |
526 | struct msdos_sb_info *sbi = MSDOS_SB(dentry->d_sb); | 526 | struct super_block *sb = dentry->d_sb; |
527 | struct msdos_sb_info *sbi = MSDOS_SB(sb); | ||
528 | u64 id = huge_encode_dev(sb->s_bdev->bd_dev); | ||
527 | 529 | ||
528 | /* If the count of free cluster is still unknown, counts it here. */ | 530 | /* If the count of free cluster is still unknown, counts it here. */ |
529 | if (sbi->free_clusters == -1 || !sbi->free_clus_valid) { | 531 | if (sbi->free_clusters == -1 || !sbi->free_clus_valid) { |
@@ -537,6 +539,8 @@ static int fat_statfs(struct dentry *dentry, struct kstatfs *buf) | |||
537 | buf->f_blocks = sbi->max_cluster - FAT_START_ENT; | 539 | buf->f_blocks = sbi->max_cluster - FAT_START_ENT; |
538 | buf->f_bfree = sbi->free_clusters; | 540 | buf->f_bfree = sbi->free_clusters; |
539 | buf->f_bavail = sbi->free_clusters; | 541 | buf->f_bavail = sbi->free_clusters; |
542 | buf->f_fsid.val[0] = (u32)id; | ||
543 | buf->f_fsid.val[1] = (u32)(id >> 32); | ||
540 | buf->f_namelen = sbi->options.isvfat ? 260 : 12; | 544 | buf->f_namelen = sbi->options.isvfat ? 260 : 12; |
541 | 545 | ||
542 | return 0; | 546 | return 0; |
diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c index e3fe9918faaf..eed480639902 100644 --- a/fs/fs-writeback.c +++ b/fs/fs-writeback.c | |||
@@ -196,7 +196,7 @@ static void redirty_tail(struct inode *inode) | |||
196 | struct inode *tail_inode; | 196 | struct inode *tail_inode; |
197 | 197 | ||
198 | tail_inode = list_entry(sb->s_dirty.next, struct inode, i_list); | 198 | tail_inode = list_entry(sb->s_dirty.next, struct inode, i_list); |
199 | if (!time_after_eq(inode->dirtied_when, | 199 | if (time_before(inode->dirtied_when, |
200 | tail_inode->dirtied_when)) | 200 | tail_inode->dirtied_when)) |
201 | inode->dirtied_when = jiffies; | 201 | inode->dirtied_when = jiffies; |
202 | } | 202 | } |
@@ -220,6 +220,21 @@ static void inode_sync_complete(struct inode *inode) | |||
220 | wake_up_bit(&inode->i_state, __I_SYNC); | 220 | wake_up_bit(&inode->i_state, __I_SYNC); |
221 | } | 221 | } |
222 | 222 | ||
223 | static bool inode_dirtied_after(struct inode *inode, unsigned long t) | ||
224 | { | ||
225 | bool ret = time_after(inode->dirtied_when, t); | ||
226 | #ifndef CONFIG_64BIT | ||
227 | /* | ||
228 | * For inodes being constantly redirtied, dirtied_when can get stuck. | ||
229 | * It _appears_ to be in the future, but is actually in distant past. | ||
230 | * This test is necessary to prevent such wrapped-around relative times | ||
231 | * from permanently stopping the whole pdflush writeback. | ||
232 | */ | ||
233 | ret = ret && time_before_eq(inode->dirtied_when, jiffies); | ||
234 | #endif | ||
235 | return ret; | ||
236 | } | ||
237 | |||
223 | /* | 238 | /* |
224 | * Move expired dirty inodes from @delaying_queue to @dispatch_queue. | 239 | * Move expired dirty inodes from @delaying_queue to @dispatch_queue. |
225 | */ | 240 | */ |
@@ -231,7 +246,7 @@ static void move_expired_inodes(struct list_head *delaying_queue, | |||
231 | struct inode *inode = list_entry(delaying_queue->prev, | 246 | struct inode *inode = list_entry(delaying_queue->prev, |
232 | struct inode, i_list); | 247 | struct inode, i_list); |
233 | if (older_than_this && | 248 | if (older_than_this && |
234 | time_after(inode->dirtied_when, *older_than_this)) | 249 | inode_dirtied_after(inode, *older_than_this)) |
235 | break; | 250 | break; |
236 | list_move(&inode->i_list, dispatch_queue); | 251 | list_move(&inode->i_list, dispatch_queue); |
237 | } | 252 | } |
@@ -492,8 +507,11 @@ void generic_sync_sb_inodes(struct super_block *sb, | |||
492 | continue; /* blockdev has wrong queue */ | 507 | continue; /* blockdev has wrong queue */ |
493 | } | 508 | } |
494 | 509 | ||
495 | /* Was this inode dirtied after sync_sb_inodes was called? */ | 510 | /* |
496 | if (time_after(inode->dirtied_when, start)) | 511 | * Was this inode dirtied after sync_sb_inodes was called? |
512 | * This keeps sync from extra jobs and livelock. | ||
513 | */ | ||
514 | if (inode_dirtied_after(inode, start)) | ||
497 | break; | 515 | break; |
498 | 516 | ||
499 | /* Is another pdflush already flushing this queue? */ | 517 | /* Is another pdflush already flushing this queue? */ |
@@ -538,7 +556,8 @@ void generic_sync_sb_inodes(struct super_block *sb, | |||
538 | list_for_each_entry(inode, &sb->s_inodes, i_sb_list) { | 556 | list_for_each_entry(inode, &sb->s_inodes, i_sb_list) { |
539 | struct address_space *mapping; | 557 | struct address_space *mapping; |
540 | 558 | ||
541 | if (inode->i_state & (I_FREEING|I_WILL_FREE|I_NEW)) | 559 | if (inode->i_state & |
560 | (I_FREEING|I_CLEAR|I_WILL_FREE|I_NEW)) | ||
542 | continue; | 561 | continue; |
543 | mapping = inode->i_mapping; | 562 | mapping = inode->i_mapping; |
544 | if (mapping->nrpages == 0) | 563 | if (mapping->nrpages == 0) |
diff --git a/fs/hfs/super.c b/fs/hfs/super.c index c8b5acf4b0b7..a36bb749926d 100644 --- a/fs/hfs/super.c +++ b/fs/hfs/super.c | |||
@@ -82,6 +82,7 @@ static void hfs_put_super(struct super_block *sb) | |||
82 | static int hfs_statfs(struct dentry *dentry, struct kstatfs *buf) | 82 | static int hfs_statfs(struct dentry *dentry, struct kstatfs *buf) |
83 | { | 83 | { |
84 | struct super_block *sb = dentry->d_sb; | 84 | struct super_block *sb = dentry->d_sb; |
85 | u64 id = huge_encode_dev(sb->s_bdev->bd_dev); | ||
85 | 86 | ||
86 | buf->f_type = HFS_SUPER_MAGIC; | 87 | buf->f_type = HFS_SUPER_MAGIC; |
87 | buf->f_bsize = sb->s_blocksize; | 88 | buf->f_bsize = sb->s_blocksize; |
@@ -90,6 +91,8 @@ static int hfs_statfs(struct dentry *dentry, struct kstatfs *buf) | |||
90 | buf->f_bavail = buf->f_bfree; | 91 | buf->f_bavail = buf->f_bfree; |
91 | buf->f_files = HFS_SB(sb)->fs_ablocks; | 92 | buf->f_files = HFS_SB(sb)->fs_ablocks; |
92 | buf->f_ffree = HFS_SB(sb)->free_ablocks; | 93 | buf->f_ffree = HFS_SB(sb)->free_ablocks; |
94 | buf->f_fsid.val[0] = (u32)id; | ||
95 | buf->f_fsid.val[1] = (u32)(id >> 32); | ||
93 | buf->f_namelen = HFS_NAMELEN; | 96 | buf->f_namelen = HFS_NAMELEN; |
94 | 97 | ||
95 | return 0; | 98 | return 0; |
diff --git a/fs/hfsplus/super.c b/fs/hfsplus/super.c index eb74531a0a8e..f2a64020f42e 100644 --- a/fs/hfsplus/super.c +++ b/fs/hfsplus/super.c | |||
@@ -223,6 +223,7 @@ static void hfsplus_put_super(struct super_block *sb) | |||
223 | static int hfsplus_statfs(struct dentry *dentry, struct kstatfs *buf) | 223 | static int hfsplus_statfs(struct dentry *dentry, struct kstatfs *buf) |
224 | { | 224 | { |
225 | struct super_block *sb = dentry->d_sb; | 225 | struct super_block *sb = dentry->d_sb; |
226 | u64 id = huge_encode_dev(sb->s_bdev->bd_dev); | ||
226 | 227 | ||
227 | buf->f_type = HFSPLUS_SUPER_MAGIC; | 228 | buf->f_type = HFSPLUS_SUPER_MAGIC; |
228 | buf->f_bsize = sb->s_blocksize; | 229 | buf->f_bsize = sb->s_blocksize; |
@@ -231,6 +232,8 @@ static int hfsplus_statfs(struct dentry *dentry, struct kstatfs *buf) | |||
231 | buf->f_bavail = buf->f_bfree; | 232 | buf->f_bavail = buf->f_bfree; |
232 | buf->f_files = 0xFFFFFFFF; | 233 | buf->f_files = 0xFFFFFFFF; |
233 | buf->f_ffree = 0xFFFFFFFF - HFSPLUS_SB(sb).next_cnid; | 234 | buf->f_ffree = 0xFFFFFFFF - HFSPLUS_SB(sb).next_cnid; |
235 | buf->f_fsid.val[0] = (u32)id; | ||
236 | buf->f_fsid.val[1] = (u32)(id >> 32); | ||
234 | buf->f_namelen = HFSPLUS_MAX_STRLEN; | 237 | buf->f_namelen = HFSPLUS_MAX_STRLEN; |
235 | 238 | ||
236 | return 0; | 239 | return 0; |
diff --git a/fs/hpfs/super.c b/fs/hpfs/super.c index 0d049b8919c4..c40f6e242444 100644 --- a/fs/hpfs/super.c +++ b/fs/hpfs/super.c | |||
@@ -136,6 +136,7 @@ static int hpfs_statfs(struct dentry *dentry, struct kstatfs *buf) | |||
136 | { | 136 | { |
137 | struct super_block *s = dentry->d_sb; | 137 | struct super_block *s = dentry->d_sb; |
138 | struct hpfs_sb_info *sbi = hpfs_sb(s); | 138 | struct hpfs_sb_info *sbi = hpfs_sb(s); |
139 | u64 id = huge_encode_dev(s->s_bdev->bd_dev); | ||
139 | lock_kernel(); | 140 | lock_kernel(); |
140 | 141 | ||
141 | /*if (sbi->sb_n_free == -1) {*/ | 142 | /*if (sbi->sb_n_free == -1) {*/ |
@@ -149,6 +150,8 @@ static int hpfs_statfs(struct dentry *dentry, struct kstatfs *buf) | |||
149 | buf->f_bavail = sbi->sb_n_free; | 150 | buf->f_bavail = sbi->sb_n_free; |
150 | buf->f_files = sbi->sb_dirband_size / 4; | 151 | buf->f_files = sbi->sb_dirband_size / 4; |
151 | buf->f_ffree = sbi->sb_n_free_dnodes; | 152 | buf->f_ffree = sbi->sb_n_free_dnodes; |
153 | buf->f_fsid.val[0] = (u32)id; | ||
154 | buf->f_fsid.val[1] = (u32)(id >> 32); | ||
152 | buf->f_namelen = 254; | 155 | buf->f_namelen = 254; |
153 | 156 | ||
154 | unlock_kernel(); | 157 | unlock_kernel(); |
diff --git a/fs/hppfs/hppfs.c b/fs/hppfs/hppfs.c index b278f7f52024..a5089a6dd67a 100644 --- a/fs/hppfs/hppfs.c +++ b/fs/hppfs/hppfs.c | |||
@@ -280,7 +280,12 @@ static ssize_t hppfs_read(struct file *file, char __user *buf, size_t count, | |||
280 | "errno = %d\n", err); | 280 | "errno = %d\n", err); |
281 | return err; | 281 | return err; |
282 | } | 282 | } |
283 | count = hppfs_read_file(hppfs->host_fd, buf, count); | 283 | err = hppfs_read_file(hppfs->host_fd, buf, count); |
284 | if (err < 0) { | ||
285 | printk(KERN_ERR "hppfs_read: read failed: %d\n", err); | ||
286 | return err; | ||
287 | } | ||
288 | count = err; | ||
284 | if (count > 0) | 289 | if (count > 0) |
285 | *ppos += count; | 290 | *ppos += count; |
286 | } | 291 | } |
diff --git a/fs/isofs/inode.c b/fs/isofs/inode.c index 13d2eddd0692..b4cbe9603c7d 100644 --- a/fs/isofs/inode.c +++ b/fs/isofs/inode.c | |||
@@ -923,6 +923,7 @@ out_freesbi: | |||
923 | static int isofs_statfs (struct dentry *dentry, struct kstatfs *buf) | 923 | static int isofs_statfs (struct dentry *dentry, struct kstatfs *buf) |
924 | { | 924 | { |
925 | struct super_block *sb = dentry->d_sb; | 925 | struct super_block *sb = dentry->d_sb; |
926 | u64 id = huge_encode_dev(sb->s_bdev->bd_dev); | ||
926 | 927 | ||
927 | buf->f_type = ISOFS_SUPER_MAGIC; | 928 | buf->f_type = ISOFS_SUPER_MAGIC; |
928 | buf->f_bsize = sb->s_blocksize; | 929 | buf->f_bsize = sb->s_blocksize; |
@@ -932,6 +933,8 @@ static int isofs_statfs (struct dentry *dentry, struct kstatfs *buf) | |||
932 | buf->f_bavail = 0; | 933 | buf->f_bavail = 0; |
933 | buf->f_files = ISOFS_SB(sb)->s_ninodes; | 934 | buf->f_files = ISOFS_SB(sb)->s_ninodes; |
934 | buf->f_ffree = 0; | 935 | buf->f_ffree = 0; |
936 | buf->f_fsid.val[0] = (u32)id; | ||
937 | buf->f_fsid.val[1] = (u32)(id >> 32); | ||
935 | buf->f_namelen = NAME_MAX; | 938 | buf->f_namelen = NAME_MAX; |
936 | return 0; | 939 | return 0; |
937 | } | 940 | } |
diff --git a/fs/jbd/journal.c b/fs/jbd/journal.c index e79c07812afa..737f7246a4b5 100644 --- a/fs/jbd/journal.c +++ b/fs/jbd/journal.c | |||
@@ -637,6 +637,8 @@ struct journal_head *journal_get_descriptor_buffer(journal_t *journal) | |||
637 | return NULL; | 637 | return NULL; |
638 | 638 | ||
639 | bh = __getblk(journal->j_dev, blocknr, journal->j_blocksize); | 639 | bh = __getblk(journal->j_dev, blocknr, journal->j_blocksize); |
640 | if (!bh) | ||
641 | return NULL; | ||
640 | lock_buffer(bh); | 642 | lock_buffer(bh); |
641 | memset(bh->b_data, 0, journal->j_blocksize); | 643 | memset(bh->b_data, 0, journal->j_blocksize); |
642 | set_buffer_uptodate(bh); | 644 | set_buffer_uptodate(bh); |
@@ -733,9 +735,7 @@ journal_t * journal_init_dev(struct block_device *bdev, | |||
733 | if (!journal->j_wbuf) { | 735 | if (!journal->j_wbuf) { |
734 | printk(KERN_ERR "%s: Cant allocate bhs for commit thread\n", | 736 | printk(KERN_ERR "%s: Cant allocate bhs for commit thread\n", |
735 | __func__); | 737 | __func__); |
736 | kfree(journal); | 738 | goto out_err; |
737 | journal = NULL; | ||
738 | goto out; | ||
739 | } | 739 | } |
740 | journal->j_dev = bdev; | 740 | journal->j_dev = bdev; |
741 | journal->j_fs_dev = fs_dev; | 741 | journal->j_fs_dev = fs_dev; |
@@ -743,11 +743,19 @@ journal_t * journal_init_dev(struct block_device *bdev, | |||
743 | journal->j_maxlen = len; | 743 | journal->j_maxlen = len; |
744 | 744 | ||
745 | bh = __getblk(journal->j_dev, start, journal->j_blocksize); | 745 | bh = __getblk(journal->j_dev, start, journal->j_blocksize); |
746 | J_ASSERT(bh != NULL); | 746 | if (!bh) { |
747 | printk(KERN_ERR | ||
748 | "%s: Cannot get buffer for journal superblock\n", | ||
749 | __func__); | ||
750 | goto out_err; | ||
751 | } | ||
747 | journal->j_sb_buffer = bh; | 752 | journal->j_sb_buffer = bh; |
748 | journal->j_superblock = (journal_superblock_t *)bh->b_data; | 753 | journal->j_superblock = (journal_superblock_t *)bh->b_data; |
749 | out: | 754 | |
750 | return journal; | 755 | return journal; |
756 | out_err: | ||
757 | kfree(journal); | ||
758 | return NULL; | ||
751 | } | 759 | } |
752 | 760 | ||
753 | /** | 761 | /** |
@@ -787,8 +795,7 @@ journal_t * journal_init_inode (struct inode *inode) | |||
787 | if (!journal->j_wbuf) { | 795 | if (!journal->j_wbuf) { |
788 | printk(KERN_ERR "%s: Cant allocate bhs for commit thread\n", | 796 | printk(KERN_ERR "%s: Cant allocate bhs for commit thread\n", |
789 | __func__); | 797 | __func__); |
790 | kfree(journal); | 798 | goto out_err; |
791 | return NULL; | ||
792 | } | 799 | } |
793 | 800 | ||
794 | err = journal_bmap(journal, 0, &blocknr); | 801 | err = journal_bmap(journal, 0, &blocknr); |
@@ -796,16 +803,23 @@ journal_t * journal_init_inode (struct inode *inode) | |||
796 | if (err) { | 803 | if (err) { |
797 | printk(KERN_ERR "%s: Cannnot locate journal superblock\n", | 804 | printk(KERN_ERR "%s: Cannnot locate journal superblock\n", |
798 | __func__); | 805 | __func__); |
799 | kfree(journal); | 806 | goto out_err; |
800 | return NULL; | ||
801 | } | 807 | } |
802 | 808 | ||
803 | bh = __getblk(journal->j_dev, blocknr, journal->j_blocksize); | 809 | bh = __getblk(journal->j_dev, blocknr, journal->j_blocksize); |
804 | J_ASSERT(bh != NULL); | 810 | if (!bh) { |
811 | printk(KERN_ERR | ||
812 | "%s: Cannot get buffer for journal superblock\n", | ||
813 | __func__); | ||
814 | goto out_err; | ||
815 | } | ||
805 | journal->j_sb_buffer = bh; | 816 | journal->j_sb_buffer = bh; |
806 | journal->j_superblock = (journal_superblock_t *)bh->b_data; | 817 | journal->j_superblock = (journal_superblock_t *)bh->b_data; |
807 | 818 | ||
808 | return journal; | 819 | return journal; |
820 | out_err: | ||
821 | kfree(journal); | ||
822 | return NULL; | ||
809 | } | 823 | } |
810 | 824 | ||
811 | /* | 825 | /* |
diff --git a/fs/minix/inode.c b/fs/minix/inode.c index 618865b3128b..daad3c2740db 100644 --- a/fs/minix/inode.c +++ b/fs/minix/inode.c | |||
@@ -321,15 +321,20 @@ out: | |||
321 | 321 | ||
322 | static int minix_statfs(struct dentry *dentry, struct kstatfs *buf) | 322 | static int minix_statfs(struct dentry *dentry, struct kstatfs *buf) |
323 | { | 323 | { |
324 | struct minix_sb_info *sbi = minix_sb(dentry->d_sb); | 324 | struct super_block *sb = dentry->d_sb; |
325 | buf->f_type = dentry->d_sb->s_magic; | 325 | struct minix_sb_info *sbi = minix_sb(sb); |
326 | buf->f_bsize = dentry->d_sb->s_blocksize; | 326 | u64 id = huge_encode_dev(sb->s_bdev->bd_dev); |
327 | buf->f_type = sb->s_magic; | ||
328 | buf->f_bsize = sb->s_blocksize; | ||
327 | buf->f_blocks = (sbi->s_nzones - sbi->s_firstdatazone) << sbi->s_log_zone_size; | 329 | buf->f_blocks = (sbi->s_nzones - sbi->s_firstdatazone) << sbi->s_log_zone_size; |
328 | buf->f_bfree = minix_count_free_blocks(sbi); | 330 | buf->f_bfree = minix_count_free_blocks(sbi); |
329 | buf->f_bavail = buf->f_bfree; | 331 | buf->f_bavail = buf->f_bfree; |
330 | buf->f_files = sbi->s_ninodes; | 332 | buf->f_files = sbi->s_ninodes; |
331 | buf->f_ffree = minix_count_free_inodes(sbi); | 333 | buf->f_ffree = minix_count_free_inodes(sbi); |
332 | buf->f_namelen = sbi->s_namelen; | 334 | buf->f_namelen = sbi->s_namelen; |
335 | buf->f_fsid.val[0] = (u32)id; | ||
336 | buf->f_fsid.val[1] = (u32)(id >> 32); | ||
337 | |||
333 | return 0; | 338 | return 0; |
334 | } | 339 | } |
335 | 340 | ||
diff --git a/fs/omfs/inode.c b/fs/omfs/inode.c index 633e9dc972bb..d79e808fd028 100644 --- a/fs/omfs/inode.c +++ b/fs/omfs/inode.c | |||
@@ -262,14 +262,19 @@ static int omfs_statfs(struct dentry *dentry, struct kstatfs *buf) | |||
262 | { | 262 | { |
263 | struct super_block *s = dentry->d_sb; | 263 | struct super_block *s = dentry->d_sb; |
264 | struct omfs_sb_info *sbi = OMFS_SB(s); | 264 | struct omfs_sb_info *sbi = OMFS_SB(s); |
265 | u64 id = huge_encode_dev(s->s_bdev->bd_dev); | ||
266 | |||
265 | buf->f_type = OMFS_MAGIC; | 267 | buf->f_type = OMFS_MAGIC; |
266 | buf->f_bsize = sbi->s_blocksize; | 268 | buf->f_bsize = sbi->s_blocksize; |
267 | buf->f_blocks = sbi->s_num_blocks; | 269 | buf->f_blocks = sbi->s_num_blocks; |
268 | buf->f_files = sbi->s_num_blocks; | 270 | buf->f_files = sbi->s_num_blocks; |
269 | buf->f_namelen = OMFS_NAMELEN; | 271 | buf->f_namelen = OMFS_NAMELEN; |
272 | buf->f_fsid.val[0] = (u32)id; | ||
273 | buf->f_fsid.val[1] = (u32)(id >> 32); | ||
270 | 274 | ||
271 | buf->f_bfree = buf->f_bavail = buf->f_ffree = | 275 | buf->f_bfree = buf->f_bavail = buf->f_ffree = |
272 | omfs_count_free(s); | 276 | omfs_count_free(s); |
277 | |||
273 | return 0; | 278 | return 0; |
274 | } | 279 | } |
275 | 280 | ||
diff --git a/fs/proc/meminfo.c b/fs/proc/meminfo.c index 43d23948384a..74ea974f5ca6 100644 --- a/fs/proc/meminfo.c +++ b/fs/proc/meminfo.c | |||
@@ -120,7 +120,7 @@ static int meminfo_proc_show(struct seq_file *m, void *v) | |||
120 | K(i.freeram-i.freehigh), | 120 | K(i.freeram-i.freehigh), |
121 | #endif | 121 | #endif |
122 | #ifndef CONFIG_MMU | 122 | #ifndef CONFIG_MMU |
123 | K((unsigned long) atomic_read(&mmap_pages_allocated)), | 123 | K((unsigned long) atomic_long_read(&mmap_pages_allocated)), |
124 | #endif | 124 | #endif |
125 | K(i.totalswap), | 125 | K(i.totalswap), |
126 | K(i.freeswap), | 126 | K(i.freeswap), |
diff --git a/fs/proc/task_nommu.c b/fs/proc/task_nommu.c index 343ea1216bc8..370be0a2c909 100644 --- a/fs/proc/task_nommu.c +++ b/fs/proc/task_nommu.c | |||
@@ -136,14 +136,14 @@ static int nommu_vma_show(struct seq_file *m, struct vm_area_struct *vma) | |||
136 | } | 136 | } |
137 | 137 | ||
138 | seq_printf(m, | 138 | seq_printf(m, |
139 | "%08lx-%08lx %c%c%c%c %08lx %02x:%02x %lu %n", | 139 | "%08lx-%08lx %c%c%c%c %08llx %02x:%02x %lu %n", |
140 | vma->vm_start, | 140 | vma->vm_start, |
141 | vma->vm_end, | 141 | vma->vm_end, |
142 | flags & VM_READ ? 'r' : '-', | 142 | flags & VM_READ ? 'r' : '-', |
143 | flags & VM_WRITE ? 'w' : '-', | 143 | flags & VM_WRITE ? 'w' : '-', |
144 | flags & VM_EXEC ? 'x' : '-', | 144 | flags & VM_EXEC ? 'x' : '-', |
145 | flags & VM_MAYSHARE ? flags & VM_SHARED ? 'S' : 's' : 'p', | 145 | flags & VM_MAYSHARE ? flags & VM_SHARED ? 'S' : 's' : 'p', |
146 | vma->vm_pgoff << PAGE_SHIFT, | 146 | (unsigned long long) vma->vm_pgoff << PAGE_SHIFT, |
147 | MAJOR(dev), MINOR(dev), ino, &len); | 147 | MAJOR(dev), MINOR(dev), ino, &len); |
148 | 148 | ||
149 | if (file) { | 149 | if (file) { |
diff --git a/fs/qnx4/inode.c b/fs/qnx4/inode.c index 2aad1044b84c..fe1f0f31d11c 100644 --- a/fs/qnx4/inode.c +++ b/fs/qnx4/inode.c | |||
@@ -282,6 +282,7 @@ unsigned long qnx4_block_map( struct inode *inode, long iblock ) | |||
282 | static int qnx4_statfs(struct dentry *dentry, struct kstatfs *buf) | 282 | static int qnx4_statfs(struct dentry *dentry, struct kstatfs *buf) |
283 | { | 283 | { |
284 | struct super_block *sb = dentry->d_sb; | 284 | struct super_block *sb = dentry->d_sb; |
285 | u64 id = huge_encode_dev(sb->s_bdev->bd_dev); | ||
285 | 286 | ||
286 | lock_kernel(); | 287 | lock_kernel(); |
287 | 288 | ||
@@ -291,6 +292,8 @@ static int qnx4_statfs(struct dentry *dentry, struct kstatfs *buf) | |||
291 | buf->f_bfree = qnx4_count_free_blocks(sb); | 292 | buf->f_bfree = qnx4_count_free_blocks(sb); |
292 | buf->f_bavail = buf->f_bfree; | 293 | buf->f_bavail = buf->f_bfree; |
293 | buf->f_namelen = QNX4_NAME_MAX; | 294 | buf->f_namelen = QNX4_NAME_MAX; |
295 | buf->f_fsid.val[0] = (u32)id; | ||
296 | buf->f_fsid.val[1] = (u32)(id >> 32); | ||
294 | 297 | ||
295 | unlock_kernel(); | 298 | unlock_kernel(); |
296 | 299 | ||
diff --git a/fs/quota/dquot.c b/fs/quota/dquot.c index 2ca967a5ef77..607c579e5eca 100644 --- a/fs/quota/dquot.c +++ b/fs/quota/dquot.c | |||
@@ -823,7 +823,7 @@ static void add_dquot_ref(struct super_block *sb, int type) | |||
823 | 823 | ||
824 | spin_lock(&inode_lock); | 824 | spin_lock(&inode_lock); |
825 | list_for_each_entry(inode, &sb->s_inodes, i_sb_list) { | 825 | list_for_each_entry(inode, &sb->s_inodes, i_sb_list) { |
826 | if (inode->i_state & (I_FREEING|I_WILL_FREE|I_NEW)) | 826 | if (inode->i_state & (I_FREEING|I_CLEAR|I_WILL_FREE|I_NEW)) |
827 | continue; | 827 | continue; |
828 | if (!atomic_read(&inode->i_writecount)) | 828 | if (!atomic_read(&inode->i_writecount)) |
829 | continue; | 829 | continue; |
diff --git a/fs/read_write.c b/fs/read_write.c index 400fe81c973e..6d5d8ff238aa 100644 --- a/fs/read_write.c +++ b/fs/read_write.c | |||
@@ -731,6 +731,56 @@ SYSCALL_DEFINE3(writev, unsigned long, fd, const struct iovec __user *, vec, | |||
731 | return ret; | 731 | return ret; |
732 | } | 732 | } |
733 | 733 | ||
734 | SYSCALL_DEFINE5(preadv, unsigned long, fd, const struct iovec __user *, vec, | ||
735 | unsigned long, vlen, u32, pos_high, u32, pos_low) | ||
736 | { | ||
737 | loff_t pos = ((loff_t)pos_high << 32) | pos_low; | ||
738 | struct file *file; | ||
739 | ssize_t ret = -EBADF; | ||
740 | int fput_needed; | ||
741 | |||
742 | if (pos < 0) | ||
743 | return -EINVAL; | ||
744 | |||
745 | file = fget_light(fd, &fput_needed); | ||
746 | if (file) { | ||
747 | ret = -ESPIPE; | ||
748 | if (file->f_mode & FMODE_PREAD) | ||
749 | ret = vfs_readv(file, vec, vlen, &pos); | ||
750 | fput_light(file, fput_needed); | ||
751 | } | ||
752 | |||
753 | if (ret > 0) | ||
754 | add_rchar(current, ret); | ||
755 | inc_syscr(current); | ||
756 | return ret; | ||
757 | } | ||
758 | |||
759 | SYSCALL_DEFINE5(pwritev, unsigned long, fd, const struct iovec __user *, vec, | ||
760 | unsigned long, vlen, u32, pos_high, u32, pos_low) | ||
761 | { | ||
762 | loff_t pos = ((loff_t)pos_high << 32) | pos_low; | ||
763 | struct file *file; | ||
764 | ssize_t ret = -EBADF; | ||
765 | int fput_needed; | ||
766 | |||
767 | if (pos < 0) | ||
768 | return -EINVAL; | ||
769 | |||
770 | file = fget_light(fd, &fput_needed); | ||
771 | if (file) { | ||
772 | ret = -ESPIPE; | ||
773 | if (file->f_mode & FMODE_PWRITE) | ||
774 | ret = vfs_writev(file, vec, vlen, &pos); | ||
775 | fput_light(file, fput_needed); | ||
776 | } | ||
777 | |||
778 | if (ret > 0) | ||
779 | add_wchar(current, ret); | ||
780 | inc_syscw(current); | ||
781 | return ret; | ||
782 | } | ||
783 | |||
734 | static ssize_t do_sendfile(int out_fd, int in_fd, loff_t *ppos, | 784 | static ssize_t do_sendfile(int out_fd, int in_fd, loff_t *ppos, |
735 | size_t count, loff_t max) | 785 | size_t count, loff_t max) |
736 | { | 786 | { |
diff --git a/fs/reiserfs/Kconfig b/fs/reiserfs/Kconfig index 949b8c6addc8..513f431038f9 100644 --- a/fs/reiserfs/Kconfig +++ b/fs/reiserfs/Kconfig | |||
@@ -1,5 +1,6 @@ | |||
1 | config REISERFS_FS | 1 | config REISERFS_FS |
2 | tristate "Reiserfs support" | 2 | tristate "Reiserfs support" |
3 | select CRC32 | ||
3 | help | 4 | help |
4 | Stores not just filenames but the files themselves in a balanced | 5 | Stores not just filenames but the files themselves in a balanced |
5 | tree. Uses journalling. | 6 | tree. Uses journalling. |
diff --git a/fs/reiserfs/super.c b/fs/reiserfs/super.c index 972250c62896..0ae6486d9046 100644 --- a/fs/reiserfs/super.c +++ b/fs/reiserfs/super.c | |||
@@ -27,6 +27,7 @@ | |||
27 | #include <linux/mnt_namespace.h> | 27 | #include <linux/mnt_namespace.h> |
28 | #include <linux/mount.h> | 28 | #include <linux/mount.h> |
29 | #include <linux/namei.h> | 29 | #include <linux/namei.h> |
30 | #include <linux/crc32.h> | ||
30 | 31 | ||
31 | struct file_system_type reiserfs_fs_type; | 32 | struct file_system_type reiserfs_fs_type; |
32 | 33 | ||
@@ -1904,6 +1905,10 @@ static int reiserfs_statfs(struct dentry *dentry, struct kstatfs *buf) | |||
1904 | buf->f_bsize = dentry->d_sb->s_blocksize; | 1905 | buf->f_bsize = dentry->d_sb->s_blocksize; |
1905 | /* changed to accommodate gcc folks. */ | 1906 | /* changed to accommodate gcc folks. */ |
1906 | buf->f_type = REISERFS_SUPER_MAGIC; | 1907 | buf->f_type = REISERFS_SUPER_MAGIC; |
1908 | buf->f_fsid.val[0] = (u32)crc32_le(0, rs->s_uuid, sizeof(rs->s_uuid)/2); | ||
1909 | buf->f_fsid.val[1] = (u32)crc32_le(0, rs->s_uuid + sizeof(rs->s_uuid)/2, | ||
1910 | sizeof(rs->s_uuid)/2); | ||
1911 | |||
1907 | return 0; | 1912 | return 0; |
1908 | } | 1913 | } |
1909 | 1914 | ||
diff --git a/fs/squashfs/super.c b/fs/squashfs/super.c index 681ec0d83799..ffa6edcd2d0c 100644 --- a/fs/squashfs/super.c +++ b/fs/squashfs/super.c | |||
@@ -301,6 +301,7 @@ failure: | |||
301 | static int squashfs_statfs(struct dentry *dentry, struct kstatfs *buf) | 301 | static int squashfs_statfs(struct dentry *dentry, struct kstatfs *buf) |
302 | { | 302 | { |
303 | struct squashfs_sb_info *msblk = dentry->d_sb->s_fs_info; | 303 | struct squashfs_sb_info *msblk = dentry->d_sb->s_fs_info; |
304 | u64 id = huge_encode_dev(dentry->d_sb->s_bdev->bd_dev); | ||
304 | 305 | ||
305 | TRACE("Entered squashfs_statfs\n"); | 306 | TRACE("Entered squashfs_statfs\n"); |
306 | 307 | ||
@@ -311,6 +312,8 @@ static int squashfs_statfs(struct dentry *dentry, struct kstatfs *buf) | |||
311 | buf->f_files = msblk->inodes; | 312 | buf->f_files = msblk->inodes; |
312 | buf->f_ffree = 0; | 313 | buf->f_ffree = 0; |
313 | buf->f_namelen = SQUASHFS_NAME_LEN; | 314 | buf->f_namelen = SQUASHFS_NAME_LEN; |
315 | buf->f_fsid.val[0] = (u32)id; | ||
316 | buf->f_fsid.val[1] = (u32)(id >> 32); | ||
314 | 317 | ||
315 | return 0; | 318 | return 0; |
316 | } | 319 | } |
diff --git a/fs/sysv/inode.c b/fs/sysv/inode.c index 3d81bf58dae2..da20b48d350f 100644 --- a/fs/sysv/inode.c +++ b/fs/sysv/inode.c | |||
@@ -90,6 +90,7 @@ static int sysv_statfs(struct dentry *dentry, struct kstatfs *buf) | |||
90 | { | 90 | { |
91 | struct super_block *sb = dentry->d_sb; | 91 | struct super_block *sb = dentry->d_sb; |
92 | struct sysv_sb_info *sbi = SYSV_SB(sb); | 92 | struct sysv_sb_info *sbi = SYSV_SB(sb); |
93 | u64 id = huge_encode_dev(sb->s_bdev->bd_dev); | ||
93 | 94 | ||
94 | buf->f_type = sb->s_magic; | 95 | buf->f_type = sb->s_magic; |
95 | buf->f_bsize = sb->s_blocksize; | 96 | buf->f_bsize = sb->s_blocksize; |
@@ -98,6 +99,8 @@ static int sysv_statfs(struct dentry *dentry, struct kstatfs *buf) | |||
98 | buf->f_files = sbi->s_ninodes; | 99 | buf->f_files = sbi->s_ninodes; |
99 | buf->f_ffree = sysv_count_free_inodes(sb); | 100 | buf->f_ffree = sysv_count_free_inodes(sb); |
100 | buf->f_namelen = SYSV_NAMELEN; | 101 | buf->f_namelen = SYSV_NAMELEN; |
102 | buf->f_fsid.val[0] = (u32)id; | ||
103 | buf->f_fsid.val[1] = (u32)(id >> 32); | ||
101 | return 0; | 104 | return 0; |
102 | } | 105 | } |
103 | 106 | ||
diff --git a/fs/ufs/super.c b/fs/ufs/super.c index e1c1fc5ee239..60359291761f 100644 --- a/fs/ufs/super.c +++ b/fs/ufs/super.c | |||
@@ -1268,6 +1268,7 @@ static int ufs_statfs(struct dentry *dentry, struct kstatfs *buf) | |||
1268 | struct ufs_super_block_first *usb1; | 1268 | struct ufs_super_block_first *usb1; |
1269 | struct ufs_super_block_second *usb2; | 1269 | struct ufs_super_block_second *usb2; |
1270 | struct ufs_super_block_third *usb3; | 1270 | struct ufs_super_block_third *usb3; |
1271 | u64 id = huge_encode_dev(sb->s_bdev->bd_dev); | ||
1271 | 1272 | ||
1272 | lock_kernel(); | 1273 | lock_kernel(); |
1273 | 1274 | ||
@@ -1290,6 +1291,8 @@ static int ufs_statfs(struct dentry *dentry, struct kstatfs *buf) | |||
1290 | ? (buf->f_bfree - (((long)buf->f_blocks / 100) * uspi->s_minfree)) : 0; | 1291 | ? (buf->f_bfree - (((long)buf->f_blocks / 100) * uspi->s_minfree)) : 0; |
1291 | buf->f_files = uspi->s_ncg * uspi->s_ipg; | 1292 | buf->f_files = uspi->s_ncg * uspi->s_ipg; |
1292 | buf->f_namelen = UFS_MAXNAMLEN; | 1293 | buf->f_namelen = UFS_MAXNAMLEN; |
1294 | buf->f_fsid.val[0] = (u32)id; | ||
1295 | buf->f_fsid.val[1] = (u32)(id >> 32); | ||
1293 | 1296 | ||
1294 | unlock_kernel(); | 1297 | unlock_kernel(); |
1295 | 1298 | ||