diff options
Diffstat (limited to 'fs')
-rw-r--r-- | fs/aio.c | 16 | ||||
-rw-r--r-- | fs/binfmt_aout.c | 32 | ||||
-rw-r--r-- | fs/binfmt_elf.c | 23 | ||||
-rw-r--r-- | fs/binfmt_elf_fdpic.c | 18 | ||||
-rw-r--r-- | fs/binfmt_flat.c | 12 | ||||
-rw-r--r-- | fs/binfmt_som.c | 12 | ||||
-rw-r--r-- | fs/btrfs/ctree.h | 2 | ||||
-rw-r--r-- | fs/cifs/connect.c | 82 | ||||
-rw-r--r-- | fs/ext4/ext4.h | 3 | ||||
-rw-r--r-- | fs/ext4/extents.c | 6 | ||||
-rw-r--r-- | fs/ext4/super.c | 48 | ||||
-rw-r--r-- | fs/fuse/dir.c | 25 | ||||
-rw-r--r-- | fs/fuse/file.c | 129 | ||||
-rw-r--r-- | fs/fuse/inode.c | 1 | ||||
-rw-r--r-- | fs/lockd/clnt4xdr.c | 2 | ||||
-rw-r--r-- | fs/lockd/clntxdr.c | 2 | ||||
-rw-r--r-- | fs/nfsd/nfs3xdr.c | 22 | ||||
-rw-r--r-- | fs/nfsd/nfs4proc.c | 15 | ||||
-rw-r--r-- | fs/nfsd/nfs4state.c | 23 | ||||
-rw-r--r-- | fs/nfsd/nfs4xdr.c | 4 | ||||
-rw-r--r-- | fs/nfsd/vfs.c | 2 | ||||
-rw-r--r-- | fs/ocfs2/alloc.c | 2 | ||||
-rw-r--r-- | fs/ocfs2/refcounttree.c | 12 | ||||
-rw-r--r-- | fs/ocfs2/suballoc.c | 4 |
24 files changed, 241 insertions, 256 deletions
@@ -93,9 +93,8 @@ static void aio_free_ring(struct kioctx *ctx) | |||
93 | put_page(info->ring_pages[i]); | 93 | put_page(info->ring_pages[i]); |
94 | 94 | ||
95 | if (info->mmap_size) { | 95 | if (info->mmap_size) { |
96 | down_write(&ctx->mm->mmap_sem); | 96 | BUG_ON(ctx->mm != current->mm); |
97 | do_munmap(ctx->mm, info->mmap_base, info->mmap_size); | 97 | vm_munmap(info->mmap_base, info->mmap_size); |
98 | up_write(&ctx->mm->mmap_sem); | ||
99 | } | 98 | } |
100 | 99 | ||
101 | if (info->ring_pages && info->ring_pages != info->internal_pages) | 100 | if (info->ring_pages && info->ring_pages != info->internal_pages) |
@@ -389,6 +388,17 @@ void exit_aio(struct mm_struct *mm) | |||
389 | "exit_aio:ioctx still alive: %d %d %d\n", | 388 | "exit_aio:ioctx still alive: %d %d %d\n", |
390 | atomic_read(&ctx->users), ctx->dead, | 389 | atomic_read(&ctx->users), ctx->dead, |
391 | ctx->reqs_active); | 390 | ctx->reqs_active); |
391 | /* | ||
392 | * We don't need to bother with munmap() here - | ||
393 | * exit_mmap(mm) is coming and it'll unmap everything. | ||
394 | * Since aio_free_ring() uses non-zero ->mmap_size | ||
395 | * as indicator that it needs to unmap the area, | ||
396 | * just set it to 0; aio_free_ring() is the only | ||
397 | * place that uses ->mmap_size, so it's safe. | ||
398 | * That way we get all munmap done to current->mm - | ||
399 | * all other callers have ctx->mm == current->mm. | ||
400 | */ | ||
401 | ctx->ring_info.mmap_size = 0; | ||
392 | put_ioctx(ctx); | 402 | put_ioctx(ctx); |
393 | } | 403 | } |
394 | } | 404 | } |
diff --git a/fs/binfmt_aout.c b/fs/binfmt_aout.c index 2eb12f13593d..d146e181d10d 100644 --- a/fs/binfmt_aout.c +++ b/fs/binfmt_aout.c | |||
@@ -50,9 +50,7 @@ static int set_brk(unsigned long start, unsigned long end) | |||
50 | end = PAGE_ALIGN(end); | 50 | end = PAGE_ALIGN(end); |
51 | if (end > start) { | 51 | if (end > start) { |
52 | unsigned long addr; | 52 | unsigned long addr; |
53 | down_write(¤t->mm->mmap_sem); | 53 | addr = vm_brk(start, end - start); |
54 | addr = do_brk(start, end - start); | ||
55 | up_write(¤t->mm->mmap_sem); | ||
56 | if (BAD_ADDR(addr)) | 54 | if (BAD_ADDR(addr)) |
57 | return addr; | 55 | return addr; |
58 | } | 56 | } |
@@ -280,9 +278,7 @@ static int load_aout_binary(struct linux_binprm * bprm, struct pt_regs * regs) | |||
280 | pos = 32; | 278 | pos = 32; |
281 | map_size = ex.a_text+ex.a_data; | 279 | map_size = ex.a_text+ex.a_data; |
282 | #endif | 280 | #endif |
283 | down_write(¤t->mm->mmap_sem); | 281 | error = vm_brk(text_addr & PAGE_MASK, map_size); |
284 | error = do_brk(text_addr & PAGE_MASK, map_size); | ||
285 | up_write(¤t->mm->mmap_sem); | ||
286 | if (error != (text_addr & PAGE_MASK)) { | 282 | if (error != (text_addr & PAGE_MASK)) { |
287 | send_sig(SIGKILL, current, 0); | 283 | send_sig(SIGKILL, current, 0); |
288 | return error; | 284 | return error; |
@@ -313,9 +309,7 @@ static int load_aout_binary(struct linux_binprm * bprm, struct pt_regs * regs) | |||
313 | 309 | ||
314 | if (!bprm->file->f_op->mmap||((fd_offset & ~PAGE_MASK) != 0)) { | 310 | if (!bprm->file->f_op->mmap||((fd_offset & ~PAGE_MASK) != 0)) { |
315 | loff_t pos = fd_offset; | 311 | loff_t pos = fd_offset; |
316 | down_write(¤t->mm->mmap_sem); | 312 | vm_brk(N_TXTADDR(ex), ex.a_text+ex.a_data); |
317 | do_brk(N_TXTADDR(ex), ex.a_text+ex.a_data); | ||
318 | up_write(¤t->mm->mmap_sem); | ||
319 | bprm->file->f_op->read(bprm->file, | 313 | bprm->file->f_op->read(bprm->file, |
320 | (char __user *)N_TXTADDR(ex), | 314 | (char __user *)N_TXTADDR(ex), |
321 | ex.a_text+ex.a_data, &pos); | 315 | ex.a_text+ex.a_data, &pos); |
@@ -325,24 +319,20 @@ static int load_aout_binary(struct linux_binprm * bprm, struct pt_regs * regs) | |||
325 | goto beyond_if; | 319 | goto beyond_if; |
326 | } | 320 | } |
327 | 321 | ||
328 | down_write(¤t->mm->mmap_sem); | 322 | error = vm_mmap(bprm->file, N_TXTADDR(ex), ex.a_text, |
329 | error = do_mmap(bprm->file, N_TXTADDR(ex), ex.a_text, | ||
330 | PROT_READ | PROT_EXEC, | 323 | PROT_READ | PROT_EXEC, |
331 | MAP_FIXED | MAP_PRIVATE | MAP_DENYWRITE | MAP_EXECUTABLE, | 324 | MAP_FIXED | MAP_PRIVATE | MAP_DENYWRITE | MAP_EXECUTABLE, |
332 | fd_offset); | 325 | fd_offset); |
333 | up_write(¤t->mm->mmap_sem); | ||
334 | 326 | ||
335 | if (error != N_TXTADDR(ex)) { | 327 | if (error != N_TXTADDR(ex)) { |
336 | send_sig(SIGKILL, current, 0); | 328 | send_sig(SIGKILL, current, 0); |
337 | return error; | 329 | return error; |
338 | } | 330 | } |
339 | 331 | ||
340 | down_write(¤t->mm->mmap_sem); | 332 | error = vm_mmap(bprm->file, N_DATADDR(ex), ex.a_data, |
341 | error = do_mmap(bprm->file, N_DATADDR(ex), ex.a_data, | ||
342 | PROT_READ | PROT_WRITE | PROT_EXEC, | 333 | PROT_READ | PROT_WRITE | PROT_EXEC, |
343 | MAP_FIXED | MAP_PRIVATE | MAP_DENYWRITE | MAP_EXECUTABLE, | 334 | MAP_FIXED | MAP_PRIVATE | MAP_DENYWRITE | MAP_EXECUTABLE, |
344 | fd_offset + ex.a_text); | 335 | fd_offset + ex.a_text); |
345 | up_write(¤t->mm->mmap_sem); | ||
346 | if (error != N_DATADDR(ex)) { | 336 | if (error != N_DATADDR(ex)) { |
347 | send_sig(SIGKILL, current, 0); | 337 | send_sig(SIGKILL, current, 0); |
348 | return error; | 338 | return error; |
@@ -412,9 +402,7 @@ static int load_aout_library(struct file *file) | |||
412 | "N_TXTOFF is not page aligned. Please convert library: %s\n", | 402 | "N_TXTOFF is not page aligned. Please convert library: %s\n", |
413 | file->f_path.dentry->d_name.name); | 403 | file->f_path.dentry->d_name.name); |
414 | } | 404 | } |
415 | down_write(¤t->mm->mmap_sem); | 405 | vm_brk(start_addr, ex.a_text + ex.a_data + ex.a_bss); |
416 | do_brk(start_addr, ex.a_text + ex.a_data + ex.a_bss); | ||
417 | up_write(¤t->mm->mmap_sem); | ||
418 | 406 | ||
419 | file->f_op->read(file, (char __user *)start_addr, | 407 | file->f_op->read(file, (char __user *)start_addr, |
420 | ex.a_text + ex.a_data, &pos); | 408 | ex.a_text + ex.a_data, &pos); |
@@ -425,12 +413,10 @@ static int load_aout_library(struct file *file) | |||
425 | goto out; | 413 | goto out; |
426 | } | 414 | } |
427 | /* Now use mmap to map the library into memory. */ | 415 | /* Now use mmap to map the library into memory. */ |
428 | down_write(¤t->mm->mmap_sem); | 416 | error = vm_mmap(file, start_addr, ex.a_text + ex.a_data, |
429 | error = do_mmap(file, start_addr, ex.a_text + ex.a_data, | ||
430 | PROT_READ | PROT_WRITE | PROT_EXEC, | 417 | PROT_READ | PROT_WRITE | PROT_EXEC, |
431 | MAP_FIXED | MAP_PRIVATE | MAP_DENYWRITE, | 418 | MAP_FIXED | MAP_PRIVATE | MAP_DENYWRITE, |
432 | N_TXTOFF(ex)); | 419 | N_TXTOFF(ex)); |
433 | up_write(¤t->mm->mmap_sem); | ||
434 | retval = error; | 420 | retval = error; |
435 | if (error != start_addr) | 421 | if (error != start_addr) |
436 | goto out; | 422 | goto out; |
@@ -438,9 +424,7 @@ static int load_aout_library(struct file *file) | |||
438 | len = PAGE_ALIGN(ex.a_text + ex.a_data); | 424 | len = PAGE_ALIGN(ex.a_text + ex.a_data); |
439 | bss = ex.a_text + ex.a_data + ex.a_bss; | 425 | bss = ex.a_text + ex.a_data + ex.a_bss; |
440 | if (bss > len) { | 426 | if (bss > len) { |
441 | down_write(¤t->mm->mmap_sem); | 427 | error = vm_brk(start_addr + len, bss - len); |
442 | error = do_brk(start_addr + len, bss - len); | ||
443 | up_write(¤t->mm->mmap_sem); | ||
444 | retval = error; | 428 | retval = error; |
445 | if (error != start_addr + len) | 429 | if (error != start_addr + len) |
446 | goto out; | 430 | goto out; |
diff --git a/fs/binfmt_elf.c b/fs/binfmt_elf.c index 48ffb3dc610a..16f735417072 100644 --- a/fs/binfmt_elf.c +++ b/fs/binfmt_elf.c | |||
@@ -82,9 +82,7 @@ static int set_brk(unsigned long start, unsigned long end) | |||
82 | end = ELF_PAGEALIGN(end); | 82 | end = ELF_PAGEALIGN(end); |
83 | if (end > start) { | 83 | if (end > start) { |
84 | unsigned long addr; | 84 | unsigned long addr; |
85 | down_write(¤t->mm->mmap_sem); | 85 | addr = vm_brk(start, end - start); |
86 | addr = do_brk(start, end - start); | ||
87 | up_write(¤t->mm->mmap_sem); | ||
88 | if (BAD_ADDR(addr)) | 86 | if (BAD_ADDR(addr)) |
89 | return addr; | 87 | return addr; |
90 | } | 88 | } |
@@ -514,9 +512,7 @@ static unsigned long load_elf_interp(struct elfhdr *interp_elf_ex, | |||
514 | elf_bss = ELF_PAGESTART(elf_bss + ELF_MIN_ALIGN - 1); | 512 | elf_bss = ELF_PAGESTART(elf_bss + ELF_MIN_ALIGN - 1); |
515 | 513 | ||
516 | /* Map the last of the bss segment */ | 514 | /* Map the last of the bss segment */ |
517 | down_write(¤t->mm->mmap_sem); | 515 | error = vm_brk(elf_bss, last_bss - elf_bss); |
518 | error = do_brk(elf_bss, last_bss - elf_bss); | ||
519 | up_write(¤t->mm->mmap_sem); | ||
520 | if (BAD_ADDR(error)) | 516 | if (BAD_ADDR(error)) |
521 | goto out_close; | 517 | goto out_close; |
522 | } | 518 | } |
@@ -962,10 +958,8 @@ static int load_elf_binary(struct linux_binprm *bprm, struct pt_regs *regs) | |||
962 | and some applications "depend" upon this behavior. | 958 | and some applications "depend" upon this behavior. |
963 | Since we do not have the power to recompile these, we | 959 | Since we do not have the power to recompile these, we |
964 | emulate the SVr4 behavior. Sigh. */ | 960 | emulate the SVr4 behavior. Sigh. */ |
965 | down_write(¤t->mm->mmap_sem); | 961 | error = vm_mmap(NULL, 0, PAGE_SIZE, PROT_READ | PROT_EXEC, |
966 | error = do_mmap(NULL, 0, PAGE_SIZE, PROT_READ | PROT_EXEC, | ||
967 | MAP_FIXED | MAP_PRIVATE, 0); | 962 | MAP_FIXED | MAP_PRIVATE, 0); |
968 | up_write(¤t->mm->mmap_sem); | ||
969 | } | 963 | } |
970 | 964 | ||
971 | #ifdef ELF_PLAT_INIT | 965 | #ifdef ELF_PLAT_INIT |
@@ -1050,8 +1044,7 @@ static int load_elf_library(struct file *file) | |||
1050 | eppnt++; | 1044 | eppnt++; |
1051 | 1045 | ||
1052 | /* Now use mmap to map the library into memory. */ | 1046 | /* Now use mmap to map the library into memory. */ |
1053 | down_write(¤t->mm->mmap_sem); | 1047 | error = vm_mmap(file, |
1054 | error = do_mmap(file, | ||
1055 | ELF_PAGESTART(eppnt->p_vaddr), | 1048 | ELF_PAGESTART(eppnt->p_vaddr), |
1056 | (eppnt->p_filesz + | 1049 | (eppnt->p_filesz + |
1057 | ELF_PAGEOFFSET(eppnt->p_vaddr)), | 1050 | ELF_PAGEOFFSET(eppnt->p_vaddr)), |
@@ -1059,7 +1052,6 @@ static int load_elf_library(struct file *file) | |||
1059 | MAP_FIXED | MAP_PRIVATE | MAP_DENYWRITE, | 1052 | MAP_FIXED | MAP_PRIVATE | MAP_DENYWRITE, |
1060 | (eppnt->p_offset - | 1053 | (eppnt->p_offset - |
1061 | ELF_PAGEOFFSET(eppnt->p_vaddr))); | 1054 | ELF_PAGEOFFSET(eppnt->p_vaddr))); |
1062 | up_write(¤t->mm->mmap_sem); | ||
1063 | if (error != ELF_PAGESTART(eppnt->p_vaddr)) | 1055 | if (error != ELF_PAGESTART(eppnt->p_vaddr)) |
1064 | goto out_free_ph; | 1056 | goto out_free_ph; |
1065 | 1057 | ||
@@ -1072,11 +1064,8 @@ static int load_elf_library(struct file *file) | |||
1072 | len = ELF_PAGESTART(eppnt->p_filesz + eppnt->p_vaddr + | 1064 | len = ELF_PAGESTART(eppnt->p_filesz + eppnt->p_vaddr + |
1073 | ELF_MIN_ALIGN - 1); | 1065 | ELF_MIN_ALIGN - 1); |
1074 | bss = eppnt->p_memsz + eppnt->p_vaddr; | 1066 | bss = eppnt->p_memsz + eppnt->p_vaddr; |
1075 | if (bss > len) { | 1067 | if (bss > len) |
1076 | down_write(¤t->mm->mmap_sem); | 1068 | vm_brk(len, bss - len); |
1077 | do_brk(len, bss - len); | ||
1078 | up_write(¤t->mm->mmap_sem); | ||
1079 | } | ||
1080 | error = 0; | 1069 | error = 0; |
1081 | 1070 | ||
1082 | out_free_ph: | 1071 | out_free_ph: |
diff --git a/fs/binfmt_elf_fdpic.c b/fs/binfmt_elf_fdpic.c index 9bd5612a8224..d390a0fffc65 100644 --- a/fs/binfmt_elf_fdpic.c +++ b/fs/binfmt_elf_fdpic.c | |||
@@ -390,21 +390,17 @@ static int load_elf_fdpic_binary(struct linux_binprm *bprm, | |||
390 | (executable_stack == EXSTACK_DEFAULT && VM_STACK_FLAGS & VM_EXEC)) | 390 | (executable_stack == EXSTACK_DEFAULT && VM_STACK_FLAGS & VM_EXEC)) |
391 | stack_prot |= PROT_EXEC; | 391 | stack_prot |= PROT_EXEC; |
392 | 392 | ||
393 | down_write(¤t->mm->mmap_sem); | 393 | current->mm->start_brk = vm_mmap(NULL, 0, stack_size, stack_prot, |
394 | current->mm->start_brk = do_mmap(NULL, 0, stack_size, stack_prot, | ||
395 | MAP_PRIVATE | MAP_ANONYMOUS | | 394 | MAP_PRIVATE | MAP_ANONYMOUS | |
396 | MAP_UNINITIALIZED | MAP_GROWSDOWN, | 395 | MAP_UNINITIALIZED | MAP_GROWSDOWN, |
397 | 0); | 396 | 0); |
398 | 397 | ||
399 | if (IS_ERR_VALUE(current->mm->start_brk)) { | 398 | if (IS_ERR_VALUE(current->mm->start_brk)) { |
400 | up_write(¤t->mm->mmap_sem); | ||
401 | retval = current->mm->start_brk; | 399 | retval = current->mm->start_brk; |
402 | current->mm->start_brk = 0; | 400 | current->mm->start_brk = 0; |
403 | goto error_kill; | 401 | goto error_kill; |
404 | } | 402 | } |
405 | 403 | ||
406 | up_write(¤t->mm->mmap_sem); | ||
407 | |||
408 | current->mm->brk = current->mm->start_brk; | 404 | current->mm->brk = current->mm->start_brk; |
409 | current->mm->context.end_brk = current->mm->start_brk; | 405 | current->mm->context.end_brk = current->mm->start_brk; |
410 | current->mm->context.end_brk += | 406 | current->mm->context.end_brk += |
@@ -955,10 +951,8 @@ static int elf_fdpic_map_file_constdisp_on_uclinux( | |||
955 | if (params->flags & ELF_FDPIC_FLAG_EXECUTABLE) | 951 | if (params->flags & ELF_FDPIC_FLAG_EXECUTABLE) |
956 | mflags |= MAP_EXECUTABLE; | 952 | mflags |= MAP_EXECUTABLE; |
957 | 953 | ||
958 | down_write(&mm->mmap_sem); | 954 | maddr = vm_mmap(NULL, load_addr, top - base, |
959 | maddr = do_mmap(NULL, load_addr, top - base, | ||
960 | PROT_READ | PROT_WRITE | PROT_EXEC, mflags, 0); | 955 | PROT_READ | PROT_WRITE | PROT_EXEC, mflags, 0); |
961 | up_write(&mm->mmap_sem); | ||
962 | if (IS_ERR_VALUE(maddr)) | 956 | if (IS_ERR_VALUE(maddr)) |
963 | return (int) maddr; | 957 | return (int) maddr; |
964 | 958 | ||
@@ -1096,10 +1090,8 @@ static int elf_fdpic_map_file_by_direct_mmap(struct elf_fdpic_params *params, | |||
1096 | 1090 | ||
1097 | /* create the mapping */ | 1091 | /* create the mapping */ |
1098 | disp = phdr->p_vaddr & ~PAGE_MASK; | 1092 | disp = phdr->p_vaddr & ~PAGE_MASK; |
1099 | down_write(&mm->mmap_sem); | 1093 | maddr = vm_mmap(file, maddr, phdr->p_memsz + disp, prot, flags, |
1100 | maddr = do_mmap(file, maddr, phdr->p_memsz + disp, prot, flags, | ||
1101 | phdr->p_offset - disp); | 1094 | phdr->p_offset - disp); |
1102 | up_write(&mm->mmap_sem); | ||
1103 | 1095 | ||
1104 | kdebug("mmap[%d] <file> sz=%lx pr=%x fl=%x of=%lx --> %08lx", | 1096 | kdebug("mmap[%d] <file> sz=%lx pr=%x fl=%x of=%lx --> %08lx", |
1105 | loop, phdr->p_memsz + disp, prot, flags, | 1097 | loop, phdr->p_memsz + disp, prot, flags, |
@@ -1143,10 +1135,8 @@ static int elf_fdpic_map_file_by_direct_mmap(struct elf_fdpic_params *params, | |||
1143 | unsigned long xmaddr; | 1135 | unsigned long xmaddr; |
1144 | 1136 | ||
1145 | flags |= MAP_FIXED | MAP_ANONYMOUS; | 1137 | flags |= MAP_FIXED | MAP_ANONYMOUS; |
1146 | down_write(&mm->mmap_sem); | 1138 | xmaddr = vm_mmap(NULL, xaddr, excess - excess1, |
1147 | xmaddr = do_mmap(NULL, xaddr, excess - excess1, | ||
1148 | prot, flags, 0); | 1139 | prot, flags, 0); |
1149 | up_write(&mm->mmap_sem); | ||
1150 | 1140 | ||
1151 | kdebug("mmap[%d] <anon>" | 1141 | kdebug("mmap[%d] <anon>" |
1152 | " ad=%lx sz=%lx pr=%x fl=%x of=0 --> %08lx", | 1142 | " ad=%lx sz=%lx pr=%x fl=%x of=0 --> %08lx", |
diff --git a/fs/binfmt_flat.c b/fs/binfmt_flat.c index 024d20ee3ca3..6b2daf99fab8 100644 --- a/fs/binfmt_flat.c +++ b/fs/binfmt_flat.c | |||
@@ -542,10 +542,8 @@ static int load_flat_file(struct linux_binprm * bprm, | |||
542 | */ | 542 | */ |
543 | DBG_FLT("BINFMT_FLAT: ROM mapping of file (we hope)\n"); | 543 | DBG_FLT("BINFMT_FLAT: ROM mapping of file (we hope)\n"); |
544 | 544 | ||
545 | down_write(¤t->mm->mmap_sem); | 545 | textpos = vm_mmap(bprm->file, 0, text_len, PROT_READ|PROT_EXEC, |
546 | textpos = do_mmap(bprm->file, 0, text_len, PROT_READ|PROT_EXEC, | ||
547 | MAP_PRIVATE|MAP_EXECUTABLE, 0); | 546 | MAP_PRIVATE|MAP_EXECUTABLE, 0); |
548 | up_write(¤t->mm->mmap_sem); | ||
549 | if (!textpos || IS_ERR_VALUE(textpos)) { | 547 | if (!textpos || IS_ERR_VALUE(textpos)) { |
550 | if (!textpos) | 548 | if (!textpos) |
551 | textpos = (unsigned long) -ENOMEM; | 549 | textpos = (unsigned long) -ENOMEM; |
@@ -556,10 +554,8 @@ static int load_flat_file(struct linux_binprm * bprm, | |||
556 | 554 | ||
557 | len = data_len + extra + MAX_SHARED_LIBS * sizeof(unsigned long); | 555 | len = data_len + extra + MAX_SHARED_LIBS * sizeof(unsigned long); |
558 | len = PAGE_ALIGN(len); | 556 | len = PAGE_ALIGN(len); |
559 | down_write(¤t->mm->mmap_sem); | 557 | realdatastart = vm_mmap(0, 0, len, |
560 | realdatastart = do_mmap(0, 0, len, | ||
561 | PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE, 0); | 558 | PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE, 0); |
562 | up_write(¤t->mm->mmap_sem); | ||
563 | 559 | ||
564 | if (realdatastart == 0 || IS_ERR_VALUE(realdatastart)) { | 560 | if (realdatastart == 0 || IS_ERR_VALUE(realdatastart)) { |
565 | if (!realdatastart) | 561 | if (!realdatastart) |
@@ -603,10 +599,8 @@ static int load_flat_file(struct linux_binprm * bprm, | |||
603 | 599 | ||
604 | len = text_len + data_len + extra + MAX_SHARED_LIBS * sizeof(unsigned long); | 600 | len = text_len + data_len + extra + MAX_SHARED_LIBS * sizeof(unsigned long); |
605 | len = PAGE_ALIGN(len); | 601 | len = PAGE_ALIGN(len); |
606 | down_write(¤t->mm->mmap_sem); | 602 | textpos = vm_mmap(0, 0, len, |
607 | textpos = do_mmap(0, 0, len, | ||
608 | PROT_READ | PROT_EXEC | PROT_WRITE, MAP_PRIVATE, 0); | 603 | PROT_READ | PROT_EXEC | PROT_WRITE, MAP_PRIVATE, 0); |
609 | up_write(¤t->mm->mmap_sem); | ||
610 | 604 | ||
611 | if (!textpos || IS_ERR_VALUE(textpos)) { | 605 | if (!textpos || IS_ERR_VALUE(textpos)) { |
612 | if (!textpos) | 606 | if (!textpos) |
diff --git a/fs/binfmt_som.c b/fs/binfmt_som.c index e4fc746629a7..4517aaff61b4 100644 --- a/fs/binfmt_som.c +++ b/fs/binfmt_som.c | |||
@@ -147,10 +147,8 @@ static int map_som_binary(struct file *file, | |||
147 | code_size = SOM_PAGEALIGN(hpuxhdr->exec_tsize); | 147 | code_size = SOM_PAGEALIGN(hpuxhdr->exec_tsize); |
148 | current->mm->start_code = code_start; | 148 | current->mm->start_code = code_start; |
149 | current->mm->end_code = code_start + code_size; | 149 | current->mm->end_code = code_start + code_size; |
150 | down_write(¤t->mm->mmap_sem); | 150 | retval = vm_mmap(file, code_start, code_size, prot, |
151 | retval = do_mmap(file, code_start, code_size, prot, | ||
152 | flags, SOM_PAGESTART(hpuxhdr->exec_tfile)); | 151 | flags, SOM_PAGESTART(hpuxhdr->exec_tfile)); |
153 | up_write(¤t->mm->mmap_sem); | ||
154 | if (retval < 0 && retval > -1024) | 152 | if (retval < 0 && retval > -1024) |
155 | goto out; | 153 | goto out; |
156 | 154 | ||
@@ -158,20 +156,16 @@ static int map_som_binary(struct file *file, | |||
158 | data_size = SOM_PAGEALIGN(hpuxhdr->exec_dsize); | 156 | data_size = SOM_PAGEALIGN(hpuxhdr->exec_dsize); |
159 | current->mm->start_data = data_start; | 157 | current->mm->start_data = data_start; |
160 | current->mm->end_data = bss_start = data_start + data_size; | 158 | current->mm->end_data = bss_start = data_start + data_size; |
161 | down_write(¤t->mm->mmap_sem); | 159 | retval = vm_mmap(file, data_start, data_size, |
162 | retval = do_mmap(file, data_start, data_size, | ||
163 | prot | PROT_WRITE, flags, | 160 | prot | PROT_WRITE, flags, |
164 | SOM_PAGESTART(hpuxhdr->exec_dfile)); | 161 | SOM_PAGESTART(hpuxhdr->exec_dfile)); |
165 | up_write(¤t->mm->mmap_sem); | ||
166 | if (retval < 0 && retval > -1024) | 162 | if (retval < 0 && retval > -1024) |
167 | goto out; | 163 | goto out; |
168 | 164 | ||
169 | som_brk = bss_start + SOM_PAGEALIGN(hpuxhdr->exec_bsize); | 165 | som_brk = bss_start + SOM_PAGEALIGN(hpuxhdr->exec_bsize); |
170 | current->mm->start_brk = current->mm->brk = som_brk; | 166 | current->mm->start_brk = current->mm->brk = som_brk; |
171 | down_write(¤t->mm->mmap_sem); | 167 | retval = vm_mmap(NULL, bss_start, som_brk - bss_start, |
172 | retval = do_mmap(NULL, bss_start, som_brk - bss_start, | ||
173 | prot | PROT_WRITE, MAP_FIXED | MAP_PRIVATE, 0); | 168 | prot | PROT_WRITE, MAP_FIXED | MAP_PRIVATE, 0); |
174 | up_write(¤t->mm->mmap_sem); | ||
175 | if (retval > 0 || retval < -1024) | 169 | if (retval > 0 || retval < -1024) |
176 | retval = 0; | 170 | retval = 0; |
177 | out: | 171 | out: |
diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h index 5b8ef8eb3521..3f65a812e282 100644 --- a/fs/btrfs/ctree.h +++ b/fs/btrfs/ctree.h | |||
@@ -2166,7 +2166,7 @@ BTRFS_SETGET_STACK_FUNCS(root_last_snapshot, struct btrfs_root_item, | |||
2166 | 2166 | ||
2167 | static inline bool btrfs_root_readonly(struct btrfs_root *root) | 2167 | static inline bool btrfs_root_readonly(struct btrfs_root *root) |
2168 | { | 2168 | { |
2169 | return root->root_item.flags & BTRFS_ROOT_SUBVOL_RDONLY; | 2169 | return (root->root_item.flags & cpu_to_le64(BTRFS_ROOT_SUBVOL_RDONLY)) != 0; |
2170 | } | 2170 | } |
2171 | 2171 | ||
2172 | /* struct btrfs_root_backup */ | 2172 | /* struct btrfs_root_backup */ |
diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c index d81e933a796b..f31dc9ac37b7 100644 --- a/fs/cifs/connect.c +++ b/fs/cifs/connect.c | |||
@@ -109,6 +109,8 @@ enum { | |||
109 | 109 | ||
110 | /* Options which could be blank */ | 110 | /* Options which could be blank */ |
111 | Opt_blank_pass, | 111 | Opt_blank_pass, |
112 | Opt_blank_user, | ||
113 | Opt_blank_ip, | ||
112 | 114 | ||
113 | Opt_err | 115 | Opt_err |
114 | }; | 116 | }; |
@@ -183,11 +185,15 @@ static const match_table_t cifs_mount_option_tokens = { | |||
183 | { Opt_wsize, "wsize=%s" }, | 185 | { Opt_wsize, "wsize=%s" }, |
184 | { Opt_actimeo, "actimeo=%s" }, | 186 | { Opt_actimeo, "actimeo=%s" }, |
185 | 187 | ||
188 | { Opt_blank_user, "user=" }, | ||
189 | { Opt_blank_user, "username=" }, | ||
186 | { Opt_user, "user=%s" }, | 190 | { Opt_user, "user=%s" }, |
187 | { Opt_user, "username=%s" }, | 191 | { Opt_user, "username=%s" }, |
188 | { Opt_blank_pass, "pass=" }, | 192 | { Opt_blank_pass, "pass=" }, |
189 | { Opt_pass, "pass=%s" }, | 193 | { Opt_pass, "pass=%s" }, |
190 | { Opt_pass, "password=%s" }, | 194 | { Opt_pass, "password=%s" }, |
195 | { Opt_blank_ip, "ip=" }, | ||
196 | { Opt_blank_ip, "addr=" }, | ||
191 | { Opt_ip, "ip=%s" }, | 197 | { Opt_ip, "ip=%s" }, |
192 | { Opt_ip, "addr=%s" }, | 198 | { Opt_ip, "addr=%s" }, |
193 | { Opt_unc, "unc=%s" }, | 199 | { Opt_unc, "unc=%s" }, |
@@ -1117,7 +1123,7 @@ static int get_option_ul(substring_t args[], unsigned long *option) | |||
1117 | string = match_strdup(args); | 1123 | string = match_strdup(args); |
1118 | if (string == NULL) | 1124 | if (string == NULL) |
1119 | return -ENOMEM; | 1125 | return -ENOMEM; |
1120 | rc = kstrtoul(string, 10, option); | 1126 | rc = kstrtoul(string, 0, option); |
1121 | kfree(string); | 1127 | kfree(string); |
1122 | 1128 | ||
1123 | return rc; | 1129 | return rc; |
@@ -1534,15 +1540,17 @@ cifs_parse_mount_options(const char *mountdata, const char *devname, | |||
1534 | 1540 | ||
1535 | /* String Arguments */ | 1541 | /* String Arguments */ |
1536 | 1542 | ||
1543 | case Opt_blank_user: | ||
1544 | /* null user, ie. anonymous authentication */ | ||
1545 | vol->nullauth = 1; | ||
1546 | vol->username = NULL; | ||
1547 | break; | ||
1537 | case Opt_user: | 1548 | case Opt_user: |
1538 | string = match_strdup(args); | 1549 | string = match_strdup(args); |
1539 | if (string == NULL) | 1550 | if (string == NULL) |
1540 | goto out_nomem; | 1551 | goto out_nomem; |
1541 | 1552 | ||
1542 | if (!*string) { | 1553 | if (strnlen(string, MAX_USERNAME_SIZE) > |
1543 | /* null user, ie. anonymous authentication */ | ||
1544 | vol->nullauth = 1; | ||
1545 | } else if (strnlen(string, MAX_USERNAME_SIZE) > | ||
1546 | MAX_USERNAME_SIZE) { | 1554 | MAX_USERNAME_SIZE) { |
1547 | printk(KERN_WARNING "CIFS: username too long\n"); | 1555 | printk(KERN_WARNING "CIFS: username too long\n"); |
1548 | goto cifs_parse_mount_err; | 1556 | goto cifs_parse_mount_err; |
@@ -1611,14 +1619,15 @@ cifs_parse_mount_options(const char *mountdata, const char *devname, | |||
1611 | } | 1619 | } |
1612 | vol->password[j] = '\0'; | 1620 | vol->password[j] = '\0'; |
1613 | break; | 1621 | break; |
1622 | case Opt_blank_ip: | ||
1623 | vol->UNCip = NULL; | ||
1624 | break; | ||
1614 | case Opt_ip: | 1625 | case Opt_ip: |
1615 | string = match_strdup(args); | 1626 | string = match_strdup(args); |
1616 | if (string == NULL) | 1627 | if (string == NULL) |
1617 | goto out_nomem; | 1628 | goto out_nomem; |
1618 | 1629 | ||
1619 | if (!*string) { | 1630 | if (strnlen(string, INET6_ADDRSTRLEN) > |
1620 | vol->UNCip = NULL; | ||
1621 | } else if (strnlen(string, INET6_ADDRSTRLEN) > | ||
1622 | INET6_ADDRSTRLEN) { | 1631 | INET6_ADDRSTRLEN) { |
1623 | printk(KERN_WARNING "CIFS: ip address " | 1632 | printk(KERN_WARNING "CIFS: ip address " |
1624 | "too long\n"); | 1633 | "too long\n"); |
@@ -1636,12 +1645,6 @@ cifs_parse_mount_options(const char *mountdata, const char *devname, | |||
1636 | if (string == NULL) | 1645 | if (string == NULL) |
1637 | goto out_nomem; | 1646 | goto out_nomem; |
1638 | 1647 | ||
1639 | if (!*string) { | ||
1640 | printk(KERN_WARNING "CIFS: invalid path to " | ||
1641 | "network resource\n"); | ||
1642 | goto cifs_parse_mount_err; | ||
1643 | } | ||
1644 | |||
1645 | temp_len = strnlen(string, 300); | 1648 | temp_len = strnlen(string, 300); |
1646 | if (temp_len == 300) { | 1649 | if (temp_len == 300) { |
1647 | printk(KERN_WARNING "CIFS: UNC name too long\n"); | 1650 | printk(KERN_WARNING "CIFS: UNC name too long\n"); |
@@ -1670,11 +1673,7 @@ cifs_parse_mount_options(const char *mountdata, const char *devname, | |||
1670 | if (string == NULL) | 1673 | if (string == NULL) |
1671 | goto out_nomem; | 1674 | goto out_nomem; |
1672 | 1675 | ||
1673 | if (!*string) { | 1676 | if (strnlen(string, 256) == 256) { |
1674 | printk(KERN_WARNING "CIFS: invalid domain" | ||
1675 | " name\n"); | ||
1676 | goto cifs_parse_mount_err; | ||
1677 | } else if (strnlen(string, 256) == 256) { | ||
1678 | printk(KERN_WARNING "CIFS: domain name too" | 1677 | printk(KERN_WARNING "CIFS: domain name too" |
1679 | " long\n"); | 1678 | " long\n"); |
1680 | goto cifs_parse_mount_err; | 1679 | goto cifs_parse_mount_err; |
@@ -1693,11 +1692,7 @@ cifs_parse_mount_options(const char *mountdata, const char *devname, | |||
1693 | if (string == NULL) | 1692 | if (string == NULL) |
1694 | goto out_nomem; | 1693 | goto out_nomem; |
1695 | 1694 | ||
1696 | if (!*string) { | 1695 | if (!cifs_convert_address( |
1697 | printk(KERN_WARNING "CIFS: srcaddr value not" | ||
1698 | " specified\n"); | ||
1699 | goto cifs_parse_mount_err; | ||
1700 | } else if (!cifs_convert_address( | ||
1701 | (struct sockaddr *)&vol->srcaddr, | 1696 | (struct sockaddr *)&vol->srcaddr, |
1702 | string, strlen(string))) { | 1697 | string, strlen(string))) { |
1703 | printk(KERN_WARNING "CIFS: Could not parse" | 1698 | printk(KERN_WARNING "CIFS: Could not parse" |
@@ -1710,11 +1705,6 @@ cifs_parse_mount_options(const char *mountdata, const char *devname, | |||
1710 | if (string == NULL) | 1705 | if (string == NULL) |
1711 | goto out_nomem; | 1706 | goto out_nomem; |
1712 | 1707 | ||
1713 | if (!*string) { | ||
1714 | printk(KERN_WARNING "CIFS: Invalid path" | ||
1715 | " prefix\n"); | ||
1716 | goto cifs_parse_mount_err; | ||
1717 | } | ||
1718 | temp_len = strnlen(string, 1024); | 1708 | temp_len = strnlen(string, 1024); |
1719 | if (string[0] != '/') | 1709 | if (string[0] != '/') |
1720 | temp_len++; /* missing leading slash */ | 1710 | temp_len++; /* missing leading slash */ |
@@ -1742,11 +1732,7 @@ cifs_parse_mount_options(const char *mountdata, const char *devname, | |||
1742 | if (string == NULL) | 1732 | if (string == NULL) |
1743 | goto out_nomem; | 1733 | goto out_nomem; |
1744 | 1734 | ||
1745 | if (!*string) { | 1735 | if (strnlen(string, 1024) >= 65) { |
1746 | printk(KERN_WARNING "CIFS: Invalid iocharset" | ||
1747 | " specified\n"); | ||
1748 | goto cifs_parse_mount_err; | ||
1749 | } else if (strnlen(string, 1024) >= 65) { | ||
1750 | printk(KERN_WARNING "CIFS: iocharset name " | 1736 | printk(KERN_WARNING "CIFS: iocharset name " |
1751 | "too long.\n"); | 1737 | "too long.\n"); |
1752 | goto cifs_parse_mount_err; | 1738 | goto cifs_parse_mount_err; |
@@ -1771,11 +1757,6 @@ cifs_parse_mount_options(const char *mountdata, const char *devname, | |||
1771 | if (string == NULL) | 1757 | if (string == NULL) |
1772 | goto out_nomem; | 1758 | goto out_nomem; |
1773 | 1759 | ||
1774 | if (!*string) { | ||
1775 | printk(KERN_WARNING "CIFS: No socket option" | ||
1776 | " specified\n"); | ||
1777 | goto cifs_parse_mount_err; | ||
1778 | } | ||
1779 | if (strnicmp(string, "TCP_NODELAY", 11) == 0) | 1760 | if (strnicmp(string, "TCP_NODELAY", 11) == 0) |
1780 | vol->sockopt_tcp_nodelay = 1; | 1761 | vol->sockopt_tcp_nodelay = 1; |
1781 | break; | 1762 | break; |
@@ -1784,12 +1765,6 @@ cifs_parse_mount_options(const char *mountdata, const char *devname, | |||
1784 | if (string == NULL) | 1765 | if (string == NULL) |
1785 | goto out_nomem; | 1766 | goto out_nomem; |
1786 | 1767 | ||
1787 | if (!*string) { | ||
1788 | printk(KERN_WARNING "CIFS: Invalid (empty)" | ||
1789 | " netbiosname\n"); | ||
1790 | break; | ||
1791 | } | ||
1792 | |||
1793 | memset(vol->source_rfc1001_name, 0x20, | 1768 | memset(vol->source_rfc1001_name, 0x20, |
1794 | RFC1001_NAME_LEN); | 1769 | RFC1001_NAME_LEN); |
1795 | /* | 1770 | /* |
@@ -1817,11 +1792,6 @@ cifs_parse_mount_options(const char *mountdata, const char *devname, | |||
1817 | if (string == NULL) | 1792 | if (string == NULL) |
1818 | goto out_nomem; | 1793 | goto out_nomem; |
1819 | 1794 | ||
1820 | if (!*string) { | ||
1821 | printk(KERN_WARNING "CIFS: Empty server" | ||
1822 | " netbiosname specified\n"); | ||
1823 | break; | ||
1824 | } | ||
1825 | /* last byte, type, is 0x20 for servr type */ | 1795 | /* last byte, type, is 0x20 for servr type */ |
1826 | memset(vol->target_rfc1001_name, 0x20, | 1796 | memset(vol->target_rfc1001_name, 0x20, |
1827 | RFC1001_NAME_LEN_WITH_NULL); | 1797 | RFC1001_NAME_LEN_WITH_NULL); |
@@ -1848,12 +1818,6 @@ cifs_parse_mount_options(const char *mountdata, const char *devname, | |||
1848 | if (string == NULL) | 1818 | if (string == NULL) |
1849 | goto out_nomem; | 1819 | goto out_nomem; |
1850 | 1820 | ||
1851 | if (!*string) { | ||
1852 | cERROR(1, "no protocol version specified" | ||
1853 | " after vers= mount option"); | ||
1854 | goto cifs_parse_mount_err; | ||
1855 | } | ||
1856 | |||
1857 | if (strnicmp(string, "cifs", 4) == 0 || | 1821 | if (strnicmp(string, "cifs", 4) == 0 || |
1858 | strnicmp(string, "1", 1) == 0) { | 1822 | strnicmp(string, "1", 1) == 0) { |
1859 | /* This is the default */ | 1823 | /* This is the default */ |
@@ -1868,12 +1832,6 @@ cifs_parse_mount_options(const char *mountdata, const char *devname, | |||
1868 | if (string == NULL) | 1832 | if (string == NULL) |
1869 | goto out_nomem; | 1833 | goto out_nomem; |
1870 | 1834 | ||
1871 | if (!*string) { | ||
1872 | printk(KERN_WARNING "CIFS: no security flavor" | ||
1873 | " specified\n"); | ||
1874 | break; | ||
1875 | } | ||
1876 | |||
1877 | if (cifs_parse_security_flavors(string, vol) != 0) | 1835 | if (cifs_parse_security_flavors(string, vol) != 0) |
1878 | goto cifs_parse_mount_err; | 1836 | goto cifs_parse_mount_err; |
1879 | break; | 1837 | break; |
diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h index ab2594a30f86..0e01e90add8b 100644 --- a/fs/ext4/ext4.h +++ b/fs/ext4/ext4.h | |||
@@ -1203,9 +1203,6 @@ struct ext4_sb_info { | |||
1203 | unsigned long s_ext_blocks; | 1203 | unsigned long s_ext_blocks; |
1204 | unsigned long s_ext_extents; | 1204 | unsigned long s_ext_extents; |
1205 | #endif | 1205 | #endif |
1206 | /* ext4 extent cache stats */ | ||
1207 | unsigned long extent_cache_hits; | ||
1208 | unsigned long extent_cache_misses; | ||
1209 | 1206 | ||
1210 | /* for buddy allocator */ | 1207 | /* for buddy allocator */ |
1211 | struct ext4_group_info ***s_group_info; | 1208 | struct ext4_group_info ***s_group_info; |
diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c index 1421938e6792..abcdeab67f52 100644 --- a/fs/ext4/extents.c +++ b/fs/ext4/extents.c | |||
@@ -2066,10 +2066,6 @@ static int ext4_ext_check_cache(struct inode *inode, ext4_lblk_t block, | |||
2066 | ret = 1; | 2066 | ret = 1; |
2067 | } | 2067 | } |
2068 | errout: | 2068 | errout: |
2069 | if (!ret) | ||
2070 | sbi->extent_cache_misses++; | ||
2071 | else | ||
2072 | sbi->extent_cache_hits++; | ||
2073 | trace_ext4_ext_in_cache(inode, block, ret); | 2069 | trace_ext4_ext_in_cache(inode, block, ret); |
2074 | spin_unlock(&EXT4_I(inode)->i_block_reservation_lock); | 2070 | spin_unlock(&EXT4_I(inode)->i_block_reservation_lock); |
2075 | return ret; | 2071 | return ret; |
@@ -2882,7 +2878,7 @@ static int ext4_split_extent_at(handle_t *handle, | |||
2882 | if (err) | 2878 | if (err) |
2883 | goto fix_extent_len; | 2879 | goto fix_extent_len; |
2884 | /* update the extent length and mark as initialized */ | 2880 | /* update the extent length and mark as initialized */ |
2885 | ex->ee_len = cpu_to_le32(ee_len); | 2881 | ex->ee_len = cpu_to_le16(ee_len); |
2886 | ext4_ext_try_to_merge(inode, path, ex); | 2882 | ext4_ext_try_to_merge(inode, path, ex); |
2887 | err = ext4_ext_dirty(handle, inode, path + depth); | 2883 | err = ext4_ext_dirty(handle, inode, path + depth); |
2888 | goto out; | 2884 | goto out; |
diff --git a/fs/ext4/super.c b/fs/ext4/super.c index ceebaf853beb..6da193564e43 100644 --- a/fs/ext4/super.c +++ b/fs/ext4/super.c | |||
@@ -1305,20 +1305,20 @@ static int set_qf_name(struct super_block *sb, int qtype, substring_t *args) | |||
1305 | ext4_msg(sb, KERN_ERR, | 1305 | ext4_msg(sb, KERN_ERR, |
1306 | "Cannot change journaled " | 1306 | "Cannot change journaled " |
1307 | "quota options when quota turned on"); | 1307 | "quota options when quota turned on"); |
1308 | return 0; | 1308 | return -1; |
1309 | } | 1309 | } |
1310 | qname = match_strdup(args); | 1310 | qname = match_strdup(args); |
1311 | if (!qname) { | 1311 | if (!qname) { |
1312 | ext4_msg(sb, KERN_ERR, | 1312 | ext4_msg(sb, KERN_ERR, |
1313 | "Not enough memory for storing quotafile name"); | 1313 | "Not enough memory for storing quotafile name"); |
1314 | return 0; | 1314 | return -1; |
1315 | } | 1315 | } |
1316 | if (sbi->s_qf_names[qtype] && | 1316 | if (sbi->s_qf_names[qtype] && |
1317 | strcmp(sbi->s_qf_names[qtype], qname)) { | 1317 | strcmp(sbi->s_qf_names[qtype], qname)) { |
1318 | ext4_msg(sb, KERN_ERR, | 1318 | ext4_msg(sb, KERN_ERR, |
1319 | "%s quota file already specified", QTYPE2NAME(qtype)); | 1319 | "%s quota file already specified", QTYPE2NAME(qtype)); |
1320 | kfree(qname); | 1320 | kfree(qname); |
1321 | return 0; | 1321 | return -1; |
1322 | } | 1322 | } |
1323 | sbi->s_qf_names[qtype] = qname; | 1323 | sbi->s_qf_names[qtype] = qname; |
1324 | if (strchr(sbi->s_qf_names[qtype], '/')) { | 1324 | if (strchr(sbi->s_qf_names[qtype], '/')) { |
@@ -1326,7 +1326,7 @@ static int set_qf_name(struct super_block *sb, int qtype, substring_t *args) | |||
1326 | "quotafile must be on filesystem root"); | 1326 | "quotafile must be on filesystem root"); |
1327 | kfree(sbi->s_qf_names[qtype]); | 1327 | kfree(sbi->s_qf_names[qtype]); |
1328 | sbi->s_qf_names[qtype] = NULL; | 1328 | sbi->s_qf_names[qtype] = NULL; |
1329 | return 0; | 1329 | return -1; |
1330 | } | 1330 | } |
1331 | set_opt(sb, QUOTA); | 1331 | set_opt(sb, QUOTA); |
1332 | return 1; | 1332 | return 1; |
@@ -1341,7 +1341,7 @@ static int clear_qf_name(struct super_block *sb, int qtype) | |||
1341 | sbi->s_qf_names[qtype]) { | 1341 | sbi->s_qf_names[qtype]) { |
1342 | ext4_msg(sb, KERN_ERR, "Cannot change journaled quota options" | 1342 | ext4_msg(sb, KERN_ERR, "Cannot change journaled quota options" |
1343 | " when quota turned on"); | 1343 | " when quota turned on"); |
1344 | return 0; | 1344 | return -1; |
1345 | } | 1345 | } |
1346 | /* | 1346 | /* |
1347 | * The space will be released later when all options are confirmed | 1347 | * The space will be released later when all options are confirmed |
@@ -1450,6 +1450,16 @@ static int handle_mount_opt(struct super_block *sb, char *opt, int token, | |||
1450 | const struct mount_opts *m; | 1450 | const struct mount_opts *m; |
1451 | int arg = 0; | 1451 | int arg = 0; |
1452 | 1452 | ||
1453 | #ifdef CONFIG_QUOTA | ||
1454 | if (token == Opt_usrjquota) | ||
1455 | return set_qf_name(sb, USRQUOTA, &args[0]); | ||
1456 | else if (token == Opt_grpjquota) | ||
1457 | return set_qf_name(sb, GRPQUOTA, &args[0]); | ||
1458 | else if (token == Opt_offusrjquota) | ||
1459 | return clear_qf_name(sb, USRQUOTA); | ||
1460 | else if (token == Opt_offgrpjquota) | ||
1461 | return clear_qf_name(sb, GRPQUOTA); | ||
1462 | #endif | ||
1453 | if (args->from && match_int(args, &arg)) | 1463 | if (args->from && match_int(args, &arg)) |
1454 | return -1; | 1464 | return -1; |
1455 | switch (token) { | 1465 | switch (token) { |
@@ -1549,18 +1559,6 @@ static int handle_mount_opt(struct super_block *sb, char *opt, int token, | |||
1549 | sbi->s_mount_opt |= m->mount_opt; | 1559 | sbi->s_mount_opt |= m->mount_opt; |
1550 | } | 1560 | } |
1551 | #ifdef CONFIG_QUOTA | 1561 | #ifdef CONFIG_QUOTA |
1552 | } else if (token == Opt_usrjquota) { | ||
1553 | if (!set_qf_name(sb, USRQUOTA, &args[0])) | ||
1554 | return -1; | ||
1555 | } else if (token == Opt_grpjquota) { | ||
1556 | if (!set_qf_name(sb, GRPQUOTA, &args[0])) | ||
1557 | return -1; | ||
1558 | } else if (token == Opt_offusrjquota) { | ||
1559 | if (!clear_qf_name(sb, USRQUOTA)) | ||
1560 | return -1; | ||
1561 | } else if (token == Opt_offgrpjquota) { | ||
1562 | if (!clear_qf_name(sb, GRPQUOTA)) | ||
1563 | return -1; | ||
1564 | } else if (m->flags & MOPT_QFMT) { | 1562 | } else if (m->flags & MOPT_QFMT) { |
1565 | if (sb_any_quota_loaded(sb) && | 1563 | if (sb_any_quota_loaded(sb) && |
1566 | sbi->s_jquota_fmt != m->mount_opt) { | 1564 | sbi->s_jquota_fmt != m->mount_opt) { |
@@ -2366,18 +2364,6 @@ static ssize_t lifetime_write_kbytes_show(struct ext4_attr *a, | |||
2366 | EXT4_SB(sb)->s_sectors_written_start) >> 1))); | 2364 | EXT4_SB(sb)->s_sectors_written_start) >> 1))); |
2367 | } | 2365 | } |
2368 | 2366 | ||
2369 | static ssize_t extent_cache_hits_show(struct ext4_attr *a, | ||
2370 | struct ext4_sb_info *sbi, char *buf) | ||
2371 | { | ||
2372 | return snprintf(buf, PAGE_SIZE, "%lu\n", sbi->extent_cache_hits); | ||
2373 | } | ||
2374 | |||
2375 | static ssize_t extent_cache_misses_show(struct ext4_attr *a, | ||
2376 | struct ext4_sb_info *sbi, char *buf) | ||
2377 | { | ||
2378 | return snprintf(buf, PAGE_SIZE, "%lu\n", sbi->extent_cache_misses); | ||
2379 | } | ||
2380 | |||
2381 | static ssize_t inode_readahead_blks_store(struct ext4_attr *a, | 2367 | static ssize_t inode_readahead_blks_store(struct ext4_attr *a, |
2382 | struct ext4_sb_info *sbi, | 2368 | struct ext4_sb_info *sbi, |
2383 | const char *buf, size_t count) | 2369 | const char *buf, size_t count) |
@@ -2435,8 +2421,6 @@ static struct ext4_attr ext4_attr_##name = __ATTR(name, mode, show, store) | |||
2435 | EXT4_RO_ATTR(delayed_allocation_blocks); | 2421 | EXT4_RO_ATTR(delayed_allocation_blocks); |
2436 | EXT4_RO_ATTR(session_write_kbytes); | 2422 | EXT4_RO_ATTR(session_write_kbytes); |
2437 | EXT4_RO_ATTR(lifetime_write_kbytes); | 2423 | EXT4_RO_ATTR(lifetime_write_kbytes); |
2438 | EXT4_RO_ATTR(extent_cache_hits); | ||
2439 | EXT4_RO_ATTR(extent_cache_misses); | ||
2440 | EXT4_ATTR_OFFSET(inode_readahead_blks, 0644, sbi_ui_show, | 2424 | EXT4_ATTR_OFFSET(inode_readahead_blks, 0644, sbi_ui_show, |
2441 | inode_readahead_blks_store, s_inode_readahead_blks); | 2425 | inode_readahead_blks_store, s_inode_readahead_blks); |
2442 | EXT4_RW_ATTR_SBI_UI(inode_goal, s_inode_goal); | 2426 | EXT4_RW_ATTR_SBI_UI(inode_goal, s_inode_goal); |
@@ -2452,8 +2436,6 @@ static struct attribute *ext4_attrs[] = { | |||
2452 | ATTR_LIST(delayed_allocation_blocks), | 2436 | ATTR_LIST(delayed_allocation_blocks), |
2453 | ATTR_LIST(session_write_kbytes), | 2437 | ATTR_LIST(session_write_kbytes), |
2454 | ATTR_LIST(lifetime_write_kbytes), | 2438 | ATTR_LIST(lifetime_write_kbytes), |
2455 | ATTR_LIST(extent_cache_hits), | ||
2456 | ATTR_LIST(extent_cache_misses), | ||
2457 | ATTR_LIST(inode_readahead_blks), | 2439 | ATTR_LIST(inode_readahead_blks), |
2458 | ATTR_LIST(inode_goal), | 2440 | ATTR_LIST(inode_goal), |
2459 | ATTR_LIST(mb_stats), | 2441 | ATTR_LIST(mb_stats), |
diff --git a/fs/fuse/dir.c b/fs/fuse/dir.c index 206632887bb4..df5ac048dc74 100644 --- a/fs/fuse/dir.c +++ b/fs/fuse/dir.c | |||
@@ -387,9 +387,6 @@ static int fuse_create_open(struct inode *dir, struct dentry *entry, | |||
387 | if (fc->no_create) | 387 | if (fc->no_create) |
388 | return -ENOSYS; | 388 | return -ENOSYS; |
389 | 389 | ||
390 | if (flags & O_DIRECT) | ||
391 | return -EINVAL; | ||
392 | |||
393 | forget = fuse_alloc_forget(); | 390 | forget = fuse_alloc_forget(); |
394 | if (!forget) | 391 | if (!forget) |
395 | return -ENOMEM; | 392 | return -ENOMEM; |
@@ -644,13 +641,12 @@ static int fuse_unlink(struct inode *dir, struct dentry *entry) | |||
644 | fuse_put_request(fc, req); | 641 | fuse_put_request(fc, req); |
645 | if (!err) { | 642 | if (!err) { |
646 | struct inode *inode = entry->d_inode; | 643 | struct inode *inode = entry->d_inode; |
644 | struct fuse_inode *fi = get_fuse_inode(inode); | ||
647 | 645 | ||
648 | /* | 646 | spin_lock(&fc->lock); |
649 | * Set nlink to zero so the inode can be cleared, if the inode | 647 | fi->attr_version = ++fc->attr_version; |
650 | * does have more links this will be discovered at the next | 648 | drop_nlink(inode); |
651 | * lookup/getattr. | 649 | spin_unlock(&fc->lock); |
652 | */ | ||
653 | clear_nlink(inode); | ||
654 | fuse_invalidate_attr(inode); | 650 | fuse_invalidate_attr(inode); |
655 | fuse_invalidate_attr(dir); | 651 | fuse_invalidate_attr(dir); |
656 | fuse_invalidate_entry_cache(entry); | 652 | fuse_invalidate_entry_cache(entry); |
@@ -762,8 +758,17 @@ static int fuse_link(struct dentry *entry, struct inode *newdir, | |||
762 | will reflect changes in the backing inode (link count, | 758 | will reflect changes in the backing inode (link count, |
763 | etc.) | 759 | etc.) |
764 | */ | 760 | */ |
765 | if (!err || err == -EINTR) | 761 | if (!err) { |
762 | struct fuse_inode *fi = get_fuse_inode(inode); | ||
763 | |||
764 | spin_lock(&fc->lock); | ||
765 | fi->attr_version = ++fc->attr_version; | ||
766 | inc_nlink(inode); | ||
767 | spin_unlock(&fc->lock); | ||
768 | fuse_invalidate_attr(inode); | ||
769 | } else if (err == -EINTR) { | ||
766 | fuse_invalidate_attr(inode); | 770 | fuse_invalidate_attr(inode); |
771 | } | ||
767 | return err; | 772 | return err; |
768 | } | 773 | } |
769 | 774 | ||
diff --git a/fs/fuse/file.c b/fs/fuse/file.c index a841868bf9ce..504e61b7fd75 100644 --- a/fs/fuse/file.c +++ b/fs/fuse/file.c | |||
@@ -194,10 +194,6 @@ int fuse_open_common(struct inode *inode, struct file *file, bool isdir) | |||
194 | struct fuse_conn *fc = get_fuse_conn(inode); | 194 | struct fuse_conn *fc = get_fuse_conn(inode); |
195 | int err; | 195 | int err; |
196 | 196 | ||
197 | /* VFS checks this, but only _after_ ->open() */ | ||
198 | if (file->f_flags & O_DIRECT) | ||
199 | return -EINVAL; | ||
200 | |||
201 | err = generic_file_open(inode, file); | 197 | err = generic_file_open(inode, file); |
202 | if (err) | 198 | if (err) |
203 | return err; | 199 | return err; |
@@ -932,17 +928,23 @@ static ssize_t fuse_file_aio_write(struct kiocb *iocb, const struct iovec *iov, | |||
932 | struct file *file = iocb->ki_filp; | 928 | struct file *file = iocb->ki_filp; |
933 | struct address_space *mapping = file->f_mapping; | 929 | struct address_space *mapping = file->f_mapping; |
934 | size_t count = 0; | 930 | size_t count = 0; |
931 | size_t ocount = 0; | ||
935 | ssize_t written = 0; | 932 | ssize_t written = 0; |
933 | ssize_t written_buffered = 0; | ||
936 | struct inode *inode = mapping->host; | 934 | struct inode *inode = mapping->host; |
937 | ssize_t err; | 935 | ssize_t err; |
938 | struct iov_iter i; | 936 | struct iov_iter i; |
937 | loff_t endbyte = 0; | ||
939 | 938 | ||
940 | WARN_ON(iocb->ki_pos != pos); | 939 | WARN_ON(iocb->ki_pos != pos); |
941 | 940 | ||
942 | err = generic_segment_checks(iov, &nr_segs, &count, VERIFY_READ); | 941 | ocount = 0; |
942 | err = generic_segment_checks(iov, &nr_segs, &ocount, VERIFY_READ); | ||
943 | if (err) | 943 | if (err) |
944 | return err; | 944 | return err; |
945 | 945 | ||
946 | count = ocount; | ||
947 | |||
946 | mutex_lock(&inode->i_mutex); | 948 | mutex_lock(&inode->i_mutex); |
947 | vfs_check_frozen(inode->i_sb, SB_FREEZE_WRITE); | 949 | vfs_check_frozen(inode->i_sb, SB_FREEZE_WRITE); |
948 | 950 | ||
@@ -962,11 +964,41 @@ static ssize_t fuse_file_aio_write(struct kiocb *iocb, const struct iovec *iov, | |||
962 | 964 | ||
963 | file_update_time(file); | 965 | file_update_time(file); |
964 | 966 | ||
965 | iov_iter_init(&i, iov, nr_segs, count, 0); | 967 | if (file->f_flags & O_DIRECT) { |
966 | written = fuse_perform_write(file, mapping, &i, pos); | 968 | written = generic_file_direct_write(iocb, iov, &nr_segs, |
967 | if (written >= 0) | 969 | pos, &iocb->ki_pos, |
968 | iocb->ki_pos = pos + written; | 970 | count, ocount); |
971 | if (written < 0 || written == count) | ||
972 | goto out; | ||
973 | |||
974 | pos += written; | ||
975 | count -= written; | ||
969 | 976 | ||
977 | iov_iter_init(&i, iov, nr_segs, count, written); | ||
978 | written_buffered = fuse_perform_write(file, mapping, &i, pos); | ||
979 | if (written_buffered < 0) { | ||
980 | err = written_buffered; | ||
981 | goto out; | ||
982 | } | ||
983 | endbyte = pos + written_buffered - 1; | ||
984 | |||
985 | err = filemap_write_and_wait_range(file->f_mapping, pos, | ||
986 | endbyte); | ||
987 | if (err) | ||
988 | goto out; | ||
989 | |||
990 | invalidate_mapping_pages(file->f_mapping, | ||
991 | pos >> PAGE_CACHE_SHIFT, | ||
992 | endbyte >> PAGE_CACHE_SHIFT); | ||
993 | |||
994 | written += written_buffered; | ||
995 | iocb->ki_pos = pos + written_buffered; | ||
996 | } else { | ||
997 | iov_iter_init(&i, iov, nr_segs, count, 0); | ||
998 | written = fuse_perform_write(file, mapping, &i, pos); | ||
999 | if (written >= 0) | ||
1000 | iocb->ki_pos = pos + written; | ||
1001 | } | ||
970 | out: | 1002 | out: |
971 | current->backing_dev_info = NULL; | 1003 | current->backing_dev_info = NULL; |
972 | mutex_unlock(&inode->i_mutex); | 1004 | mutex_unlock(&inode->i_mutex); |
@@ -1101,30 +1133,41 @@ static ssize_t fuse_direct_read(struct file *file, char __user *buf, | |||
1101 | return res; | 1133 | return res; |
1102 | } | 1134 | } |
1103 | 1135 | ||
1104 | static ssize_t fuse_direct_write(struct file *file, const char __user *buf, | 1136 | static ssize_t __fuse_direct_write(struct file *file, const char __user *buf, |
1105 | size_t count, loff_t *ppos) | 1137 | size_t count, loff_t *ppos) |
1106 | { | 1138 | { |
1107 | struct inode *inode = file->f_path.dentry->d_inode; | 1139 | struct inode *inode = file->f_path.dentry->d_inode; |
1108 | ssize_t res; | 1140 | ssize_t res; |
1109 | 1141 | ||
1110 | if (is_bad_inode(inode)) | ||
1111 | return -EIO; | ||
1112 | |||
1113 | /* Don't allow parallel writes to the same file */ | ||
1114 | mutex_lock(&inode->i_mutex); | ||
1115 | res = generic_write_checks(file, ppos, &count, 0); | 1142 | res = generic_write_checks(file, ppos, &count, 0); |
1116 | if (!res) { | 1143 | if (!res) { |
1117 | res = fuse_direct_io(file, buf, count, ppos, 1); | 1144 | res = fuse_direct_io(file, buf, count, ppos, 1); |
1118 | if (res > 0) | 1145 | if (res > 0) |
1119 | fuse_write_update_size(inode, *ppos); | 1146 | fuse_write_update_size(inode, *ppos); |
1120 | } | 1147 | } |
1121 | mutex_unlock(&inode->i_mutex); | ||
1122 | 1148 | ||
1123 | fuse_invalidate_attr(inode); | 1149 | fuse_invalidate_attr(inode); |
1124 | 1150 | ||
1125 | return res; | 1151 | return res; |
1126 | } | 1152 | } |
1127 | 1153 | ||
1154 | static ssize_t fuse_direct_write(struct file *file, const char __user *buf, | ||
1155 | size_t count, loff_t *ppos) | ||
1156 | { | ||
1157 | struct inode *inode = file->f_path.dentry->d_inode; | ||
1158 | ssize_t res; | ||
1159 | |||
1160 | if (is_bad_inode(inode)) | ||
1161 | return -EIO; | ||
1162 | |||
1163 | /* Don't allow parallel writes to the same file */ | ||
1164 | mutex_lock(&inode->i_mutex); | ||
1165 | res = __fuse_direct_write(file, buf, count, ppos); | ||
1166 | mutex_unlock(&inode->i_mutex); | ||
1167 | |||
1168 | return res; | ||
1169 | } | ||
1170 | |||
1128 | static void fuse_writepage_free(struct fuse_conn *fc, struct fuse_req *req) | 1171 | static void fuse_writepage_free(struct fuse_conn *fc, struct fuse_req *req) |
1129 | { | 1172 | { |
1130 | __free_page(req->pages[0]); | 1173 | __free_page(req->pages[0]); |
@@ -2077,6 +2120,57 @@ int fuse_notify_poll_wakeup(struct fuse_conn *fc, | |||
2077 | return 0; | 2120 | return 0; |
2078 | } | 2121 | } |
2079 | 2122 | ||
2123 | static ssize_t fuse_loop_dio(struct file *filp, const struct iovec *iov, | ||
2124 | unsigned long nr_segs, loff_t *ppos, int rw) | ||
2125 | { | ||
2126 | const struct iovec *vector = iov; | ||
2127 | ssize_t ret = 0; | ||
2128 | |||
2129 | while (nr_segs > 0) { | ||
2130 | void __user *base; | ||
2131 | size_t len; | ||
2132 | ssize_t nr; | ||
2133 | |||
2134 | base = vector->iov_base; | ||
2135 | len = vector->iov_len; | ||
2136 | vector++; | ||
2137 | nr_segs--; | ||
2138 | |||
2139 | if (rw == WRITE) | ||
2140 | nr = __fuse_direct_write(filp, base, len, ppos); | ||
2141 | else | ||
2142 | nr = fuse_direct_read(filp, base, len, ppos); | ||
2143 | |||
2144 | if (nr < 0) { | ||
2145 | if (!ret) | ||
2146 | ret = nr; | ||
2147 | break; | ||
2148 | } | ||
2149 | ret += nr; | ||
2150 | if (nr != len) | ||
2151 | break; | ||
2152 | } | ||
2153 | |||
2154 | return ret; | ||
2155 | } | ||
2156 | |||
2157 | |||
2158 | static ssize_t | ||
2159 | fuse_direct_IO(int rw, struct kiocb *iocb, const struct iovec *iov, | ||
2160 | loff_t offset, unsigned long nr_segs) | ||
2161 | { | ||
2162 | ssize_t ret = 0; | ||
2163 | struct file *file = NULL; | ||
2164 | loff_t pos = 0; | ||
2165 | |||
2166 | file = iocb->ki_filp; | ||
2167 | pos = offset; | ||
2168 | |||
2169 | ret = fuse_loop_dio(file, iov, nr_segs, &pos, rw); | ||
2170 | |||
2171 | return ret; | ||
2172 | } | ||
2173 | |||
2080 | static const struct file_operations fuse_file_operations = { | 2174 | static const struct file_operations fuse_file_operations = { |
2081 | .llseek = fuse_file_llseek, | 2175 | .llseek = fuse_file_llseek, |
2082 | .read = do_sync_read, | 2176 | .read = do_sync_read, |
@@ -2120,6 +2214,7 @@ static const struct address_space_operations fuse_file_aops = { | |||
2120 | .readpages = fuse_readpages, | 2214 | .readpages = fuse_readpages, |
2121 | .set_page_dirty = __set_page_dirty_nobuffers, | 2215 | .set_page_dirty = __set_page_dirty_nobuffers, |
2122 | .bmap = fuse_bmap, | 2216 | .bmap = fuse_bmap, |
2217 | .direct_IO = fuse_direct_IO, | ||
2123 | }; | 2218 | }; |
2124 | 2219 | ||
2125 | void fuse_init_file_inode(struct inode *inode) | 2220 | void fuse_init_file_inode(struct inode *inode) |
diff --git a/fs/fuse/inode.c b/fs/fuse/inode.c index 4aec5995867e..26783eb2b1fc 100644 --- a/fs/fuse/inode.c +++ b/fs/fuse/inode.c | |||
@@ -947,6 +947,7 @@ static int fuse_fill_super(struct super_block *sb, void *data, int silent) | |||
947 | sb->s_magic = FUSE_SUPER_MAGIC; | 947 | sb->s_magic = FUSE_SUPER_MAGIC; |
948 | sb->s_op = &fuse_super_operations; | 948 | sb->s_op = &fuse_super_operations; |
949 | sb->s_maxbytes = MAX_LFS_FILESIZE; | 949 | sb->s_maxbytes = MAX_LFS_FILESIZE; |
950 | sb->s_time_gran = 1; | ||
950 | sb->s_export_op = &fuse_export_operations; | 951 | sb->s_export_op = &fuse_export_operations; |
951 | 952 | ||
952 | file = fget(d.fd); | 953 | file = fget(d.fd); |
diff --git a/fs/lockd/clnt4xdr.c b/fs/lockd/clnt4xdr.c index 3ddcbb1c0a43..13ad1539fbf2 100644 --- a/fs/lockd/clnt4xdr.c +++ b/fs/lockd/clnt4xdr.c | |||
@@ -241,7 +241,7 @@ static int decode_nlm4_stat(struct xdr_stream *xdr, __be32 *stat) | |||
241 | p = xdr_inline_decode(xdr, 4); | 241 | p = xdr_inline_decode(xdr, 4); |
242 | if (unlikely(p == NULL)) | 242 | if (unlikely(p == NULL)) |
243 | goto out_overflow; | 243 | goto out_overflow; |
244 | if (unlikely(*p > nlm4_failed)) | 244 | if (unlikely(ntohl(*p) > ntohl(nlm4_failed))) |
245 | goto out_bad_xdr; | 245 | goto out_bad_xdr; |
246 | *stat = *p; | 246 | *stat = *p; |
247 | return 0; | 247 | return 0; |
diff --git a/fs/lockd/clntxdr.c b/fs/lockd/clntxdr.c index 3d35e3e80c1c..d269ada7670e 100644 --- a/fs/lockd/clntxdr.c +++ b/fs/lockd/clntxdr.c | |||
@@ -236,7 +236,7 @@ static int decode_nlm_stat(struct xdr_stream *xdr, | |||
236 | p = xdr_inline_decode(xdr, 4); | 236 | p = xdr_inline_decode(xdr, 4); |
237 | if (unlikely(p == NULL)) | 237 | if (unlikely(p == NULL)) |
238 | goto out_overflow; | 238 | goto out_overflow; |
239 | if (unlikely(*p > nlm_lck_denied_grace_period)) | 239 | if (unlikely(ntohl(*p) > ntohl(nlm_lck_denied_grace_period))) |
240 | goto out_enum; | 240 | goto out_enum; |
241 | *stat = *p; | 241 | *stat = *p; |
242 | return 0; | 242 | return 0; |
diff --git a/fs/nfsd/nfs3xdr.c b/fs/nfsd/nfs3xdr.c index 08c6e36ab2eb..43f46cd9edea 100644 --- a/fs/nfsd/nfs3xdr.c +++ b/fs/nfsd/nfs3xdr.c | |||
@@ -803,13 +803,13 @@ encode_entry_baggage(struct nfsd3_readdirres *cd, __be32 *p, const char *name, | |||
803 | return p; | 803 | return p; |
804 | } | 804 | } |
805 | 805 | ||
806 | static int | 806 | static __be32 |
807 | compose_entry_fh(struct nfsd3_readdirres *cd, struct svc_fh *fhp, | 807 | compose_entry_fh(struct nfsd3_readdirres *cd, struct svc_fh *fhp, |
808 | const char *name, int namlen) | 808 | const char *name, int namlen) |
809 | { | 809 | { |
810 | struct svc_export *exp; | 810 | struct svc_export *exp; |
811 | struct dentry *dparent, *dchild; | 811 | struct dentry *dparent, *dchild; |
812 | int rv = 0; | 812 | __be32 rv = nfserr_noent; |
813 | 813 | ||
814 | dparent = cd->fh.fh_dentry; | 814 | dparent = cd->fh.fh_dentry; |
815 | exp = cd->fh.fh_export; | 815 | exp = cd->fh.fh_export; |
@@ -817,26 +817,20 @@ compose_entry_fh(struct nfsd3_readdirres *cd, struct svc_fh *fhp, | |||
817 | if (isdotent(name, namlen)) { | 817 | if (isdotent(name, namlen)) { |
818 | if (namlen == 2) { | 818 | if (namlen == 2) { |
819 | dchild = dget_parent(dparent); | 819 | dchild = dget_parent(dparent); |
820 | if (dchild == dparent) { | 820 | /* filesystem root - cannot return filehandle for ".." */ |
821 | /* filesystem root - cannot return filehandle for ".." */ | 821 | if (dchild == dparent) |
822 | dput(dchild); | 822 | goto out; |
823 | return -ENOENT; | ||
824 | } | ||
825 | } else | 823 | } else |
826 | dchild = dget(dparent); | 824 | dchild = dget(dparent); |
827 | } else | 825 | } else |
828 | dchild = lookup_one_len(name, dparent, namlen); | 826 | dchild = lookup_one_len(name, dparent, namlen); |
829 | if (IS_ERR(dchild)) | 827 | if (IS_ERR(dchild)) |
830 | return -ENOENT; | 828 | return rv; |
831 | rv = -ENOENT; | ||
832 | if (d_mountpoint(dchild)) | 829 | if (d_mountpoint(dchild)) |
833 | goto out; | 830 | goto out; |
834 | rv = fh_compose(fhp, exp, dchild, &cd->fh); | ||
835 | if (rv) | ||
836 | goto out; | ||
837 | if (!dchild->d_inode) | 831 | if (!dchild->d_inode) |
838 | goto out; | 832 | goto out; |
839 | rv = 0; | 833 | rv = fh_compose(fhp, exp, dchild, &cd->fh); |
840 | out: | 834 | out: |
841 | dput(dchild); | 835 | dput(dchild); |
842 | return rv; | 836 | return rv; |
@@ -845,7 +839,7 @@ out: | |||
845 | static __be32 *encode_entryplus_baggage(struct nfsd3_readdirres *cd, __be32 *p, const char *name, int namlen) | 839 | static __be32 *encode_entryplus_baggage(struct nfsd3_readdirres *cd, __be32 *p, const char *name, int namlen) |
846 | { | 840 | { |
847 | struct svc_fh fh; | 841 | struct svc_fh fh; |
848 | int err; | 842 | __be32 err; |
849 | 843 | ||
850 | fh_init(&fh, NFS3_FHSIZE); | 844 | fh_init(&fh, NFS3_FHSIZE); |
851 | err = compose_entry_fh(cd, &fh, name, namlen); | 845 | err = compose_entry_fh(cd, &fh, name, namlen); |
diff --git a/fs/nfsd/nfs4proc.c b/fs/nfsd/nfs4proc.c index 2ed14dfd00a2..987e719fbae8 100644 --- a/fs/nfsd/nfs4proc.c +++ b/fs/nfsd/nfs4proc.c | |||
@@ -235,17 +235,17 @@ do_open_lookup(struct svc_rqst *rqstp, struct svc_fh *current_fh, struct nfsd4_o | |||
235 | */ | 235 | */ |
236 | if (open->op_createmode == NFS4_CREATE_EXCLUSIVE && status == 0) | 236 | if (open->op_createmode == NFS4_CREATE_EXCLUSIVE && status == 0) |
237 | open->op_bmval[1] = (FATTR4_WORD1_TIME_ACCESS | | 237 | open->op_bmval[1] = (FATTR4_WORD1_TIME_ACCESS | |
238 | FATTR4_WORD1_TIME_MODIFY); | 238 | FATTR4_WORD1_TIME_MODIFY); |
239 | } else { | 239 | } else { |
240 | status = nfsd_lookup(rqstp, current_fh, | 240 | status = nfsd_lookup(rqstp, current_fh, |
241 | open->op_fname.data, open->op_fname.len, resfh); | 241 | open->op_fname.data, open->op_fname.len, resfh); |
242 | fh_unlock(current_fh); | 242 | fh_unlock(current_fh); |
243 | if (status) | ||
244 | goto out; | ||
245 | status = nfsd_check_obj_isreg(resfh); | ||
246 | } | 243 | } |
247 | if (status) | 244 | if (status) |
248 | goto out; | 245 | goto out; |
246 | status = nfsd_check_obj_isreg(resfh); | ||
247 | if (status) | ||
248 | goto out; | ||
249 | 249 | ||
250 | if (is_create_with_attrs(open) && open->op_acl != NULL) | 250 | if (is_create_with_attrs(open) && open->op_acl != NULL) |
251 | do_set_nfs4_acl(rqstp, resfh, open->op_acl, open->op_bmval); | 251 | do_set_nfs4_acl(rqstp, resfh, open->op_acl, open->op_bmval); |
@@ -841,6 +841,7 @@ nfsd4_setattr(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, | |||
841 | struct nfsd4_setattr *setattr) | 841 | struct nfsd4_setattr *setattr) |
842 | { | 842 | { |
843 | __be32 status = nfs_ok; | 843 | __be32 status = nfs_ok; |
844 | int err; | ||
844 | 845 | ||
845 | if (setattr->sa_iattr.ia_valid & ATTR_SIZE) { | 846 | if (setattr->sa_iattr.ia_valid & ATTR_SIZE) { |
846 | nfs4_lock_state(); | 847 | nfs4_lock_state(); |
@@ -852,9 +853,9 @@ nfsd4_setattr(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, | |||
852 | return status; | 853 | return status; |
853 | } | 854 | } |
854 | } | 855 | } |
855 | status = fh_want_write(&cstate->current_fh); | 856 | err = fh_want_write(&cstate->current_fh); |
856 | if (status) | 857 | if (err) |
857 | return status; | 858 | return nfserrno(err); |
858 | status = nfs_ok; | 859 | status = nfs_ok; |
859 | 860 | ||
860 | status = check_attr_support(rqstp, cstate, setattr->sa_bmval, | 861 | status = check_attr_support(rqstp, cstate, setattr->sa_bmval, |
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c index 1841f8bf845e..7f71c69cdcdf 100644 --- a/fs/nfsd/nfs4state.c +++ b/fs/nfsd/nfs4state.c | |||
@@ -4211,16 +4211,14 @@ out: | |||
4211 | * vfs_test_lock. (Arguably perhaps test_lock should be done with an | 4211 | * vfs_test_lock. (Arguably perhaps test_lock should be done with an |
4212 | * inode operation.) | 4212 | * inode operation.) |
4213 | */ | 4213 | */ |
4214 | static int nfsd_test_lock(struct svc_rqst *rqstp, struct svc_fh *fhp, struct file_lock *lock) | 4214 | static __be32 nfsd_test_lock(struct svc_rqst *rqstp, struct svc_fh *fhp, struct file_lock *lock) |
4215 | { | 4215 | { |
4216 | struct file *file; | 4216 | struct file *file; |
4217 | int err; | 4217 | __be32 err = nfsd_open(rqstp, fhp, S_IFREG, NFSD_MAY_READ, &file); |
4218 | 4218 | if (!err) { | |
4219 | err = nfsd_open(rqstp, fhp, S_IFREG, NFSD_MAY_READ, &file); | 4219 | err = nfserrno(vfs_test_lock(file, lock)); |
4220 | if (err) | 4220 | nfsd_close(file); |
4221 | return err; | 4221 | } |
4222 | err = vfs_test_lock(file, lock); | ||
4223 | nfsd_close(file); | ||
4224 | return err; | 4222 | return err; |
4225 | } | 4223 | } |
4226 | 4224 | ||
@@ -4234,7 +4232,6 @@ nfsd4_lockt(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, | |||
4234 | struct inode *inode; | 4232 | struct inode *inode; |
4235 | struct file_lock file_lock; | 4233 | struct file_lock file_lock; |
4236 | struct nfs4_lockowner *lo; | 4234 | struct nfs4_lockowner *lo; |
4237 | int error; | ||
4238 | __be32 status; | 4235 | __be32 status; |
4239 | 4236 | ||
4240 | if (locks_in_grace()) | 4237 | if (locks_in_grace()) |
@@ -4280,12 +4277,10 @@ nfsd4_lockt(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, | |||
4280 | 4277 | ||
4281 | nfs4_transform_lock_offset(&file_lock); | 4278 | nfs4_transform_lock_offset(&file_lock); |
4282 | 4279 | ||
4283 | status = nfs_ok; | 4280 | status = nfsd_test_lock(rqstp, &cstate->current_fh, &file_lock); |
4284 | error = nfsd_test_lock(rqstp, &cstate->current_fh, &file_lock); | 4281 | if (status) |
4285 | if (error) { | ||
4286 | status = nfserrno(error); | ||
4287 | goto out; | 4282 | goto out; |
4288 | } | 4283 | |
4289 | if (file_lock.fl_type != F_UNLCK) { | 4284 | if (file_lock.fl_type != F_UNLCK) { |
4290 | status = nfserr_denied; | 4285 | status = nfserr_denied; |
4291 | nfs4_set_lock_denied(&file_lock, &lockt->lt_denied); | 4286 | nfs4_set_lock_denied(&file_lock, &lockt->lt_denied); |
diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c index bcd8904ab1e3..74c00bc92b9a 100644 --- a/fs/nfsd/nfs4xdr.c +++ b/fs/nfsd/nfs4xdr.c | |||
@@ -1392,7 +1392,7 @@ nfsd4_decode_test_stateid(struct nfsd4_compoundargs *argp, struct nfsd4_test_sta | |||
1392 | for (i = 0; i < test_stateid->ts_num_ids; i++) { | 1392 | for (i = 0; i < test_stateid->ts_num_ids; i++) { |
1393 | stateid = kmalloc(sizeof(struct nfsd4_test_stateid_id), GFP_KERNEL); | 1393 | stateid = kmalloc(sizeof(struct nfsd4_test_stateid_id), GFP_KERNEL); |
1394 | if (!stateid) { | 1394 | if (!stateid) { |
1395 | status = PTR_ERR(stateid); | 1395 | status = nfserrno(-ENOMEM); |
1396 | goto out; | 1396 | goto out; |
1397 | } | 1397 | } |
1398 | 1398 | ||
@@ -3410,7 +3410,7 @@ nfsd4_encode_test_stateid(struct nfsd4_compoundres *resp, int nfserr, | |||
3410 | *p++ = htonl(test_stateid->ts_num_ids); | 3410 | *p++ = htonl(test_stateid->ts_num_ids); |
3411 | 3411 | ||
3412 | list_for_each_entry_safe(stateid, next, &test_stateid->ts_stateid_list, ts_id_list) { | 3412 | list_for_each_entry_safe(stateid, next, &test_stateid->ts_stateid_list, ts_id_list) { |
3413 | *p++ = htonl(stateid->ts_id_status); | 3413 | *p++ = stateid->ts_id_status; |
3414 | } | 3414 | } |
3415 | 3415 | ||
3416 | ADJUST_ARGS(); | 3416 | ADJUST_ARGS(); |
diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c index 296d671654d6..568666156ea4 100644 --- a/fs/nfsd/vfs.c +++ b/fs/nfsd/vfs.c | |||
@@ -1458,7 +1458,7 @@ do_nfsd_create(struct svc_rqst *rqstp, struct svc_fh *fhp, | |||
1458 | switch (createmode) { | 1458 | switch (createmode) { |
1459 | case NFS3_CREATE_UNCHECKED: | 1459 | case NFS3_CREATE_UNCHECKED: |
1460 | if (! S_ISREG(dchild->d_inode->i_mode)) | 1460 | if (! S_ISREG(dchild->d_inode->i_mode)) |
1461 | err = nfserr_exist; | 1461 | goto out; |
1462 | else if (truncp) { | 1462 | else if (truncp) { |
1463 | /* in nfsv4, we need to treat this case a little | 1463 | /* in nfsv4, we need to treat this case a little |
1464 | * differently. we don't want to truncate the | 1464 | * differently. we don't want to truncate the |
diff --git a/fs/ocfs2/alloc.c b/fs/ocfs2/alloc.c index 3165aebb43c8..31b9463fba1f 100644 --- a/fs/ocfs2/alloc.c +++ b/fs/ocfs2/alloc.c | |||
@@ -1134,7 +1134,7 @@ static int ocfs2_adjust_rightmost_branch(handle_t *handle, | |||
1134 | } | 1134 | } |
1135 | 1135 | ||
1136 | el = path_leaf_el(path); | 1136 | el = path_leaf_el(path); |
1137 | rec = &el->l_recs[le32_to_cpu(el->l_next_free_rec) - 1]; | 1137 | rec = &el->l_recs[le16_to_cpu(el->l_next_free_rec) - 1]; |
1138 | 1138 | ||
1139 | ocfs2_adjust_rightmost_records(handle, et, path, rec); | 1139 | ocfs2_adjust_rightmost_records(handle, et, path, rec); |
1140 | 1140 | ||
diff --git a/fs/ocfs2/refcounttree.c b/fs/ocfs2/refcounttree.c index cf7823382664..9f32d7cbb7a3 100644 --- a/fs/ocfs2/refcounttree.c +++ b/fs/ocfs2/refcounttree.c | |||
@@ -1036,14 +1036,14 @@ static int ocfs2_get_refcount_cpos_end(struct ocfs2_caching_info *ci, | |||
1036 | 1036 | ||
1037 | tmp_el = left_path->p_node[subtree_root].el; | 1037 | tmp_el = left_path->p_node[subtree_root].el; |
1038 | blkno = left_path->p_node[subtree_root+1].bh->b_blocknr; | 1038 | blkno = left_path->p_node[subtree_root+1].bh->b_blocknr; |
1039 | for (i = 0; i < le32_to_cpu(tmp_el->l_next_free_rec); i++) { | 1039 | for (i = 0; i < le16_to_cpu(tmp_el->l_next_free_rec); i++) { |
1040 | if (le64_to_cpu(tmp_el->l_recs[i].e_blkno) == blkno) { | 1040 | if (le64_to_cpu(tmp_el->l_recs[i].e_blkno) == blkno) { |
1041 | *cpos_end = le32_to_cpu(tmp_el->l_recs[i+1].e_cpos); | 1041 | *cpos_end = le32_to_cpu(tmp_el->l_recs[i+1].e_cpos); |
1042 | break; | 1042 | break; |
1043 | } | 1043 | } |
1044 | } | 1044 | } |
1045 | 1045 | ||
1046 | BUG_ON(i == le32_to_cpu(tmp_el->l_next_free_rec)); | 1046 | BUG_ON(i == le16_to_cpu(tmp_el->l_next_free_rec)); |
1047 | 1047 | ||
1048 | out: | 1048 | out: |
1049 | ocfs2_free_path(left_path); | 1049 | ocfs2_free_path(left_path); |
@@ -1468,7 +1468,7 @@ static int ocfs2_divide_leaf_refcount_block(struct buffer_head *ref_leaf_bh, | |||
1468 | 1468 | ||
1469 | trace_ocfs2_divide_leaf_refcount_block( | 1469 | trace_ocfs2_divide_leaf_refcount_block( |
1470 | (unsigned long long)ref_leaf_bh->b_blocknr, | 1470 | (unsigned long long)ref_leaf_bh->b_blocknr, |
1471 | le32_to_cpu(rl->rl_count), le32_to_cpu(rl->rl_used)); | 1471 | le16_to_cpu(rl->rl_count), le16_to_cpu(rl->rl_used)); |
1472 | 1472 | ||
1473 | /* | 1473 | /* |
1474 | * XXX: Improvement later. | 1474 | * XXX: Improvement later. |
@@ -2411,7 +2411,7 @@ static int ocfs2_calc_refcount_meta_credits(struct super_block *sb, | |||
2411 | rb = (struct ocfs2_refcount_block *) | 2411 | rb = (struct ocfs2_refcount_block *) |
2412 | prev_bh->b_data; | 2412 | prev_bh->b_data; |
2413 | 2413 | ||
2414 | if (le64_to_cpu(rb->rf_records.rl_used) + | 2414 | if (le16_to_cpu(rb->rf_records.rl_used) + |
2415 | recs_add > | 2415 | recs_add > |
2416 | le16_to_cpu(rb->rf_records.rl_count)) | 2416 | le16_to_cpu(rb->rf_records.rl_count)) |
2417 | ref_blocks++; | 2417 | ref_blocks++; |
@@ -2476,7 +2476,7 @@ static int ocfs2_calc_refcount_meta_credits(struct super_block *sb, | |||
2476 | if (prev_bh) { | 2476 | if (prev_bh) { |
2477 | rb = (struct ocfs2_refcount_block *)prev_bh->b_data; | 2477 | rb = (struct ocfs2_refcount_block *)prev_bh->b_data; |
2478 | 2478 | ||
2479 | if (le64_to_cpu(rb->rf_records.rl_used) + recs_add > | 2479 | if (le16_to_cpu(rb->rf_records.rl_used) + recs_add > |
2480 | le16_to_cpu(rb->rf_records.rl_count)) | 2480 | le16_to_cpu(rb->rf_records.rl_count)) |
2481 | ref_blocks++; | 2481 | ref_blocks++; |
2482 | 2482 | ||
@@ -3629,7 +3629,7 @@ int ocfs2_refcounted_xattr_delete_need(struct inode *inode, | |||
3629 | * one will split a refcount rec, so totally we need | 3629 | * one will split a refcount rec, so totally we need |
3630 | * clusters * 2 new refcount rec. | 3630 | * clusters * 2 new refcount rec. |
3631 | */ | 3631 | */ |
3632 | if (le64_to_cpu(rb->rf_records.rl_used) + clusters * 2 > | 3632 | if (le16_to_cpu(rb->rf_records.rl_used) + clusters * 2 > |
3633 | le16_to_cpu(rb->rf_records.rl_count)) | 3633 | le16_to_cpu(rb->rf_records.rl_count)) |
3634 | ref_blocks++; | 3634 | ref_blocks++; |
3635 | 3635 | ||
diff --git a/fs/ocfs2/suballoc.c b/fs/ocfs2/suballoc.c index ba5d97e4a73e..f169da4624fd 100644 --- a/fs/ocfs2/suballoc.c +++ b/fs/ocfs2/suballoc.c | |||
@@ -600,7 +600,7 @@ static void ocfs2_bg_alloc_cleanup(handle_t *handle, | |||
600 | ret = ocfs2_free_clusters(handle, cluster_ac->ac_inode, | 600 | ret = ocfs2_free_clusters(handle, cluster_ac->ac_inode, |
601 | cluster_ac->ac_bh, | 601 | cluster_ac->ac_bh, |
602 | le64_to_cpu(rec->e_blkno), | 602 | le64_to_cpu(rec->e_blkno), |
603 | le32_to_cpu(rec->e_leaf_clusters)); | 603 | le16_to_cpu(rec->e_leaf_clusters)); |
604 | if (ret) | 604 | if (ret) |
605 | mlog_errno(ret); | 605 | mlog_errno(ret); |
606 | /* Try all the clusters to free */ | 606 | /* Try all the clusters to free */ |
@@ -1628,7 +1628,7 @@ static int ocfs2_bg_discontig_fix_by_rec(struct ocfs2_suballoc_result *res, | |||
1628 | { | 1628 | { |
1629 | unsigned int bpc = le16_to_cpu(cl->cl_bpc); | 1629 | unsigned int bpc = le16_to_cpu(cl->cl_bpc); |
1630 | unsigned int bitoff = le32_to_cpu(rec->e_cpos) * bpc; | 1630 | unsigned int bitoff = le32_to_cpu(rec->e_cpos) * bpc; |
1631 | unsigned int bitcount = le32_to_cpu(rec->e_leaf_clusters) * bpc; | 1631 | unsigned int bitcount = le16_to_cpu(rec->e_leaf_clusters) * bpc; |
1632 | 1632 | ||
1633 | if (res->sr_bit_offset < bitoff) | 1633 | if (res->sr_bit_offset < bitoff) |
1634 | return 0; | 1634 | return 0; |