diff options
Diffstat (limited to 'fs')
48 files changed, 299 insertions, 309 deletions
@@ -798,29 +798,12 @@ static void aio_queue_work(struct kioctx * ctx) | |||
798 | queue_delayed_work(aio_wq, &ctx->wq, timeout); | 798 | queue_delayed_work(aio_wq, &ctx->wq, timeout); |
799 | } | 799 | } |
800 | 800 | ||
801 | |||
802 | /* | ||
803 | * aio_run_iocbs: | ||
804 | * Process all pending retries queued on the ioctx | ||
805 | * run list. | ||
806 | * Assumes it is operating within the aio issuer's mm | ||
807 | * context. | ||
808 | */ | ||
809 | static inline void aio_run_iocbs(struct kioctx *ctx) | ||
810 | { | ||
811 | int requeue; | ||
812 | |||
813 | spin_lock_irq(&ctx->ctx_lock); | ||
814 | |||
815 | requeue = __aio_run_iocbs(ctx); | ||
816 | spin_unlock_irq(&ctx->ctx_lock); | ||
817 | if (requeue) | ||
818 | aio_queue_work(ctx); | ||
819 | } | ||
820 | |||
821 | /* | 801 | /* |
822 | * just like aio_run_iocbs, but keeps running them until | 802 | * aio_run_all_iocbs: |
823 | * the list stays empty | 803 | * Process all pending retries queued on the ioctx |
804 | * run list, and keep running them until the list | ||
805 | * stays empty. | ||
806 | * Assumes it is operating within the aio issuer's mm context. | ||
824 | */ | 807 | */ |
825 | static inline void aio_run_all_iocbs(struct kioctx *ctx) | 808 | static inline void aio_run_all_iocbs(struct kioctx *ctx) |
826 | { | 809 | { |
@@ -1839,7 +1822,7 @@ SYSCALL_DEFINE5(io_getevents, aio_context_t, ctx_id, | |||
1839 | long ret = -EINVAL; | 1822 | long ret = -EINVAL; |
1840 | 1823 | ||
1841 | if (likely(ioctx)) { | 1824 | if (likely(ioctx)) { |
1842 | if (likely(min_nr <= nr && min_nr >= 0 && nr >= 0)) | 1825 | if (likely(min_nr <= nr && min_nr >= 0)) |
1843 | ret = read_events(ioctx, min_nr, nr, events, timeout); | 1826 | ret = read_events(ioctx, min_nr, nr, events, timeout); |
1844 | put_ioctx(ioctx); | 1827 | put_ioctx(ioctx); |
1845 | } | 1828 | } |
diff --git a/fs/anon_inodes.c b/fs/anon_inodes.c index 549a53cc028..cbe57f3c4d8 100644 --- a/fs/anon_inodes.c +++ b/fs/anon_inodes.c | |||
@@ -66,9 +66,9 @@ static const struct address_space_operations anon_aops = { | |||
66 | }; | 66 | }; |
67 | 67 | ||
68 | /** | 68 | /** |
69 | * anon_inode_getfd - creates a new file instance by hooking it up to an | 69 | * anon_inode_getfile - creates a new file instance by hooking it up to an |
70 | * anonymous inode, and a dentry that describe the "class" | 70 | * anonymous inode, and a dentry that describe the "class" |
71 | * of the file | 71 | * of the file |
72 | * | 72 | * |
73 | * @name: [in] name of the "class" of the new file | 73 | * @name: [in] name of the "class" of the new file |
74 | * @fops: [in] file operations for the new file | 74 | * @fops: [in] file operations for the new file |
diff --git a/fs/befs/endian.h b/fs/befs/endian.h index 6cb84d896d0..27223878ba9 100644 --- a/fs/befs/endian.h +++ b/fs/befs/endian.h | |||
@@ -102,22 +102,22 @@ cpu_to_fsrun(const struct super_block *sb, befs_block_run n) | |||
102 | } | 102 | } |
103 | 103 | ||
104 | static inline befs_data_stream | 104 | static inline befs_data_stream |
105 | fsds_to_cpu(const struct super_block *sb, befs_disk_data_stream n) | 105 | fsds_to_cpu(const struct super_block *sb, const befs_disk_data_stream *n) |
106 | { | 106 | { |
107 | befs_data_stream data; | 107 | befs_data_stream data; |
108 | int i; | 108 | int i; |
109 | 109 | ||
110 | for (i = 0; i < BEFS_NUM_DIRECT_BLOCKS; ++i) | 110 | for (i = 0; i < BEFS_NUM_DIRECT_BLOCKS; ++i) |
111 | data.direct[i] = fsrun_to_cpu(sb, n.direct[i]); | 111 | data.direct[i] = fsrun_to_cpu(sb, n->direct[i]); |
112 | 112 | ||
113 | data.max_direct_range = fs64_to_cpu(sb, n.max_direct_range); | 113 | data.max_direct_range = fs64_to_cpu(sb, n->max_direct_range); |
114 | data.indirect = fsrun_to_cpu(sb, n.indirect); | 114 | data.indirect = fsrun_to_cpu(sb, n->indirect); |
115 | data.max_indirect_range = fs64_to_cpu(sb, n.max_indirect_range); | 115 | data.max_indirect_range = fs64_to_cpu(sb, n->max_indirect_range); |
116 | data.double_indirect = fsrun_to_cpu(sb, n.double_indirect); | 116 | data.double_indirect = fsrun_to_cpu(sb, n->double_indirect); |
117 | data.max_double_indirect_range = fs64_to_cpu(sb, | 117 | data.max_double_indirect_range = fs64_to_cpu(sb, |
118 | n. | 118 | n-> |
119 | max_double_indirect_range); | 119 | max_double_indirect_range); |
120 | data.size = fs64_to_cpu(sb, n.size); | 120 | data.size = fs64_to_cpu(sb, n->size); |
121 | 121 | ||
122 | return data; | 122 | return data; |
123 | } | 123 | } |
diff --git a/fs/befs/linuxvfs.c b/fs/befs/linuxvfs.c index de93581b79a..b1d0c794747 100644 --- a/fs/befs/linuxvfs.c +++ b/fs/befs/linuxvfs.c | |||
@@ -390,7 +390,7 @@ static struct inode *befs_iget(struct super_block *sb, unsigned long ino) | |||
390 | int num_blks; | 390 | int num_blks; |
391 | 391 | ||
392 | befs_ino->i_data.ds = | 392 | befs_ino->i_data.ds = |
393 | fsds_to_cpu(sb, raw_inode->data.datastream); | 393 | fsds_to_cpu(sb, &raw_inode->data.datastream); |
394 | 394 | ||
395 | num_blks = befs_count_blocks(sb, &befs_ino->i_data.ds); | 395 | num_blks = befs_count_blocks(sb, &befs_ino->i_data.ds); |
396 | inode->i_blocks = | 396 | inode->i_blocks = |
diff --git a/fs/binfmt_elf.c b/fs/binfmt_elf.c index 6884e198e0c..d5b640ba6cb 100644 --- a/fs/binfmt_elf.c +++ b/fs/binfmt_elf.c | |||
@@ -66,12 +66,11 @@ static int elf_core_dump(struct coredump_params *cprm); | |||
66 | #define ELF_PAGEALIGN(_v) (((_v) + ELF_MIN_ALIGN - 1) & ~(ELF_MIN_ALIGN - 1)) | 66 | #define ELF_PAGEALIGN(_v) (((_v) + ELF_MIN_ALIGN - 1) & ~(ELF_MIN_ALIGN - 1)) |
67 | 67 | ||
68 | static struct linux_binfmt elf_format = { | 68 | static struct linux_binfmt elf_format = { |
69 | .module = THIS_MODULE, | 69 | .module = THIS_MODULE, |
70 | .load_binary = load_elf_binary, | 70 | .load_binary = load_elf_binary, |
71 | .load_shlib = load_elf_library, | 71 | .load_shlib = load_elf_library, |
72 | .core_dump = elf_core_dump, | 72 | .core_dump = elf_core_dump, |
73 | .min_coredump = ELF_EXEC_PAGESIZE, | 73 | .min_coredump = ELF_EXEC_PAGESIZE, |
74 | .hasvdso = 1 | ||
75 | }; | 74 | }; |
76 | 75 | ||
77 | #define BAD_ADDR(x) ((unsigned long)(x) >= TASK_SIZE) | 76 | #define BAD_ADDR(x) ((unsigned long)(x) >= TASK_SIZE) |
@@ -316,8 +315,6 @@ create_elf_tables(struct linux_binprm *bprm, struct elfhdr *exec, | |||
316 | return 0; | 315 | return 0; |
317 | } | 316 | } |
318 | 317 | ||
319 | #ifndef elf_map | ||
320 | |||
321 | static unsigned long elf_map(struct file *filep, unsigned long addr, | 318 | static unsigned long elf_map(struct file *filep, unsigned long addr, |
322 | struct elf_phdr *eppnt, int prot, int type, | 319 | struct elf_phdr *eppnt, int prot, int type, |
323 | unsigned long total_size) | 320 | unsigned long total_size) |
@@ -354,8 +351,6 @@ static unsigned long elf_map(struct file *filep, unsigned long addr, | |||
354 | return(map_addr); | 351 | return(map_addr); |
355 | } | 352 | } |
356 | 353 | ||
357 | #endif /* !elf_map */ | ||
358 | |||
359 | static unsigned long total_mapping_size(struct elf_phdr *cmds, int nr) | 354 | static unsigned long total_mapping_size(struct elf_phdr *cmds, int nr) |
360 | { | 355 | { |
361 | int i, first_idx = -1, last_idx = -1; | 356 | int i, first_idx = -1, last_idx = -1; |
@@ -421,7 +416,7 @@ static unsigned long load_elf_interp(struct elfhdr *interp_elf_ex, | |||
421 | goto out; | 416 | goto out; |
422 | 417 | ||
423 | retval = kernel_read(interpreter, interp_elf_ex->e_phoff, | 418 | retval = kernel_read(interpreter, interp_elf_ex->e_phoff, |
424 | (char *)elf_phdata,size); | 419 | (char *)elf_phdata, size); |
425 | error = -EIO; | 420 | error = -EIO; |
426 | if (retval != size) { | 421 | if (retval != size) { |
427 | if (retval < 0) | 422 | if (retval < 0) |
@@ -601,7 +596,7 @@ static int load_elf_binary(struct linux_binprm *bprm, struct pt_regs *regs) | |||
601 | goto out; | 596 | goto out; |
602 | if (!elf_check_arch(&loc->elf_ex)) | 597 | if (!elf_check_arch(&loc->elf_ex)) |
603 | goto out; | 598 | goto out; |
604 | if (!bprm->file->f_op||!bprm->file->f_op->mmap) | 599 | if (!bprm->file->f_op || !bprm->file->f_op->mmap) |
605 | goto out; | 600 | goto out; |
606 | 601 | ||
607 | /* Now read in all of the header information */ | 602 | /* Now read in all of the header information */ |
@@ -761,8 +756,8 @@ static int load_elf_binary(struct linux_binprm *bprm, struct pt_regs *regs) | |||
761 | /* There was a PT_LOAD segment with p_memsz > p_filesz | 756 | /* There was a PT_LOAD segment with p_memsz > p_filesz |
762 | before this one. Map anonymous pages, if needed, | 757 | before this one. Map anonymous pages, if needed, |
763 | and clear the area. */ | 758 | and clear the area. */ |
764 | retval = set_brk (elf_bss + load_bias, | 759 | retval = set_brk(elf_bss + load_bias, |
765 | elf_brk + load_bias); | 760 | elf_brk + load_bias); |
766 | if (retval) { | 761 | if (retval) { |
767 | send_sig(SIGKILL, current, 0); | 762 | send_sig(SIGKILL, current, 0); |
768 | goto out_free_dentry; | 763 | goto out_free_dentry; |
diff --git a/fs/ceph/Makefile b/fs/ceph/Makefile index 9e6c4f2e8ff..bd352125e82 100644 --- a/fs/ceph/Makefile +++ b/fs/ceph/Makefile | |||
@@ -2,31 +2,10 @@ | |||
2 | # Makefile for CEPH filesystem. | 2 | # Makefile for CEPH filesystem. |
3 | # | 3 | # |
4 | 4 | ||
5 | ifneq ($(KERNELRELEASE),) | ||
6 | |||
7 | obj-$(CONFIG_CEPH_FS) += ceph.o | 5 | obj-$(CONFIG_CEPH_FS) += ceph.o |
8 | 6 | ||
9 | ceph-objs := super.o inode.o dir.o file.o locks.o addr.o ioctl.o \ | 7 | ceph-y := super.o inode.o dir.o file.o locks.o addr.o ioctl.o \ |
10 | export.o caps.o snap.o xattr.o \ | 8 | export.o caps.o snap.o xattr.o \ |
11 | mds_client.o mdsmap.o strings.o ceph_frag.o \ | 9 | mds_client.o mdsmap.o strings.o ceph_frag.o \ |
12 | debugfs.o | 10 | debugfs.o |
13 | 11 | ||
14 | else | ||
15 | #Otherwise we were called directly from the command | ||
16 | # line; invoke the kernel build system. | ||
17 | |||
18 | KERNELDIR ?= /lib/modules/$(shell uname -r)/build | ||
19 | PWD := $(shell pwd) | ||
20 | |||
21 | default: all | ||
22 | |||
23 | all: | ||
24 | $(MAKE) -C $(KERNELDIR) M=$(PWD) CONFIG_CEPH_FS=m modules | ||
25 | |||
26 | modules_install: | ||
27 | $(MAKE) -C $(KERNELDIR) M=$(PWD) CONFIG_CEPH_FS=m modules_install | ||
28 | |||
29 | clean: | ||
30 | $(MAKE) -C $(KERNELDIR) M=$(PWD) clean | ||
31 | |||
32 | endif | ||
diff --git a/fs/ceph/debugfs.c b/fs/ceph/debugfs.c index 7ae1b3d55b5..08f65faac11 100644 --- a/fs/ceph/debugfs.c +++ b/fs/ceph/debugfs.c | |||
@@ -60,10 +60,13 @@ static int mdsc_show(struct seq_file *s, void *p) | |||
60 | for (rp = rb_first(&mdsc->request_tree); rp; rp = rb_next(rp)) { | 60 | for (rp = rb_first(&mdsc->request_tree); rp; rp = rb_next(rp)) { |
61 | req = rb_entry(rp, struct ceph_mds_request, r_node); | 61 | req = rb_entry(rp, struct ceph_mds_request, r_node); |
62 | 62 | ||
63 | if (req->r_request) | 63 | if (req->r_request && req->r_session) |
64 | seq_printf(s, "%lld\tmds%d\t", req->r_tid, req->r_mds); | 64 | seq_printf(s, "%lld\tmds%d\t", req->r_tid, |
65 | else | 65 | req->r_session->s_mds); |
66 | else if (!req->r_request) | ||
66 | seq_printf(s, "%lld\t(no request)\t", req->r_tid); | 67 | seq_printf(s, "%lld\t(no request)\t", req->r_tid); |
68 | else | ||
69 | seq_printf(s, "%lld\t(no session)\t", req->r_tid); | ||
67 | 70 | ||
68 | seq_printf(s, "%s", ceph_mds_op_name(req->r_op)); | 71 | seq_printf(s, "%s", ceph_mds_op_name(req->r_op)); |
69 | 72 | ||
diff --git a/fs/ceph/dir.c b/fs/ceph/dir.c index fa7ca04ee81..0bc68de8edd 100644 --- a/fs/ceph/dir.c +++ b/fs/ceph/dir.c | |||
@@ -1224,6 +1224,26 @@ void ceph_dentry_lru_del(struct dentry *dn) | |||
1224 | } | 1224 | } |
1225 | } | 1225 | } |
1226 | 1226 | ||
1227 | /* | ||
1228 | * Return name hash for a given dentry. This is dependent on | ||
1229 | * the parent directory's hash function. | ||
1230 | */ | ||
1231 | unsigned ceph_dentry_hash(struct dentry *dn) | ||
1232 | { | ||
1233 | struct inode *dir = dn->d_parent->d_inode; | ||
1234 | struct ceph_inode_info *dci = ceph_inode(dir); | ||
1235 | |||
1236 | switch (dci->i_dir_layout.dl_dir_hash) { | ||
1237 | case 0: /* for backward compat */ | ||
1238 | case CEPH_STR_HASH_LINUX: | ||
1239 | return dn->d_name.hash; | ||
1240 | |||
1241 | default: | ||
1242 | return ceph_str_hash(dci->i_dir_layout.dl_dir_hash, | ||
1243 | dn->d_name.name, dn->d_name.len); | ||
1244 | } | ||
1245 | } | ||
1246 | |||
1227 | const struct file_operations ceph_dir_fops = { | 1247 | const struct file_operations ceph_dir_fops = { |
1228 | .read = ceph_read_dir, | 1248 | .read = ceph_read_dir, |
1229 | .readdir = ceph_readdir, | 1249 | .readdir = ceph_readdir, |
diff --git a/fs/ceph/export.c b/fs/ceph/export.c index 2297d942699..e41056174bf 100644 --- a/fs/ceph/export.c +++ b/fs/ceph/export.c | |||
@@ -59,7 +59,7 @@ static int ceph_encode_fh(struct dentry *dentry, u32 *rawfh, int *max_len, | |||
59 | dout("encode_fh %p connectable\n", dentry); | 59 | dout("encode_fh %p connectable\n", dentry); |
60 | cfh->ino = ceph_ino(dentry->d_inode); | 60 | cfh->ino = ceph_ino(dentry->d_inode); |
61 | cfh->parent_ino = ceph_ino(parent->d_inode); | 61 | cfh->parent_ino = ceph_ino(parent->d_inode); |
62 | cfh->parent_name_hash = parent->d_name.hash; | 62 | cfh->parent_name_hash = ceph_dentry_hash(parent); |
63 | *max_len = connected_handle_length; | 63 | *max_len = connected_handle_length; |
64 | type = 2; | 64 | type = 2; |
65 | } else if (*max_len >= handle_length) { | 65 | } else if (*max_len >= handle_length) { |
diff --git a/fs/ceph/inode.c b/fs/ceph/inode.c index e61de4f7b99..e835eff551e 100644 --- a/fs/ceph/inode.c +++ b/fs/ceph/inode.c | |||
@@ -297,6 +297,8 @@ struct inode *ceph_alloc_inode(struct super_block *sb) | |||
297 | ci->i_release_count = 0; | 297 | ci->i_release_count = 0; |
298 | ci->i_symlink = NULL; | 298 | ci->i_symlink = NULL; |
299 | 299 | ||
300 | memset(&ci->i_dir_layout, 0, sizeof(ci->i_dir_layout)); | ||
301 | |||
300 | ci->i_fragtree = RB_ROOT; | 302 | ci->i_fragtree = RB_ROOT; |
301 | mutex_init(&ci->i_fragtree_mutex); | 303 | mutex_init(&ci->i_fragtree_mutex); |
302 | 304 | ||
@@ -689,6 +691,8 @@ static int fill_inode(struct inode *inode, | |||
689 | inode->i_op = &ceph_dir_iops; | 691 | inode->i_op = &ceph_dir_iops; |
690 | inode->i_fop = &ceph_dir_fops; | 692 | inode->i_fop = &ceph_dir_fops; |
691 | 693 | ||
694 | ci->i_dir_layout = iinfo->dir_layout; | ||
695 | |||
692 | ci->i_files = le64_to_cpu(info->files); | 696 | ci->i_files = le64_to_cpu(info->files); |
693 | ci->i_subdirs = le64_to_cpu(info->subdirs); | 697 | ci->i_subdirs = le64_to_cpu(info->subdirs); |
694 | ci->i_rbytes = le64_to_cpu(info->rbytes); | 698 | ci->i_rbytes = le64_to_cpu(info->rbytes); |
diff --git a/fs/ceph/mds_client.c b/fs/ceph/mds_client.c index a50fca1e03b..1e30d194a8e 100644 --- a/fs/ceph/mds_client.c +++ b/fs/ceph/mds_client.c | |||
@@ -60,7 +60,8 @@ static const struct ceph_connection_operations mds_con_ops; | |||
60 | * parse individual inode info | 60 | * parse individual inode info |
61 | */ | 61 | */ |
62 | static int parse_reply_info_in(void **p, void *end, | 62 | static int parse_reply_info_in(void **p, void *end, |
63 | struct ceph_mds_reply_info_in *info) | 63 | struct ceph_mds_reply_info_in *info, |
64 | int features) | ||
64 | { | 65 | { |
65 | int err = -EIO; | 66 | int err = -EIO; |
66 | 67 | ||
@@ -74,6 +75,12 @@ static int parse_reply_info_in(void **p, void *end, | |||
74 | info->symlink = *p; | 75 | info->symlink = *p; |
75 | *p += info->symlink_len; | 76 | *p += info->symlink_len; |
76 | 77 | ||
78 | if (features & CEPH_FEATURE_DIRLAYOUTHASH) | ||
79 | ceph_decode_copy_safe(p, end, &info->dir_layout, | ||
80 | sizeof(info->dir_layout), bad); | ||
81 | else | ||
82 | memset(&info->dir_layout, 0, sizeof(info->dir_layout)); | ||
83 | |||
77 | ceph_decode_32_safe(p, end, info->xattr_len, bad); | 84 | ceph_decode_32_safe(p, end, info->xattr_len, bad); |
78 | ceph_decode_need(p, end, info->xattr_len, bad); | 85 | ceph_decode_need(p, end, info->xattr_len, bad); |
79 | info->xattr_data = *p; | 86 | info->xattr_data = *p; |
@@ -88,12 +95,13 @@ bad: | |||
88 | * target inode. | 95 | * target inode. |
89 | */ | 96 | */ |
90 | static int parse_reply_info_trace(void **p, void *end, | 97 | static int parse_reply_info_trace(void **p, void *end, |
91 | struct ceph_mds_reply_info_parsed *info) | 98 | struct ceph_mds_reply_info_parsed *info, |
99 | int features) | ||
92 | { | 100 | { |
93 | int err; | 101 | int err; |
94 | 102 | ||
95 | if (info->head->is_dentry) { | 103 | if (info->head->is_dentry) { |
96 | err = parse_reply_info_in(p, end, &info->diri); | 104 | err = parse_reply_info_in(p, end, &info->diri, features); |
97 | if (err < 0) | 105 | if (err < 0) |
98 | goto out_bad; | 106 | goto out_bad; |
99 | 107 | ||
@@ -114,7 +122,7 @@ static int parse_reply_info_trace(void **p, void *end, | |||
114 | } | 122 | } |
115 | 123 | ||
116 | if (info->head->is_target) { | 124 | if (info->head->is_target) { |
117 | err = parse_reply_info_in(p, end, &info->targeti); | 125 | err = parse_reply_info_in(p, end, &info->targeti, features); |
118 | if (err < 0) | 126 | if (err < 0) |
119 | goto out_bad; | 127 | goto out_bad; |
120 | } | 128 | } |
@@ -134,7 +142,8 @@ out_bad: | |||
134 | * parse readdir results | 142 | * parse readdir results |
135 | */ | 143 | */ |
136 | static int parse_reply_info_dir(void **p, void *end, | 144 | static int parse_reply_info_dir(void **p, void *end, |
137 | struct ceph_mds_reply_info_parsed *info) | 145 | struct ceph_mds_reply_info_parsed *info, |
146 | int features) | ||
138 | { | 147 | { |
139 | u32 num, i = 0; | 148 | u32 num, i = 0; |
140 | int err; | 149 | int err; |
@@ -182,7 +191,7 @@ static int parse_reply_info_dir(void **p, void *end, | |||
182 | *p += sizeof(struct ceph_mds_reply_lease); | 191 | *p += sizeof(struct ceph_mds_reply_lease); |
183 | 192 | ||
184 | /* inode */ | 193 | /* inode */ |
185 | err = parse_reply_info_in(p, end, &info->dir_in[i]); | 194 | err = parse_reply_info_in(p, end, &info->dir_in[i], features); |
186 | if (err < 0) | 195 | if (err < 0) |
187 | goto out_bad; | 196 | goto out_bad; |
188 | i++; | 197 | i++; |
@@ -205,7 +214,8 @@ out_bad: | |||
205 | * parse fcntl F_GETLK results | 214 | * parse fcntl F_GETLK results |
206 | */ | 215 | */ |
207 | static int parse_reply_info_filelock(void **p, void *end, | 216 | static int parse_reply_info_filelock(void **p, void *end, |
208 | struct ceph_mds_reply_info_parsed *info) | 217 | struct ceph_mds_reply_info_parsed *info, |
218 | int features) | ||
209 | { | 219 | { |
210 | if (*p + sizeof(*info->filelock_reply) > end) | 220 | if (*p + sizeof(*info->filelock_reply) > end) |
211 | goto bad; | 221 | goto bad; |
@@ -225,19 +235,21 @@ bad: | |||
225 | * parse extra results | 235 | * parse extra results |
226 | */ | 236 | */ |
227 | static int parse_reply_info_extra(void **p, void *end, | 237 | static int parse_reply_info_extra(void **p, void *end, |
228 | struct ceph_mds_reply_info_parsed *info) | 238 | struct ceph_mds_reply_info_parsed *info, |
239 | int features) | ||
229 | { | 240 | { |
230 | if (info->head->op == CEPH_MDS_OP_GETFILELOCK) | 241 | if (info->head->op == CEPH_MDS_OP_GETFILELOCK) |
231 | return parse_reply_info_filelock(p, end, info); | 242 | return parse_reply_info_filelock(p, end, info, features); |
232 | else | 243 | else |
233 | return parse_reply_info_dir(p, end, info); | 244 | return parse_reply_info_dir(p, end, info, features); |
234 | } | 245 | } |
235 | 246 | ||
236 | /* | 247 | /* |
237 | * parse entire mds reply | 248 | * parse entire mds reply |
238 | */ | 249 | */ |
239 | static int parse_reply_info(struct ceph_msg *msg, | 250 | static int parse_reply_info(struct ceph_msg *msg, |
240 | struct ceph_mds_reply_info_parsed *info) | 251 | struct ceph_mds_reply_info_parsed *info, |
252 | int features) | ||
241 | { | 253 | { |
242 | void *p, *end; | 254 | void *p, *end; |
243 | u32 len; | 255 | u32 len; |
@@ -250,7 +262,7 @@ static int parse_reply_info(struct ceph_msg *msg, | |||
250 | /* trace */ | 262 | /* trace */ |
251 | ceph_decode_32_safe(&p, end, len, bad); | 263 | ceph_decode_32_safe(&p, end, len, bad); |
252 | if (len > 0) { | 264 | if (len > 0) { |
253 | err = parse_reply_info_trace(&p, p+len, info); | 265 | err = parse_reply_info_trace(&p, p+len, info, features); |
254 | if (err < 0) | 266 | if (err < 0) |
255 | goto out_bad; | 267 | goto out_bad; |
256 | } | 268 | } |
@@ -258,7 +270,7 @@ static int parse_reply_info(struct ceph_msg *msg, | |||
258 | /* extra */ | 270 | /* extra */ |
259 | ceph_decode_32_safe(&p, end, len, bad); | 271 | ceph_decode_32_safe(&p, end, len, bad); |
260 | if (len > 0) { | 272 | if (len > 0) { |
261 | err = parse_reply_info_extra(&p, p+len, info); | 273 | err = parse_reply_info_extra(&p, p+len, info, features); |
262 | if (err < 0) | 274 | if (err < 0) |
263 | goto out_bad; | 275 | goto out_bad; |
264 | } | 276 | } |
@@ -654,7 +666,7 @@ static int __choose_mds(struct ceph_mds_client *mdsc, | |||
654 | } else { | 666 | } else { |
655 | /* dir + name */ | 667 | /* dir + name */ |
656 | inode = dir; | 668 | inode = dir; |
657 | hash = req->r_dentry->d_name.hash; | 669 | hash = ceph_dentry_hash(req->r_dentry); |
658 | is_hash = true; | 670 | is_hash = true; |
659 | } | 671 | } |
660 | } | 672 | } |
@@ -1693,7 +1705,6 @@ static int __prepare_send_request(struct ceph_mds_client *mdsc, | |||
1693 | struct ceph_msg *msg; | 1705 | struct ceph_msg *msg; |
1694 | int flags = 0; | 1706 | int flags = 0; |
1695 | 1707 | ||
1696 | req->r_mds = mds; | ||
1697 | req->r_attempts++; | 1708 | req->r_attempts++; |
1698 | if (req->r_inode) { | 1709 | if (req->r_inode) { |
1699 | struct ceph_cap *cap = | 1710 | struct ceph_cap *cap = |
@@ -1780,6 +1791,8 @@ static int __do_request(struct ceph_mds_client *mdsc, | |||
1780 | goto finish; | 1791 | goto finish; |
1781 | } | 1792 | } |
1782 | 1793 | ||
1794 | put_request_session(req); | ||
1795 | |||
1783 | mds = __choose_mds(mdsc, req); | 1796 | mds = __choose_mds(mdsc, req); |
1784 | if (mds < 0 || | 1797 | if (mds < 0 || |
1785 | ceph_mdsmap_get_state(mdsc->mdsmap, mds) < CEPH_MDS_STATE_ACTIVE) { | 1798 | ceph_mdsmap_get_state(mdsc->mdsmap, mds) < CEPH_MDS_STATE_ACTIVE) { |
@@ -1797,6 +1810,8 @@ static int __do_request(struct ceph_mds_client *mdsc, | |||
1797 | goto finish; | 1810 | goto finish; |
1798 | } | 1811 | } |
1799 | } | 1812 | } |
1813 | req->r_session = get_session(session); | ||
1814 | |||
1800 | dout("do_request mds%d session %p state %s\n", mds, session, | 1815 | dout("do_request mds%d session %p state %s\n", mds, session, |
1801 | session_state_name(session->s_state)); | 1816 | session_state_name(session->s_state)); |
1802 | if (session->s_state != CEPH_MDS_SESSION_OPEN && | 1817 | if (session->s_state != CEPH_MDS_SESSION_OPEN && |
@@ -1809,7 +1824,6 @@ static int __do_request(struct ceph_mds_client *mdsc, | |||
1809 | } | 1824 | } |
1810 | 1825 | ||
1811 | /* send request */ | 1826 | /* send request */ |
1812 | req->r_session = get_session(session); | ||
1813 | req->r_resend_mds = -1; /* forget any previous mds hint */ | 1827 | req->r_resend_mds = -1; /* forget any previous mds hint */ |
1814 | 1828 | ||
1815 | if (req->r_request_started == 0) /* note request start time */ | 1829 | if (req->r_request_started == 0) /* note request start time */ |
@@ -1863,7 +1877,6 @@ static void kick_requests(struct ceph_mds_client *mdsc, int mds) | |||
1863 | if (req->r_session && | 1877 | if (req->r_session && |
1864 | req->r_session->s_mds == mds) { | 1878 | req->r_session->s_mds == mds) { |
1865 | dout(" kicking tid %llu\n", req->r_tid); | 1879 | dout(" kicking tid %llu\n", req->r_tid); |
1866 | put_request_session(req); | ||
1867 | __do_request(mdsc, req); | 1880 | __do_request(mdsc, req); |
1868 | } | 1881 | } |
1869 | } | 1882 | } |
@@ -2056,8 +2069,11 @@ static void handle_reply(struct ceph_mds_session *session, struct ceph_msg *msg) | |||
2056 | goto out; | 2069 | goto out; |
2057 | } else { | 2070 | } else { |
2058 | struct ceph_inode_info *ci = ceph_inode(req->r_inode); | 2071 | struct ceph_inode_info *ci = ceph_inode(req->r_inode); |
2059 | struct ceph_cap *cap = | 2072 | struct ceph_cap *cap = NULL; |
2060 | ceph_get_cap_for_mds(ci, req->r_mds);; | 2073 | |
2074 | if (req->r_session) | ||
2075 | cap = ceph_get_cap_for_mds(ci, | ||
2076 | req->r_session->s_mds); | ||
2061 | 2077 | ||
2062 | dout("already using auth"); | 2078 | dout("already using auth"); |
2063 | if ((!cap || cap != ci->i_auth_cap) || | 2079 | if ((!cap || cap != ci->i_auth_cap) || |
@@ -2101,7 +2117,7 @@ static void handle_reply(struct ceph_mds_session *session, struct ceph_msg *msg) | |||
2101 | 2117 | ||
2102 | dout("handle_reply tid %lld result %d\n", tid, result); | 2118 | dout("handle_reply tid %lld result %d\n", tid, result); |
2103 | rinfo = &req->r_reply_info; | 2119 | rinfo = &req->r_reply_info; |
2104 | err = parse_reply_info(msg, rinfo); | 2120 | err = parse_reply_info(msg, rinfo, session->s_con.peer_features); |
2105 | mutex_unlock(&mdsc->mutex); | 2121 | mutex_unlock(&mdsc->mutex); |
2106 | 2122 | ||
2107 | mutex_lock(&session->s_mutex); | 2123 | mutex_lock(&session->s_mutex); |
diff --git a/fs/ceph/mds_client.h b/fs/ceph/mds_client.h index aabe563b54d..4e3a9cc0bba 100644 --- a/fs/ceph/mds_client.h +++ b/fs/ceph/mds_client.h | |||
@@ -35,6 +35,7 @@ struct ceph_cap; | |||
35 | */ | 35 | */ |
36 | struct ceph_mds_reply_info_in { | 36 | struct ceph_mds_reply_info_in { |
37 | struct ceph_mds_reply_inode *in; | 37 | struct ceph_mds_reply_inode *in; |
38 | struct ceph_dir_layout dir_layout; | ||
38 | u32 symlink_len; | 39 | u32 symlink_len; |
39 | char *symlink; | 40 | char *symlink; |
40 | u32 xattr_len; | 41 | u32 xattr_len; |
@@ -165,7 +166,6 @@ struct ceph_mds_request { | |||
165 | struct ceph_mds_client *r_mdsc; | 166 | struct ceph_mds_client *r_mdsc; |
166 | 167 | ||
167 | int r_op; /* mds op code */ | 168 | int r_op; /* mds op code */ |
168 | int r_mds; | ||
169 | 169 | ||
170 | /* operation on what? */ | 170 | /* operation on what? */ |
171 | struct inode *r_inode; /* arg1 */ | 171 | struct inode *r_inode; /* arg1 */ |
diff --git a/fs/ceph/super.c b/fs/ceph/super.c index 08b460ae053..bf6f0f34082 100644 --- a/fs/ceph/super.c +++ b/fs/ceph/super.c | |||
@@ -428,7 +428,8 @@ struct ceph_fs_client *create_fs_client(struct ceph_mount_options *fsopt, | |||
428 | goto fail; | 428 | goto fail; |
429 | } | 429 | } |
430 | fsc->client->extra_mon_dispatch = extra_mon_dispatch; | 430 | fsc->client->extra_mon_dispatch = extra_mon_dispatch; |
431 | fsc->client->supported_features |= CEPH_FEATURE_FLOCK; | 431 | fsc->client->supported_features |= CEPH_FEATURE_FLOCK | |
432 | CEPH_FEATURE_DIRLAYOUTHASH; | ||
432 | fsc->client->monc.want_mdsmap = 1; | 433 | fsc->client->monc.want_mdsmap = 1; |
433 | 434 | ||
434 | fsc->mount_options = fsopt; | 435 | fsc->mount_options = fsopt; |
@@ -443,13 +444,17 @@ struct ceph_fs_client *create_fs_client(struct ceph_mount_options *fsopt, | |||
443 | goto fail_client; | 444 | goto fail_client; |
444 | 445 | ||
445 | err = -ENOMEM; | 446 | err = -ENOMEM; |
446 | fsc->wb_wq = create_workqueue("ceph-writeback"); | 447 | /* |
448 | * The number of concurrent works can be high but they don't need | ||
449 | * to be processed in parallel, limit concurrency. | ||
450 | */ | ||
451 | fsc->wb_wq = alloc_workqueue("ceph-writeback", 0, 1); | ||
447 | if (fsc->wb_wq == NULL) | 452 | if (fsc->wb_wq == NULL) |
448 | goto fail_bdi; | 453 | goto fail_bdi; |
449 | fsc->pg_inv_wq = create_singlethread_workqueue("ceph-pg-invalid"); | 454 | fsc->pg_inv_wq = alloc_workqueue("ceph-pg-invalid", 0, 1); |
450 | if (fsc->pg_inv_wq == NULL) | 455 | if (fsc->pg_inv_wq == NULL) |
451 | goto fail_wb_wq; | 456 | goto fail_wb_wq; |
452 | fsc->trunc_wq = create_singlethread_workqueue("ceph-trunc"); | 457 | fsc->trunc_wq = alloc_workqueue("ceph-trunc", 0, 1); |
453 | if (fsc->trunc_wq == NULL) | 458 | if (fsc->trunc_wq == NULL) |
454 | goto fail_pg_inv_wq; | 459 | goto fail_pg_inv_wq; |
455 | 460 | ||
diff --git a/fs/ceph/super.h b/fs/ceph/super.h index 4553d8829ed..20b907d76ae 100644 --- a/fs/ceph/super.h +++ b/fs/ceph/super.h | |||
@@ -239,6 +239,7 @@ struct ceph_inode_info { | |||
239 | unsigned i_ceph_flags; | 239 | unsigned i_ceph_flags; |
240 | unsigned long i_release_count; | 240 | unsigned long i_release_count; |
241 | 241 | ||
242 | struct ceph_dir_layout i_dir_layout; | ||
242 | struct ceph_file_layout i_layout; | 243 | struct ceph_file_layout i_layout; |
243 | char *i_symlink; | 244 | char *i_symlink; |
244 | 245 | ||
@@ -768,6 +769,7 @@ extern void ceph_dentry_lru_add(struct dentry *dn); | |||
768 | extern void ceph_dentry_lru_touch(struct dentry *dn); | 769 | extern void ceph_dentry_lru_touch(struct dentry *dn); |
769 | extern void ceph_dentry_lru_del(struct dentry *dn); | 770 | extern void ceph_dentry_lru_del(struct dentry *dn); |
770 | extern void ceph_invalidate_dentry_lease(struct dentry *dentry); | 771 | extern void ceph_invalidate_dentry_lease(struct dentry *dentry); |
772 | extern unsigned ceph_dentry_hash(struct dentry *dn); | ||
771 | 773 | ||
772 | /* | 774 | /* |
773 | * our d_ops vary depending on whether the inode is live, | 775 | * our d_ops vary depending on whether the inode is live, |
diff --git a/fs/char_dev.c b/fs/char_dev.c index e5b9df993b9..6e99b9ddd4e 100644 --- a/fs/char_dev.c +++ b/fs/char_dev.c | |||
@@ -417,18 +417,6 @@ static int chrdev_open(struct inode *inode, struct file *filp) | |||
417 | return ret; | 417 | return ret; |
418 | } | 418 | } |
419 | 419 | ||
420 | int cdev_index(struct inode *inode) | ||
421 | { | ||
422 | int idx; | ||
423 | struct kobject *kobj; | ||
424 | |||
425 | kobj = kobj_lookup(cdev_map, inode->i_rdev, &idx); | ||
426 | if (!kobj) | ||
427 | return -1; | ||
428 | kobject_put(kobj); | ||
429 | return idx; | ||
430 | } | ||
431 | |||
432 | void cd_forget(struct inode *inode) | 420 | void cd_forget(struct inode *inode) |
433 | { | 421 | { |
434 | spin_lock(&cdev_lock); | 422 | spin_lock(&cdev_lock); |
@@ -582,7 +570,6 @@ EXPORT_SYMBOL(cdev_init); | |||
582 | EXPORT_SYMBOL(cdev_alloc); | 570 | EXPORT_SYMBOL(cdev_alloc); |
583 | EXPORT_SYMBOL(cdev_del); | 571 | EXPORT_SYMBOL(cdev_del); |
584 | EXPORT_SYMBOL(cdev_add); | 572 | EXPORT_SYMBOL(cdev_add); |
585 | EXPORT_SYMBOL(cdev_index); | ||
586 | EXPORT_SYMBOL(__register_chrdev); | 573 | EXPORT_SYMBOL(__register_chrdev); |
587 | EXPORT_SYMBOL(__unregister_chrdev); | 574 | EXPORT_SYMBOL(__unregister_chrdev); |
588 | EXPORT_SYMBOL(directly_mappable_cdev_bdi); | 575 | EXPORT_SYMBOL(directly_mappable_cdev_bdi); |
diff --git a/fs/coda/inode.c b/fs/coda/inode.c index 261d86f9cae..871b2771546 100644 --- a/fs/coda/inode.c +++ b/fs/coda/inode.c | |||
@@ -44,7 +44,7 @@ static struct kmem_cache * coda_inode_cachep; | |||
44 | static struct inode *coda_alloc_inode(struct super_block *sb) | 44 | static struct inode *coda_alloc_inode(struct super_block *sb) |
45 | { | 45 | { |
46 | struct coda_inode_info *ei; | 46 | struct coda_inode_info *ei; |
47 | ei = (struct coda_inode_info *)kmem_cache_alloc(coda_inode_cachep, GFP_KERNEL); | 47 | ei = kmem_cache_alloc(coda_inode_cachep, GFP_KERNEL); |
48 | if (!ei) | 48 | if (!ei) |
49 | return NULL; | 49 | return NULL; |
50 | memset(&ei->c_fid, 0, sizeof(struct CodaFid)); | 50 | memset(&ei->c_fid, 0, sizeof(struct CodaFid)); |
diff --git a/fs/cramfs/inode.c b/fs/cramfs/inode.c index 32fd5fe9ca0..e141939080f 100644 --- a/fs/cramfs/inode.c +++ b/fs/cramfs/inode.c | |||
@@ -34,57 +34,81 @@ static const struct address_space_operations cramfs_aops; | |||
34 | static DEFINE_MUTEX(read_mutex); | 34 | static DEFINE_MUTEX(read_mutex); |
35 | 35 | ||
36 | 36 | ||
37 | /* These two macros may change in future, to provide better st_ino | 37 | /* These macros may change in future, to provide better st_ino semantics. */ |
38 | semantics. */ | ||
39 | #define CRAMINO(x) (((x)->offset && (x)->size)?(x)->offset<<2:1) | ||
40 | #define OFFSET(x) ((x)->i_ino) | 38 | #define OFFSET(x) ((x)->i_ino) |
41 | 39 | ||
42 | static void setup_inode(struct inode *inode, struct cramfs_inode * cramfs_inode) | 40 | static unsigned long cramino(struct cramfs_inode *cino, unsigned int offset) |
43 | { | 41 | { |
42 | if (!cino->offset) | ||
43 | return offset + 1; | ||
44 | if (!cino->size) | ||
45 | return offset + 1; | ||
46 | |||
47 | /* | ||
48 | * The file mode test fixes buggy mkcramfs implementations where | ||
49 | * cramfs_inode->offset is set to a non zero value for entries | ||
50 | * which did not contain data, like devices node and fifos. | ||
51 | */ | ||
52 | switch (cino->mode & S_IFMT) { | ||
53 | case S_IFREG: | ||
54 | case S_IFDIR: | ||
55 | case S_IFLNK: | ||
56 | return cino->offset << 2; | ||
57 | default: | ||
58 | break; | ||
59 | } | ||
60 | return offset + 1; | ||
61 | } | ||
62 | |||
63 | static struct inode *get_cramfs_inode(struct super_block *sb, | ||
64 | struct cramfs_inode *cramfs_inode, unsigned int offset) | ||
65 | { | ||
66 | struct inode *inode; | ||
44 | static struct timespec zerotime; | 67 | static struct timespec zerotime; |
68 | |||
69 | inode = iget_locked(sb, cramino(cramfs_inode, offset)); | ||
70 | if (!inode) | ||
71 | return ERR_PTR(-ENOMEM); | ||
72 | if (!(inode->i_state & I_NEW)) | ||
73 | return inode; | ||
74 | |||
75 | switch (cramfs_inode->mode & S_IFMT) { | ||
76 | case S_IFREG: | ||
77 | inode->i_fop = &generic_ro_fops; | ||
78 | inode->i_data.a_ops = &cramfs_aops; | ||
79 | break; | ||
80 | case S_IFDIR: | ||
81 | inode->i_op = &cramfs_dir_inode_operations; | ||
82 | inode->i_fop = &cramfs_directory_operations; | ||
83 | break; | ||
84 | case S_IFLNK: | ||
85 | inode->i_op = &page_symlink_inode_operations; | ||
86 | inode->i_data.a_ops = &cramfs_aops; | ||
87 | break; | ||
88 | default: | ||
89 | init_special_inode(inode, cramfs_inode->mode, | ||
90 | old_decode_dev(cramfs_inode->size)); | ||
91 | } | ||
92 | |||
45 | inode->i_mode = cramfs_inode->mode; | 93 | inode->i_mode = cramfs_inode->mode; |
46 | inode->i_uid = cramfs_inode->uid; | 94 | inode->i_uid = cramfs_inode->uid; |
47 | inode->i_size = cramfs_inode->size; | ||
48 | inode->i_blocks = (cramfs_inode->size - 1) / 512 + 1; | ||
49 | inode->i_gid = cramfs_inode->gid; | 95 | inode->i_gid = cramfs_inode->gid; |
96 | |||
97 | /* if the lower 2 bits are zero, the inode contains data */ | ||
98 | if (!(inode->i_ino & 3)) { | ||
99 | inode->i_size = cramfs_inode->size; | ||
100 | inode->i_blocks = (cramfs_inode->size - 1) / 512 + 1; | ||
101 | } | ||
102 | |||
50 | /* Struct copy intentional */ | 103 | /* Struct copy intentional */ |
51 | inode->i_mtime = inode->i_atime = inode->i_ctime = zerotime; | 104 | inode->i_mtime = inode->i_atime = inode->i_ctime = zerotime; |
52 | /* inode->i_nlink is left 1 - arguably wrong for directories, | 105 | /* inode->i_nlink is left 1 - arguably wrong for directories, |
53 | but it's the best we can do without reading the directory | 106 | but it's the best we can do without reading the directory |
54 | contents. 1 yields the right result in GNU find, even | 107 | contents. 1 yields the right result in GNU find, even |
55 | without -noleaf option. */ | 108 | without -noleaf option. */ |
56 | if (S_ISREG(inode->i_mode)) { | ||
57 | inode->i_fop = &generic_ro_fops; | ||
58 | inode->i_data.a_ops = &cramfs_aops; | ||
59 | } else if (S_ISDIR(inode->i_mode)) { | ||
60 | inode->i_op = &cramfs_dir_inode_operations; | ||
61 | inode->i_fop = &cramfs_directory_operations; | ||
62 | } else if (S_ISLNK(inode->i_mode)) { | ||
63 | inode->i_op = &page_symlink_inode_operations; | ||
64 | inode->i_data.a_ops = &cramfs_aops; | ||
65 | } else { | ||
66 | init_special_inode(inode, inode->i_mode, | ||
67 | old_decode_dev(cramfs_inode->size)); | ||
68 | } | ||
69 | } | ||
70 | 109 | ||
71 | static struct inode *get_cramfs_inode(struct super_block *sb, | 110 | unlock_new_inode(inode); |
72 | struct cramfs_inode * cramfs_inode) | 111 | |
73 | { | ||
74 | struct inode *inode; | ||
75 | if (CRAMINO(cramfs_inode) == 1) { | ||
76 | inode = new_inode(sb); | ||
77 | if (inode) { | ||
78 | inode->i_ino = 1; | ||
79 | setup_inode(inode, cramfs_inode); | ||
80 | } | ||
81 | } else { | ||
82 | inode = iget_locked(sb, CRAMINO(cramfs_inode)); | ||
83 | if (inode && (inode->i_state & I_NEW)) { | ||
84 | setup_inode(inode, cramfs_inode); | ||
85 | unlock_new_inode(inode); | ||
86 | } | ||
87 | } | ||
88 | return inode; | 112 | return inode; |
89 | } | 113 | } |
90 | 114 | ||
@@ -265,6 +289,9 @@ static int cramfs_fill_super(struct super_block *sb, void *data, int silent) | |||
265 | printk(KERN_ERR "cramfs: root is not a directory\n"); | 289 | printk(KERN_ERR "cramfs: root is not a directory\n"); |
266 | goto out; | 290 | goto out; |
267 | } | 291 | } |
292 | /* correct strange, hard-coded permissions of mkcramfs */ | ||
293 | super.root.mode |= (S_IRUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH); | ||
294 | |||
268 | root_offset = super.root.offset << 2; | 295 | root_offset = super.root.offset << 2; |
269 | if (super.flags & CRAMFS_FLAG_FSID_VERSION_2) { | 296 | if (super.flags & CRAMFS_FLAG_FSID_VERSION_2) { |
270 | sbi->size=super.size; | 297 | sbi->size=super.size; |
@@ -289,7 +316,7 @@ static int cramfs_fill_super(struct super_block *sb, void *data, int silent) | |||
289 | 316 | ||
290 | /* Set it all up.. */ | 317 | /* Set it all up.. */ |
291 | sb->s_op = &cramfs_ops; | 318 | sb->s_op = &cramfs_ops; |
292 | root = get_cramfs_inode(sb, &super.root); | 319 | root = get_cramfs_inode(sb, &super.root, 0); |
293 | if (!root) | 320 | if (!root) |
294 | goto out; | 321 | goto out; |
295 | sb->s_root = d_alloc_root(root); | 322 | sb->s_root = d_alloc_root(root); |
@@ -365,7 +392,7 @@ static int cramfs_readdir(struct file *filp, void *dirent, filldir_t filldir) | |||
365 | */ | 392 | */ |
366 | namelen = de->namelen << 2; | 393 | namelen = de->namelen << 2; |
367 | memcpy(buf, name, namelen); | 394 | memcpy(buf, name, namelen); |
368 | ino = CRAMINO(de); | 395 | ino = cramino(de, OFFSET(inode) + offset); |
369 | mode = de->mode; | 396 | mode = de->mode; |
370 | mutex_unlock(&read_mutex); | 397 | mutex_unlock(&read_mutex); |
371 | nextoffset = offset + sizeof(*de) + namelen; | 398 | nextoffset = offset + sizeof(*de) + namelen; |
@@ -404,8 +431,9 @@ static struct dentry * cramfs_lookup(struct inode *dir, struct dentry *dentry, s | |||
404 | struct cramfs_inode *de; | 431 | struct cramfs_inode *de; |
405 | char *name; | 432 | char *name; |
406 | int namelen, retval; | 433 | int namelen, retval; |
434 | int dir_off = OFFSET(dir) + offset; | ||
407 | 435 | ||
408 | de = cramfs_read(dir->i_sb, OFFSET(dir) + offset, sizeof(*de)+CRAMFS_MAXPATHLEN); | 436 | de = cramfs_read(dir->i_sb, dir_off, sizeof(*de)+CRAMFS_MAXPATHLEN); |
409 | name = (char *)(de+1); | 437 | name = (char *)(de+1); |
410 | 438 | ||
411 | /* Try to take advantage of sorted directories */ | 439 | /* Try to take advantage of sorted directories */ |
@@ -436,7 +464,7 @@ static struct dentry * cramfs_lookup(struct inode *dir, struct dentry *dentry, s | |||
436 | if (!retval) { | 464 | if (!retval) { |
437 | struct cramfs_inode entry = *de; | 465 | struct cramfs_inode entry = *de; |
438 | mutex_unlock(&read_mutex); | 466 | mutex_unlock(&read_mutex); |
439 | d_add(dentry, get_cramfs_inode(dir->i_sb, &entry)); | 467 | d_add(dentry, get_cramfs_inode(dir->i_sb, &entry, dir_off)); |
440 | return NULL; | 468 | return NULL; |
441 | } | 469 | } |
442 | /* else (retval < 0) */ | 470 | /* else (retval < 0) */ |
diff --git a/fs/eventpoll.c b/fs/eventpoll.c index 8cf07242067..cc8a9b7d606 100644 --- a/fs/eventpoll.c +++ b/fs/eventpoll.c | |||
@@ -217,7 +217,7 @@ struct ep_send_events_data { | |||
217 | * Configuration options available inside /proc/sys/fs/epoll/ | 217 | * Configuration options available inside /proc/sys/fs/epoll/ |
218 | */ | 218 | */ |
219 | /* Maximum number of epoll watched descriptors, per user */ | 219 | /* Maximum number of epoll watched descriptors, per user */ |
220 | static int max_user_watches __read_mostly; | 220 | static long max_user_watches __read_mostly; |
221 | 221 | ||
222 | /* | 222 | /* |
223 | * This mutex is used to serialize ep_free() and eventpoll_release_file(). | 223 | * This mutex is used to serialize ep_free() and eventpoll_release_file(). |
@@ -240,16 +240,18 @@ static struct kmem_cache *pwq_cache __read_mostly; | |||
240 | 240 | ||
241 | #include <linux/sysctl.h> | 241 | #include <linux/sysctl.h> |
242 | 242 | ||
243 | static int zero; | 243 | static long zero; |
244 | static long long_max = LONG_MAX; | ||
244 | 245 | ||
245 | ctl_table epoll_table[] = { | 246 | ctl_table epoll_table[] = { |
246 | { | 247 | { |
247 | .procname = "max_user_watches", | 248 | .procname = "max_user_watches", |
248 | .data = &max_user_watches, | 249 | .data = &max_user_watches, |
249 | .maxlen = sizeof(int), | 250 | .maxlen = sizeof(max_user_watches), |
250 | .mode = 0644, | 251 | .mode = 0644, |
251 | .proc_handler = proc_dointvec_minmax, | 252 | .proc_handler = proc_doulongvec_minmax, |
252 | .extra1 = &zero, | 253 | .extra1 = &zero, |
254 | .extra2 = &long_max, | ||
253 | }, | 255 | }, |
254 | { } | 256 | { } |
255 | }; | 257 | }; |
@@ -561,7 +563,7 @@ static int ep_remove(struct eventpoll *ep, struct epitem *epi) | |||
561 | /* At this point it is safe to free the eventpoll item */ | 563 | /* At this point it is safe to free the eventpoll item */ |
562 | kmem_cache_free(epi_cache, epi); | 564 | kmem_cache_free(epi_cache, epi); |
563 | 565 | ||
564 | atomic_dec(&ep->user->epoll_watches); | 566 | atomic_long_dec(&ep->user->epoll_watches); |
565 | 567 | ||
566 | return 0; | 568 | return 0; |
567 | } | 569 | } |
@@ -898,11 +900,12 @@ static int ep_insert(struct eventpoll *ep, struct epoll_event *event, | |||
898 | { | 900 | { |
899 | int error, revents, pwake = 0; | 901 | int error, revents, pwake = 0; |
900 | unsigned long flags; | 902 | unsigned long flags; |
903 | long user_watches; | ||
901 | struct epitem *epi; | 904 | struct epitem *epi; |
902 | struct ep_pqueue epq; | 905 | struct ep_pqueue epq; |
903 | 906 | ||
904 | if (unlikely(atomic_read(&ep->user->epoll_watches) >= | 907 | user_watches = atomic_long_read(&ep->user->epoll_watches); |
905 | max_user_watches)) | 908 | if (unlikely(user_watches >= max_user_watches)) |
906 | return -ENOSPC; | 909 | return -ENOSPC; |
907 | if (!(epi = kmem_cache_alloc(epi_cache, GFP_KERNEL))) | 910 | if (!(epi = kmem_cache_alloc(epi_cache, GFP_KERNEL))) |
908 | return -ENOMEM; | 911 | return -ENOMEM; |
@@ -966,7 +969,7 @@ static int ep_insert(struct eventpoll *ep, struct epoll_event *event, | |||
966 | 969 | ||
967 | spin_unlock_irqrestore(&ep->lock, flags); | 970 | spin_unlock_irqrestore(&ep->lock, flags); |
968 | 971 | ||
969 | atomic_inc(&ep->user->epoll_watches); | 972 | atomic_long_inc(&ep->user->epoll_watches); |
970 | 973 | ||
971 | /* We have to call this outside the lock */ | 974 | /* We have to call this outside the lock */ |
972 | if (pwake) | 975 | if (pwake) |
@@ -1426,6 +1429,7 @@ static int __init eventpoll_init(void) | |||
1426 | */ | 1429 | */ |
1427 | max_user_watches = (((si.totalram - si.totalhigh) / 25) << PAGE_SHIFT) / | 1430 | max_user_watches = (((si.totalram - si.totalhigh) / 25) << PAGE_SHIFT) / |
1428 | EP_ITEM_COST; | 1431 | EP_ITEM_COST; |
1432 | BUG_ON(max_user_watches < 0); | ||
1429 | 1433 | ||
1430 | /* Initialize the structure used to perform safe poll wait head wake ups */ | 1434 | /* Initialize the structure used to perform safe poll wait head wake ups */ |
1431 | ep_nested_calls_init(&poll_safewake_ncalls); | 1435 | ep_nested_calls_init(&poll_safewake_ncalls); |
diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h index bab2387fba4..1de65f57203 100644 --- a/fs/ext4/ext4.h +++ b/fs/ext4/ext4.h | |||
@@ -561,7 +561,7 @@ struct ext4_new_group_data { | |||
561 | #define EXT4_IOC32_SETVERSION_OLD FS_IOC32_SETVERSION | 561 | #define EXT4_IOC32_SETVERSION_OLD FS_IOC32_SETVERSION |
562 | #endif | 562 | #endif |
563 | 563 | ||
564 | /* Max physical block we can addres w/o extents */ | 564 | /* Max physical block we can address w/o extents */ |
565 | #define EXT4_MAX_BLOCK_FILE_PHYS 0xFFFFFFFF | 565 | #define EXT4_MAX_BLOCK_FILE_PHYS 0xFFFFFFFF |
566 | 566 | ||
567 | /* | 567 | /* |
diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c index 2e061dffb72..c4068f6abf0 100644 --- a/fs/ext4/extents.c +++ b/fs/ext4/extents.c | |||
@@ -2845,14 +2845,14 @@ fix_extent_len: | |||
2845 | * to an uninitialized extent. | 2845 | * to an uninitialized extent. |
2846 | * | 2846 | * |
2847 | * Writing to an uninitized extent may result in splitting the uninitialized | 2847 | * Writing to an uninitized extent may result in splitting the uninitialized |
2848 | * extent into multiple /intialized unintialized extents (up to three) | 2848 | * extent into multiple /initialized uninitialized extents (up to three) |
2849 | * There are three possibilities: | 2849 | * There are three possibilities: |
2850 | * a> There is no split required: Entire extent should be uninitialized | 2850 | * a> There is no split required: Entire extent should be uninitialized |
2851 | * b> Splits in two extents: Write is happening at either end of the extent | 2851 | * b> Splits in two extents: Write is happening at either end of the extent |
2852 | * c> Splits in three extents: Somone is writing in middle of the extent | 2852 | * c> Splits in three extents: Somone is writing in middle of the extent |
2853 | * | 2853 | * |
2854 | * One of more index blocks maybe needed if the extent tree grow after | 2854 | * One of more index blocks maybe needed if the extent tree grow after |
2855 | * the unintialized extent split. To prevent ENOSPC occur at the IO | 2855 | * the uninitialized extent split. To prevent ENOSPC occur at the IO |
2856 | * complete, we need to split the uninitialized extent before DIO submit | 2856 | * complete, we need to split the uninitialized extent before DIO submit |
2857 | * the IO. The uninitialized extent called at this time will be split | 2857 | * the IO. The uninitialized extent called at this time will be split |
2858 | * into three uninitialized extent(at most). After IO complete, the part | 2858 | * into three uninitialized extent(at most). After IO complete, the part |
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index e80fc513eac..9f7f9e49914 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c | |||
@@ -39,6 +39,7 @@ | |||
39 | #include <linux/bio.h> | 39 | #include <linux/bio.h> |
40 | #include <linux/workqueue.h> | 40 | #include <linux/workqueue.h> |
41 | #include <linux/kernel.h> | 41 | #include <linux/kernel.h> |
42 | #include <linux/printk.h> | ||
42 | #include <linux/slab.h> | 43 | #include <linux/slab.h> |
43 | #include <linux/ratelimit.h> | 44 | #include <linux/ratelimit.h> |
44 | 45 | ||
@@ -3379,7 +3380,7 @@ int ext4_alloc_da_blocks(struct inode *inode) | |||
3379 | * doing I/O at all. | 3380 | * doing I/O at all. |
3380 | * | 3381 | * |
3381 | * We could call write_cache_pages(), and then redirty all of | 3382 | * We could call write_cache_pages(), and then redirty all of |
3382 | * the pages by calling redirty_page_for_writeback() but that | 3383 | * the pages by calling redirty_page_for_writepage() but that |
3383 | * would be ugly in the extreme. So instead we would need to | 3384 | * would be ugly in the extreme. So instead we would need to |
3384 | * replicate parts of the code in the above functions, | 3385 | * replicate parts of the code in the above functions, |
3385 | * simplifying them becuase we wouldn't actually intend to | 3386 | * simplifying them becuase we wouldn't actually intend to |
@@ -3737,7 +3738,7 @@ static int ext4_set_bh_endio(struct buffer_head *bh, struct inode *inode) | |||
3737 | retry: | 3738 | retry: |
3738 | io_end = ext4_init_io_end(inode, GFP_ATOMIC); | 3739 | io_end = ext4_init_io_end(inode, GFP_ATOMIC); |
3739 | if (!io_end) { | 3740 | if (!io_end) { |
3740 | pr_warning_ratelimited("%s: allocation fail\n", __func__); | 3741 | pr_warn_ratelimited("%s: allocation fail\n", __func__); |
3741 | schedule(); | 3742 | schedule(); |
3742 | goto retry; | 3743 | goto retry; |
3743 | } | 3744 | } |
@@ -3761,9 +3762,9 @@ retry: | |||
3761 | * preallocated extents, and those write extend the file, no need to | 3762 | * preallocated extents, and those write extend the file, no need to |
3762 | * fall back to buffered IO. | 3763 | * fall back to buffered IO. |
3763 | * | 3764 | * |
3764 | * For holes, we fallocate those blocks, mark them as unintialized | 3765 | * For holes, we fallocate those blocks, mark them as uninitialized |
3765 | * If those blocks were preallocated, we mark sure they are splited, but | 3766 | * If those blocks were preallocated, we mark sure they are splited, but |
3766 | * still keep the range to write as unintialized. | 3767 | * still keep the range to write as uninitialized. |
3767 | * | 3768 | * |
3768 | * The unwrritten extents will be converted to written when DIO is completed. | 3769 | * The unwrritten extents will be converted to written when DIO is completed. |
3769 | * For async direct IO, since the IO may still pending when return, we | 3770 | * For async direct IO, since the IO may still pending when return, we |
diff --git a/fs/jbd/transaction.c b/fs/jbd/transaction.c index 846a3f31411..5b2e4c30a2a 100644 --- a/fs/jbd/transaction.c +++ b/fs/jbd/transaction.c | |||
@@ -207,7 +207,7 @@ repeat_locked: | |||
207 | * the committing transaction. Really, we only need to give it | 207 | * the committing transaction. Really, we only need to give it |
208 | * committing_transaction->t_outstanding_credits plus "enough" for | 208 | * committing_transaction->t_outstanding_credits plus "enough" for |
209 | * the log control blocks. | 209 | * the log control blocks. |
210 | * Also, this test is inconsitent with the matching one in | 210 | * Also, this test is inconsistent with the matching one in |
211 | * journal_extend(). | 211 | * journal_extend(). |
212 | */ | 212 | */ |
213 | if (__log_space_left(journal) < jbd_space_needed(journal)) { | 213 | if (__log_space_left(journal) < jbd_space_needed(journal)) { |
diff --git a/fs/jbd2/transaction.c b/fs/jbd2/transaction.c index 394893242ae..faad2bd787c 100644 --- a/fs/jbd2/transaction.c +++ b/fs/jbd2/transaction.c | |||
@@ -251,7 +251,7 @@ repeat: | |||
251 | * the committing transaction. Really, we only need to give it | 251 | * the committing transaction. Really, we only need to give it |
252 | * committing_transaction->t_outstanding_credits plus "enough" for | 252 | * committing_transaction->t_outstanding_credits plus "enough" for |
253 | * the log control blocks. | 253 | * the log control blocks. |
254 | * Also, this test is inconsitent with the matching one in | 254 | * Also, this test is inconsistent with the matching one in |
255 | * jbd2_journal_extend(). | 255 | * jbd2_journal_extend(). |
256 | */ | 256 | */ |
257 | if (__jbd2_log_space_left(journal) < jbd_space_needed(journal)) { | 257 | if (__jbd2_log_space_left(journal) < jbd_space_needed(journal)) { |
diff --git a/fs/notify/fanotify/Kconfig b/fs/notify/fanotify/Kconfig index 3ac36b7bf6b..7dceff005a6 100644 --- a/fs/notify/fanotify/Kconfig +++ b/fs/notify/fanotify/Kconfig | |||
@@ -6,7 +6,7 @@ config FANOTIFY | |||
6 | ---help--- | 6 | ---help--- |
7 | Say Y here to enable fanotify suport. fanotify is a file access | 7 | Say Y here to enable fanotify suport. fanotify is a file access |
8 | notification system which differs from inotify in that it sends | 8 | notification system which differs from inotify in that it sends |
9 | and open file descriptor to the userspace listener along with | 9 | an open file descriptor to the userspace listener along with |
10 | the event. | 10 | the event. |
11 | 11 | ||
12 | If unsure, say Y. | 12 | If unsure, say Y. |
diff --git a/fs/ntfs/Makefile b/fs/ntfs/Makefile index 58b6be99254..4ff028fcfd6 100644 --- a/fs/ntfs/Makefile +++ b/fs/ntfs/Makefile | |||
@@ -6,7 +6,7 @@ ntfs-objs := aops.o attrib.o collate.o compress.o debug.o dir.o file.o \ | |||
6 | index.o inode.o mft.o mst.o namei.o runlist.o super.o sysctl.o \ | 6 | index.o inode.o mft.o mst.o namei.o runlist.o super.o sysctl.o \ |
7 | unistr.o upcase.o | 7 | unistr.o upcase.o |
8 | 8 | ||
9 | EXTRA_CFLAGS = -DNTFS_VERSION=\"2.1.29\" | 9 | EXTRA_CFLAGS = -DNTFS_VERSION=\"2.1.30\" |
10 | 10 | ||
11 | ifeq ($(CONFIG_NTFS_DEBUG),y) | 11 | ifeq ($(CONFIG_NTFS_DEBUG),y) |
12 | EXTRA_CFLAGS += -DDEBUG | 12 | EXTRA_CFLAGS += -DDEBUG |
diff --git a/fs/ntfs/file.c b/fs/ntfs/file.c index 113ebd9f25a..f4b1057abdd 100644 --- a/fs/ntfs/file.c +++ b/fs/ntfs/file.c | |||
@@ -1,7 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * file.c - NTFS kernel file operations. Part of the Linux-NTFS project. | 2 | * file.c - NTFS kernel file operations. Part of the Linux-NTFS project. |
3 | * | 3 | * |
4 | * Copyright (c) 2001-2007 Anton Altaparmakov | 4 | * Copyright (c) 2001-2011 Anton Altaparmakov and Tuxera Inc. |
5 | * | 5 | * |
6 | * This program/include file is free software; you can redistribute it and/or | 6 | * This program/include file is free software; you can redistribute it and/or |
7 | * modify it under the terms of the GNU General Public License as published | 7 | * modify it under the terms of the GNU General Public License as published |
@@ -1380,15 +1380,14 @@ static inline void ntfs_set_next_iovec(const struct iovec **iovp, | |||
1380 | * pages (out to offset + bytes), to emulate ntfs_copy_from_user()'s | 1380 | * pages (out to offset + bytes), to emulate ntfs_copy_from_user()'s |
1381 | * single-segment behaviour. | 1381 | * single-segment behaviour. |
1382 | * | 1382 | * |
1383 | * We call the same helper (__ntfs_copy_from_user_iovec_inatomic()) both | 1383 | * We call the same helper (__ntfs_copy_from_user_iovec_inatomic()) both when |
1384 | * when atomic and when not atomic. This is ok because | 1384 | * atomic and when not atomic. This is ok because it calls |
1385 | * __ntfs_copy_from_user_iovec_inatomic() calls __copy_from_user_inatomic() | 1385 | * __copy_from_user_inatomic() and it is ok to call this when non-atomic. In |
1386 | * and it is ok to call this when non-atomic. | 1386 | * fact, the only difference between __copy_from_user_inatomic() and |
1387 | * Infact, the only difference between __copy_from_user_inatomic() and | ||
1388 | * __copy_from_user() is that the latter calls might_sleep() and the former | 1387 | * __copy_from_user() is that the latter calls might_sleep() and the former |
1389 | * should not zero the tail of the buffer on error. And on many | 1388 | * should not zero the tail of the buffer on error. And on many architectures |
1390 | * architectures __copy_from_user_inatomic() is just defined to | 1389 | * __copy_from_user_inatomic() is just defined to __copy_from_user() so it |
1391 | * __copy_from_user() so it makes no difference at all on those architectures. | 1390 | * makes no difference at all on those architectures. |
1392 | */ | 1391 | */ |
1393 | static inline size_t ntfs_copy_from_user_iovec(struct page **pages, | 1392 | static inline size_t ntfs_copy_from_user_iovec(struct page **pages, |
1394 | unsigned nr_pages, unsigned ofs, const struct iovec **iov, | 1393 | unsigned nr_pages, unsigned ofs, const struct iovec **iov, |
@@ -1409,28 +1408,28 @@ static inline size_t ntfs_copy_from_user_iovec(struct page **pages, | |||
1409 | if (unlikely(copied != len)) { | 1408 | if (unlikely(copied != len)) { |
1410 | /* Do it the slow way. */ | 1409 | /* Do it the slow way. */ |
1411 | addr = kmap(*pages); | 1410 | addr = kmap(*pages); |
1412 | copied = __ntfs_copy_from_user_iovec_inatomic(addr + ofs, | 1411 | copied = __ntfs_copy_from_user_iovec_inatomic(addr + |
1413 | *iov, *iov_ofs, len); | 1412 | ofs, *iov, *iov_ofs, len); |
1414 | /* | ||
1415 | * Zero the rest of the target like __copy_from_user(). | ||
1416 | */ | ||
1417 | memset(addr + ofs + copied, 0, len - copied); | ||
1418 | kunmap(*pages); | ||
1419 | if (unlikely(copied != len)) | 1413 | if (unlikely(copied != len)) |
1420 | goto err_out; | 1414 | goto err_out; |
1415 | kunmap(*pages); | ||
1421 | } | 1416 | } |
1422 | total += len; | 1417 | total += len; |
1418 | ntfs_set_next_iovec(iov, iov_ofs, len); | ||
1423 | bytes -= len; | 1419 | bytes -= len; |
1424 | if (!bytes) | 1420 | if (!bytes) |
1425 | break; | 1421 | break; |
1426 | ntfs_set_next_iovec(iov, iov_ofs, len); | ||
1427 | ofs = 0; | 1422 | ofs = 0; |
1428 | } while (++pages < last_page); | 1423 | } while (++pages < last_page); |
1429 | out: | 1424 | out: |
1430 | return total; | 1425 | return total; |
1431 | err_out: | 1426 | err_out: |
1432 | total += copied; | 1427 | BUG_ON(copied > len); |
1433 | /* Zero the rest of the target like __copy_from_user(). */ | 1428 | /* Zero the rest of the target like __copy_from_user(). */ |
1429 | memset(addr + ofs + copied, 0, len - copied); | ||
1430 | kunmap(*pages); | ||
1431 | total += copied; | ||
1432 | ntfs_set_next_iovec(iov, iov_ofs, copied); | ||
1434 | while (++pages < last_page) { | 1433 | while (++pages < last_page) { |
1435 | bytes -= len; | 1434 | bytes -= len; |
1436 | if (!bytes) | 1435 | if (!bytes) |
diff --git a/fs/ntfs/super.c b/fs/ntfs/super.c index a30ecacc01f..29099a07b9f 100644 --- a/fs/ntfs/super.c +++ b/fs/ntfs/super.c | |||
@@ -1,7 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * super.c - NTFS kernel super block handling. Part of the Linux-NTFS project. | 2 | * super.c - NTFS kernel super block handling. Part of the Linux-NTFS project. |
3 | * | 3 | * |
4 | * Copyright (c) 2001-2007 Anton Altaparmakov | 4 | * Copyright (c) 2001-2011 Anton Altaparmakov and Tuxera Inc. |
5 | * Copyright (c) 2001,2002 Richard Russon | 5 | * Copyright (c) 2001,2002 Richard Russon |
6 | * | 6 | * |
7 | * This program/include file is free software; you can redistribute it and/or | 7 | * This program/include file is free software; you can redistribute it and/or |
@@ -3193,8 +3193,8 @@ static void __exit exit_ntfs_fs(void) | |||
3193 | ntfs_sysctl(0); | 3193 | ntfs_sysctl(0); |
3194 | } | 3194 | } |
3195 | 3195 | ||
3196 | MODULE_AUTHOR("Anton Altaparmakov <aia21@cantab.net>"); | 3196 | MODULE_AUTHOR("Anton Altaparmakov <anton@tuxera.com>"); |
3197 | MODULE_DESCRIPTION("NTFS 1.2/3.x driver - Copyright (c) 2001-2007 Anton Altaparmakov"); | 3197 | MODULE_DESCRIPTION("NTFS 1.2/3.x driver - Copyright (c) 2001-2011 Anton Altaparmakov and Tuxera Inc."); |
3198 | MODULE_VERSION(NTFS_VERSION); | 3198 | MODULE_VERSION(NTFS_VERSION); |
3199 | MODULE_LICENSE("GPL"); | 3199 | MODULE_LICENSE("GPL"); |
3200 | #ifdef DEBUG | 3200 | #ifdef DEBUG |
diff --git a/fs/ocfs2/inode.c b/fs/ocfs2/inode.c index f935fd6600d..4068c6c4c6f 100644 --- a/fs/ocfs2/inode.c +++ b/fs/ocfs2/inode.c | |||
@@ -434,7 +434,7 @@ static int ocfs2_read_locked_inode(struct inode *inode, | |||
434 | * #1 and #2 can be simply solved by never taking the lock | 434 | * #1 and #2 can be simply solved by never taking the lock |
435 | * here for system files (which are the only type we read | 435 | * here for system files (which are the only type we read |
436 | * during mount). It's a heavier approach, but our main | 436 | * during mount). It's a heavier approach, but our main |
437 | * concern is user-accesible files anyway. | 437 | * concern is user-accessible files anyway. |
438 | * | 438 | * |
439 | * #3 works itself out because we'll eventually take the | 439 | * #3 works itself out because we'll eventually take the |
440 | * cluster lock before trusting anything anyway. | 440 | * cluster lock before trusting anything anyway. |
diff --git a/fs/ocfs2/suballoc.c b/fs/ocfs2/suballoc.c index 5fed60de763..71998d4d61d 100644 --- a/fs/ocfs2/suballoc.c +++ b/fs/ocfs2/suballoc.c | |||
@@ -1916,7 +1916,7 @@ static int ocfs2_claim_suballoc_bits(struct ocfs2_alloc_context *ac, | |||
1916 | if (res->sr_bg_blkno) { | 1916 | if (res->sr_bg_blkno) { |
1917 | /* Attempt to short-circuit the usual search mechanism | 1917 | /* Attempt to short-circuit the usual search mechanism |
1918 | * by jumping straight to the most recently used | 1918 | * by jumping straight to the most recently used |
1919 | * allocation group. This helps us mantain some | 1919 | * allocation group. This helps us maintain some |
1920 | * contiguousness across allocations. */ | 1920 | * contiguousness across allocations. */ |
1921 | status = ocfs2_search_one_group(ac, handle, bits_wanted, | 1921 | status = ocfs2_search_one_group(ac, handle, bits_wanted, |
1922 | min_bits, res, &bits_left); | 1922 | min_bits, res, &bits_left); |
@@ -441,7 +441,7 @@ redo: | |||
441 | break; | 441 | break; |
442 | } | 442 | } |
443 | if (do_wakeup) { | 443 | if (do_wakeup) { |
444 | wake_up_interruptible_sync(&pipe->wait); | 444 | wake_up_interruptible_sync_poll(&pipe->wait, POLLOUT); |
445 | kill_fasync(&pipe->fasync_writers, SIGIO, POLL_OUT); | 445 | kill_fasync(&pipe->fasync_writers, SIGIO, POLL_OUT); |
446 | } | 446 | } |
447 | pipe_wait(pipe); | 447 | pipe_wait(pipe); |
@@ -450,7 +450,7 @@ redo: | |||
450 | 450 | ||
451 | /* Signal writers asynchronously that there is more room. */ | 451 | /* Signal writers asynchronously that there is more room. */ |
452 | if (do_wakeup) { | 452 | if (do_wakeup) { |
453 | wake_up_interruptible_sync(&pipe->wait); | 453 | wake_up_interruptible_sync_poll(&pipe->wait, POLLOUT); |
454 | kill_fasync(&pipe->fasync_writers, SIGIO, POLL_OUT); | 454 | kill_fasync(&pipe->fasync_writers, SIGIO, POLL_OUT); |
455 | } | 455 | } |
456 | if (ret > 0) | 456 | if (ret > 0) |
@@ -612,7 +612,7 @@ redo2: | |||
612 | break; | 612 | break; |
613 | } | 613 | } |
614 | if (do_wakeup) { | 614 | if (do_wakeup) { |
615 | wake_up_interruptible_sync(&pipe->wait); | 615 | wake_up_interruptible_sync_poll(&pipe->wait, POLLIN); |
616 | kill_fasync(&pipe->fasync_readers, SIGIO, POLL_IN); | 616 | kill_fasync(&pipe->fasync_readers, SIGIO, POLL_IN); |
617 | do_wakeup = 0; | 617 | do_wakeup = 0; |
618 | } | 618 | } |
@@ -623,7 +623,7 @@ redo2: | |||
623 | out: | 623 | out: |
624 | mutex_unlock(&inode->i_mutex); | 624 | mutex_unlock(&inode->i_mutex); |
625 | if (do_wakeup) { | 625 | if (do_wakeup) { |
626 | wake_up_interruptible_sync(&pipe->wait); | 626 | wake_up_interruptible_sync_poll(&pipe->wait, POLLIN); |
627 | kill_fasync(&pipe->fasync_readers, SIGIO, POLL_IN); | 627 | kill_fasync(&pipe->fasync_readers, SIGIO, POLL_IN); |
628 | } | 628 | } |
629 | if (ret > 0) | 629 | if (ret > 0) |
@@ -715,7 +715,7 @@ pipe_release(struct inode *inode, int decr, int decw) | |||
715 | if (!pipe->readers && !pipe->writers) { | 715 | if (!pipe->readers && !pipe->writers) { |
716 | free_pipe_info(inode); | 716 | free_pipe_info(inode); |
717 | } else { | 717 | } else { |
718 | wake_up_interruptible_sync(&pipe->wait); | 718 | wake_up_interruptible_sync_poll(&pipe->wait, POLLIN | POLLOUT); |
719 | kill_fasync(&pipe->fasync_readers, SIGIO, POLL_IN); | 719 | kill_fasync(&pipe->fasync_readers, SIGIO, POLL_IN); |
720 | kill_fasync(&pipe->fasync_writers, SIGIO, POLL_OUT); | 720 | kill_fasync(&pipe->fasync_writers, SIGIO, POLL_OUT); |
721 | } | 721 | } |
diff --git a/fs/proc/Makefile b/fs/proc/Makefile index 288a49e098b..df434c5f28f 100644 --- a/fs/proc/Makefile +++ b/fs/proc/Makefile | |||
@@ -10,12 +10,12 @@ proc-$(CONFIG_MMU) := mmu.o task_mmu.o | |||
10 | proc-y += inode.o root.o base.o generic.o array.o \ | 10 | proc-y += inode.o root.o base.o generic.o array.o \ |
11 | proc_tty.o | 11 | proc_tty.o |
12 | proc-y += cmdline.o | 12 | proc-y += cmdline.o |
13 | proc-y += consoles.o | ||
13 | proc-y += cpuinfo.o | 14 | proc-y += cpuinfo.o |
14 | proc-y += devices.o | 15 | proc-y += devices.o |
15 | proc-y += interrupts.o | 16 | proc-y += interrupts.o |
16 | proc-y += loadavg.o | 17 | proc-y += loadavg.o |
17 | proc-y += meminfo.o | 18 | proc-y += meminfo.o |
18 | proc-y += proc_console.o | ||
19 | proc-y += stat.o | 19 | proc-y += stat.o |
20 | proc-y += uptime.o | 20 | proc-y += uptime.o |
21 | proc-y += version.o | 21 | proc-y += version.o |
diff --git a/fs/proc/array.c b/fs/proc/array.c index fff6572676a..df2b703b9d0 100644 --- a/fs/proc/array.c +++ b/fs/proc/array.c | |||
@@ -95,7 +95,7 @@ static inline void task_name(struct seq_file *m, struct task_struct *p) | |||
95 | 95 | ||
96 | get_task_comm(tcomm, p); | 96 | get_task_comm(tcomm, p); |
97 | 97 | ||
98 | seq_printf(m, "Name:\t"); | 98 | seq_puts(m, "Name:\t"); |
99 | end = m->buf + m->size; | 99 | end = m->buf + m->size; |
100 | buf = m->buf + m->count; | 100 | buf = m->buf + m->count; |
101 | name = tcomm; | 101 | name = tcomm; |
@@ -122,7 +122,7 @@ static inline void task_name(struct seq_file *m, struct task_struct *p) | |||
122 | buf++; | 122 | buf++; |
123 | } | 123 | } |
124 | m->count = buf - m->buf; | 124 | m->count = buf - m->buf; |
125 | seq_printf(m, "\n"); | 125 | seq_putc(m, '\n'); |
126 | } | 126 | } |
127 | 127 | ||
128 | /* | 128 | /* |
@@ -208,7 +208,7 @@ static inline void task_state(struct seq_file *m, struct pid_namespace *ns, | |||
208 | seq_printf(m, "%d ", GROUP_AT(group_info, g)); | 208 | seq_printf(m, "%d ", GROUP_AT(group_info, g)); |
209 | put_cred(cred); | 209 | put_cred(cred); |
210 | 210 | ||
211 | seq_printf(m, "\n"); | 211 | seq_putc(m, '\n'); |
212 | } | 212 | } |
213 | 213 | ||
214 | static void render_sigset_t(struct seq_file *m, const char *header, | 214 | static void render_sigset_t(struct seq_file *m, const char *header, |
@@ -216,7 +216,7 @@ static void render_sigset_t(struct seq_file *m, const char *header, | |||
216 | { | 216 | { |
217 | int i; | 217 | int i; |
218 | 218 | ||
219 | seq_printf(m, "%s", header); | 219 | seq_puts(m, header); |
220 | 220 | ||
221 | i = _NSIG; | 221 | i = _NSIG; |
222 | do { | 222 | do { |
@@ -230,7 +230,7 @@ static void render_sigset_t(struct seq_file *m, const char *header, | |||
230 | seq_printf(m, "%x", x); | 230 | seq_printf(m, "%x", x); |
231 | } while (i >= 4); | 231 | } while (i >= 4); |
232 | 232 | ||
233 | seq_printf(m, "\n"); | 233 | seq_putc(m, '\n'); |
234 | } | 234 | } |
235 | 235 | ||
236 | static void collect_sigign_sigcatch(struct task_struct *p, sigset_t *ign, | 236 | static void collect_sigign_sigcatch(struct task_struct *p, sigset_t *ign, |
@@ -291,12 +291,12 @@ static void render_cap_t(struct seq_file *m, const char *header, | |||
291 | { | 291 | { |
292 | unsigned __capi; | 292 | unsigned __capi; |
293 | 293 | ||
294 | seq_printf(m, "%s", header); | 294 | seq_puts(m, header); |
295 | CAP_FOR_EACH_U32(__capi) { | 295 | CAP_FOR_EACH_U32(__capi) { |
296 | seq_printf(m, "%08x", | 296 | seq_printf(m, "%08x", |
297 | a->cap[(_KERNEL_CAPABILITY_U32S-1) - __capi]); | 297 | a->cap[(_KERNEL_CAPABILITY_U32S-1) - __capi]); |
298 | } | 298 | } |
299 | seq_printf(m, "\n"); | 299 | seq_putc(m, '\n'); |
300 | } | 300 | } |
301 | 301 | ||
302 | static inline void task_cap(struct seq_file *m, struct task_struct *p) | 302 | static inline void task_cap(struct seq_file *m, struct task_struct *p) |
@@ -329,12 +329,12 @@ static inline void task_context_switch_counts(struct seq_file *m, | |||
329 | 329 | ||
330 | static void task_cpus_allowed(struct seq_file *m, struct task_struct *task) | 330 | static void task_cpus_allowed(struct seq_file *m, struct task_struct *task) |
331 | { | 331 | { |
332 | seq_printf(m, "Cpus_allowed:\t"); | 332 | seq_puts(m, "Cpus_allowed:\t"); |
333 | seq_cpumask(m, &task->cpus_allowed); | 333 | seq_cpumask(m, &task->cpus_allowed); |
334 | seq_printf(m, "\n"); | 334 | seq_putc(m, '\n'); |
335 | seq_printf(m, "Cpus_allowed_list:\t"); | 335 | seq_puts(m, "Cpus_allowed_list:\t"); |
336 | seq_cpumask_list(m, &task->cpus_allowed); | 336 | seq_cpumask_list(m, &task->cpus_allowed); |
337 | seq_printf(m, "\n"); | 337 | seq_putc(m, '\n'); |
338 | } | 338 | } |
339 | 339 | ||
340 | int proc_pid_status(struct seq_file *m, struct pid_namespace *ns, | 340 | int proc_pid_status(struct seq_file *m, struct pid_namespace *ns, |
@@ -535,15 +535,15 @@ int proc_tgid_stat(struct seq_file *m, struct pid_namespace *ns, | |||
535 | int proc_pid_statm(struct seq_file *m, struct pid_namespace *ns, | 535 | int proc_pid_statm(struct seq_file *m, struct pid_namespace *ns, |
536 | struct pid *pid, struct task_struct *task) | 536 | struct pid *pid, struct task_struct *task) |
537 | { | 537 | { |
538 | int size = 0, resident = 0, shared = 0, text = 0, lib = 0, data = 0; | 538 | unsigned long size = 0, resident = 0, shared = 0, text = 0, data = 0; |
539 | struct mm_struct *mm = get_task_mm(task); | 539 | struct mm_struct *mm = get_task_mm(task); |
540 | 540 | ||
541 | if (mm) { | 541 | if (mm) { |
542 | size = task_statm(mm, &shared, &text, &data, &resident); | 542 | size = task_statm(mm, &shared, &text, &data, &resident); |
543 | mmput(mm); | 543 | mmput(mm); |
544 | } | 544 | } |
545 | seq_printf(m, "%d %d %d %d %d %d %d\n", | 545 | seq_printf(m, "%lu %lu %lu %lu 0 %lu 0\n", |
546 | size, resident, shared, text, lib, data, 0); | 546 | size, resident, shared, text, data); |
547 | 547 | ||
548 | return 0; | 548 | return 0; |
549 | } | 549 | } |
diff --git a/fs/proc/base.c b/fs/proc/base.c index b20962c71a5..93f1cdd5d3d 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c | |||
@@ -373,26 +373,20 @@ static int lstats_show_proc(struct seq_file *m, void *v) | |||
373 | return -ESRCH; | 373 | return -ESRCH; |
374 | seq_puts(m, "Latency Top version : v0.1\n"); | 374 | seq_puts(m, "Latency Top version : v0.1\n"); |
375 | for (i = 0; i < 32; i++) { | 375 | for (i = 0; i < 32; i++) { |
376 | if (task->latency_record[i].backtrace[0]) { | 376 | struct latency_record *lr = &task->latency_record[i]; |
377 | if (lr->backtrace[0]) { | ||
377 | int q; | 378 | int q; |
378 | seq_printf(m, "%i %li %li ", | 379 | seq_printf(m, "%i %li %li", |
379 | task->latency_record[i].count, | 380 | lr->count, lr->time, lr->max); |
380 | task->latency_record[i].time, | ||
381 | task->latency_record[i].max); | ||
382 | for (q = 0; q < LT_BACKTRACEDEPTH; q++) { | 381 | for (q = 0; q < LT_BACKTRACEDEPTH; q++) { |
383 | char sym[KSYM_SYMBOL_LEN]; | 382 | unsigned long bt = lr->backtrace[q]; |
384 | char *c; | 383 | if (!bt) |
385 | if (!task->latency_record[i].backtrace[q]) | ||
386 | break; | 384 | break; |
387 | if (task->latency_record[i].backtrace[q] == ULONG_MAX) | 385 | if (bt == ULONG_MAX) |
388 | break; | 386 | break; |
389 | sprint_symbol(sym, task->latency_record[i].backtrace[q]); | 387 | seq_printf(m, " %ps", (void *)bt); |
390 | c = strchr(sym, '+'); | ||
391 | if (c) | ||
392 | *c = 0; | ||
393 | seq_printf(m, "%s ", sym); | ||
394 | } | 388 | } |
395 | seq_printf(m, "\n"); | 389 | seq_putc(m, '\n'); |
396 | } | 390 | } |
397 | 391 | ||
398 | } | 392 | } |
@@ -751,14 +745,7 @@ static int proc_single_show(struct seq_file *m, void *v) | |||
751 | 745 | ||
752 | static int proc_single_open(struct inode *inode, struct file *filp) | 746 | static int proc_single_open(struct inode *inode, struct file *filp) |
753 | { | 747 | { |
754 | int ret; | 748 | return single_open(filp, proc_single_show, inode); |
755 | ret = single_open(filp, proc_single_show, NULL); | ||
756 | if (!ret) { | ||
757 | struct seq_file *m = filp->private_data; | ||
758 | |||
759 | m->private = inode; | ||
760 | } | ||
761 | return ret; | ||
762 | } | 749 | } |
763 | 750 | ||
764 | static const struct file_operations proc_single_file_operations = { | 751 | static const struct file_operations proc_single_file_operations = { |
@@ -1386,15 +1373,7 @@ sched_write(struct file *file, const char __user *buf, | |||
1386 | 1373 | ||
1387 | static int sched_open(struct inode *inode, struct file *filp) | 1374 | static int sched_open(struct inode *inode, struct file *filp) |
1388 | { | 1375 | { |
1389 | int ret; | 1376 | return single_open(filp, sched_show, inode); |
1390 | |||
1391 | ret = single_open(filp, sched_show, NULL); | ||
1392 | if (!ret) { | ||
1393 | struct seq_file *m = filp->private_data; | ||
1394 | |||
1395 | m->private = inode; | ||
1396 | } | ||
1397 | return ret; | ||
1398 | } | 1377 | } |
1399 | 1378 | ||
1400 | static const struct file_operations proc_pid_sched_operations = { | 1379 | static const struct file_operations proc_pid_sched_operations = { |
@@ -1530,15 +1509,7 @@ static int comm_show(struct seq_file *m, void *v) | |||
1530 | 1509 | ||
1531 | static int comm_open(struct inode *inode, struct file *filp) | 1510 | static int comm_open(struct inode *inode, struct file *filp) |
1532 | { | 1511 | { |
1533 | int ret; | 1512 | return single_open(filp, comm_show, inode); |
1534 | |||
1535 | ret = single_open(filp, comm_show, NULL); | ||
1536 | if (!ret) { | ||
1537 | struct seq_file *m = filp->private_data; | ||
1538 | |||
1539 | m->private = inode; | ||
1540 | } | ||
1541 | return ret; | ||
1542 | } | 1513 | } |
1543 | 1514 | ||
1544 | static const struct file_operations proc_pid_set_comm_operations = { | 1515 | static const struct file_operations proc_pid_set_comm_operations = { |
diff --git a/fs/proc/proc_console.c b/fs/proc/consoles.c index 8a707609f52..eafc22ab1fd 100644 --- a/fs/proc/proc_console.c +++ b/fs/proc/consoles.c | |||
@@ -106,9 +106,9 @@ static const struct file_operations proc_consoles_operations = { | |||
106 | .release = seq_release, | 106 | .release = seq_release, |
107 | }; | 107 | }; |
108 | 108 | ||
109 | static int register_proc_consoles(void) | 109 | static int __init proc_consoles_init(void) |
110 | { | 110 | { |
111 | proc_create("consoles", 0, NULL, &proc_consoles_operations); | 111 | proc_create("consoles", 0, NULL, &proc_consoles_operations); |
112 | return 0; | 112 | return 0; |
113 | } | 113 | } |
114 | module_init(register_proc_consoles); | 114 | module_init(proc_consoles_init); |
diff --git a/fs/proc/devices.c b/fs/proc/devices.c index 59ee7da959c..b14347167c3 100644 --- a/fs/proc/devices.c +++ b/fs/proc/devices.c | |||
@@ -9,14 +9,14 @@ static int devinfo_show(struct seq_file *f, void *v) | |||
9 | 9 | ||
10 | if (i < CHRDEV_MAJOR_HASH_SIZE) { | 10 | if (i < CHRDEV_MAJOR_HASH_SIZE) { |
11 | if (i == 0) | 11 | if (i == 0) |
12 | seq_printf(f, "Character devices:\n"); | 12 | seq_puts(f, "Character devices:\n"); |
13 | chrdev_show(f, i); | 13 | chrdev_show(f, i); |
14 | } | 14 | } |
15 | #ifdef CONFIG_BLOCK | 15 | #ifdef CONFIG_BLOCK |
16 | else { | 16 | else { |
17 | i -= CHRDEV_MAJOR_HASH_SIZE; | 17 | i -= CHRDEV_MAJOR_HASH_SIZE; |
18 | if (i == 0) | 18 | if (i == 0) |
19 | seq_printf(f, "\nBlock devices:\n"); | 19 | seq_puts(f, "\nBlock devices:\n"); |
20 | blkdev_show(f, i); | 20 | blkdev_show(f, i); |
21 | } | 21 | } |
22 | #endif | 22 | #endif |
diff --git a/fs/proc/generic.c b/fs/proc/generic.c index f766be29d2c..01e07f2a188 100644 --- a/fs/proc/generic.c +++ b/fs/proc/generic.c | |||
@@ -425,13 +425,10 @@ struct dentry *proc_lookup_de(struct proc_dir_entry *de, struct inode *dir, | |||
425 | if (de->namelen != dentry->d_name.len) | 425 | if (de->namelen != dentry->d_name.len) |
426 | continue; | 426 | continue; |
427 | if (!memcmp(dentry->d_name.name, de->name, de->namelen)) { | 427 | if (!memcmp(dentry->d_name.name, de->name, de->namelen)) { |
428 | unsigned int ino; | ||
429 | |||
430 | ino = de->low_ino; | ||
431 | pde_get(de); | 428 | pde_get(de); |
432 | spin_unlock(&proc_subdir_lock); | 429 | spin_unlock(&proc_subdir_lock); |
433 | error = -EINVAL; | 430 | error = -EINVAL; |
434 | inode = proc_get_inode(dir->i_sb, ino, de); | 431 | inode = proc_get_inode(dir->i_sb, de); |
435 | goto out_unlock; | 432 | goto out_unlock; |
436 | } | 433 | } |
437 | } | 434 | } |
@@ -768,12 +765,7 @@ EXPORT_SYMBOL(proc_create_data); | |||
768 | 765 | ||
769 | static void free_proc_entry(struct proc_dir_entry *de) | 766 | static void free_proc_entry(struct proc_dir_entry *de) |
770 | { | 767 | { |
771 | unsigned int ino = de->low_ino; | 768 | release_inode_number(de->low_ino); |
772 | |||
773 | if (ino < PROC_DYNAMIC_FIRST) | ||
774 | return; | ||
775 | |||
776 | release_inode_number(ino); | ||
777 | 769 | ||
778 | if (S_ISLNK(de->mode)) | 770 | if (S_ISLNK(de->mode)) |
779 | kfree(de->data); | 771 | kfree(de->data); |
@@ -834,12 +826,9 @@ void remove_proc_entry(const char *name, struct proc_dir_entry *parent) | |||
834 | 826 | ||
835 | wait_for_completion(de->pde_unload_completion); | 827 | wait_for_completion(de->pde_unload_completion); |
836 | 828 | ||
837 | goto continue_removing; | 829 | spin_lock(&de->pde_unload_lock); |
838 | } | 830 | } |
839 | spin_unlock(&de->pde_unload_lock); | ||
840 | 831 | ||
841 | continue_removing: | ||
842 | spin_lock(&de->pde_unload_lock); | ||
843 | while (!list_empty(&de->pde_openers)) { | 832 | while (!list_empty(&de->pde_openers)) { |
844 | struct pde_opener *pdeo; | 833 | struct pde_opener *pdeo; |
845 | 834 | ||
diff --git a/fs/proc/inode.c b/fs/proc/inode.c index 6bcb926b101..176ce4cda68 100644 --- a/fs/proc/inode.c +++ b/fs/proc/inode.c | |||
@@ -416,12 +416,11 @@ static const struct file_operations proc_reg_file_ops_no_compat = { | |||
416 | }; | 416 | }; |
417 | #endif | 417 | #endif |
418 | 418 | ||
419 | struct inode *proc_get_inode(struct super_block *sb, unsigned int ino, | 419 | struct inode *proc_get_inode(struct super_block *sb, struct proc_dir_entry *de) |
420 | struct proc_dir_entry *de) | ||
421 | { | 420 | { |
422 | struct inode * inode; | 421 | struct inode * inode; |
423 | 422 | ||
424 | inode = iget_locked(sb, ino); | 423 | inode = iget_locked(sb, de->low_ino); |
425 | if (!inode) | 424 | if (!inode) |
426 | return NULL; | 425 | return NULL; |
427 | if (inode->i_state & I_NEW) { | 426 | if (inode->i_state & I_NEW) { |
@@ -471,7 +470,7 @@ int proc_fill_super(struct super_block *s) | |||
471 | s->s_time_gran = 1; | 470 | s->s_time_gran = 1; |
472 | 471 | ||
473 | pde_get(&proc_root); | 472 | pde_get(&proc_root); |
474 | root_inode = proc_get_inode(s, PROC_ROOT_INO, &proc_root); | 473 | root_inode = proc_get_inode(s, &proc_root); |
475 | if (!root_inode) | 474 | if (!root_inode) |
476 | goto out_no_root; | 475 | goto out_no_root; |
477 | root_inode->i_uid = 0; | 476 | root_inode->i_uid = 0; |
diff --git a/fs/proc/internal.h b/fs/proc/internal.h index 1f24a3eddd1..9ad561ded40 100644 --- a/fs/proc/internal.h +++ b/fs/proc/internal.h | |||
@@ -96,7 +96,8 @@ extern spinlock_t proc_subdir_lock; | |||
96 | struct dentry *proc_pid_lookup(struct inode *dir, struct dentry * dentry, struct nameidata *); | 96 | struct dentry *proc_pid_lookup(struct inode *dir, struct dentry * dentry, struct nameidata *); |
97 | int proc_pid_readdir(struct file * filp, void * dirent, filldir_t filldir); | 97 | int proc_pid_readdir(struct file * filp, void * dirent, filldir_t filldir); |
98 | unsigned long task_vsize(struct mm_struct *); | 98 | unsigned long task_vsize(struct mm_struct *); |
99 | int task_statm(struct mm_struct *, int *, int *, int *, int *); | 99 | unsigned long task_statm(struct mm_struct *, |
100 | unsigned long *, unsigned long *, unsigned long *, unsigned long *); | ||
100 | void task_mem(struct seq_file *, struct mm_struct *); | 101 | void task_mem(struct seq_file *, struct mm_struct *); |
101 | 102 | ||
102 | static inline struct proc_dir_entry *pde_get(struct proc_dir_entry *pde) | 103 | static inline struct proc_dir_entry *pde_get(struct proc_dir_entry *pde) |
@@ -108,7 +109,7 @@ void pde_put(struct proc_dir_entry *pde); | |||
108 | 109 | ||
109 | extern struct vfsmount *proc_mnt; | 110 | extern struct vfsmount *proc_mnt; |
110 | int proc_fill_super(struct super_block *); | 111 | int proc_fill_super(struct super_block *); |
111 | struct inode *proc_get_inode(struct super_block *, unsigned int, struct proc_dir_entry *); | 112 | struct inode *proc_get_inode(struct super_block *, struct proc_dir_entry *); |
112 | 113 | ||
113 | /* | 114 | /* |
114 | * These are generic /proc routines that use the internal | 115 | * These are generic /proc routines that use the internal |
diff --git a/fs/proc/kcore.c b/fs/proc/kcore.c index 6f37c391468..d245cb23dd7 100644 --- a/fs/proc/kcore.c +++ b/fs/proc/kcore.c | |||
@@ -558,7 +558,7 @@ static int open_kcore(struct inode *inode, struct file *filp) | |||
558 | static const struct file_operations proc_kcore_operations = { | 558 | static const struct file_operations proc_kcore_operations = { |
559 | .read = read_kcore, | 559 | .read = read_kcore, |
560 | .open = open_kcore, | 560 | .open = open_kcore, |
561 | .llseek = generic_file_llseek, | 561 | .llseek = default_llseek, |
562 | }; | 562 | }; |
563 | 563 | ||
564 | #ifdef CONFIG_MEMORY_HOTPLUG | 564 | #ifdef CONFIG_MEMORY_HOTPLUG |
diff --git a/fs/proc/page.c b/fs/proc/page.c index 3b8b4566033..b06c674624e 100644 --- a/fs/proc/page.c +++ b/fs/proc/page.c | |||
@@ -40,7 +40,7 @@ static ssize_t kpagecount_read(struct file *file, char __user *buf, | |||
40 | ppage = pfn_to_page(pfn); | 40 | ppage = pfn_to_page(pfn); |
41 | else | 41 | else |
42 | ppage = NULL; | 42 | ppage = NULL; |
43 | if (!ppage) | 43 | if (!ppage || PageSlab(ppage)) |
44 | pcount = 0; | 44 | pcount = 0; |
45 | else | 45 | else |
46 | pcount = page_mapcount(ppage); | 46 | pcount = page_mapcount(ppage); |
diff --git a/fs/proc/proc_tty.c b/fs/proc/proc_tty.c index 83adcc86943..cb761f01030 100644 --- a/fs/proc/proc_tty.c +++ b/fs/proc/proc_tty.c | |||
@@ -36,27 +36,27 @@ static void show_tty_range(struct seq_file *m, struct tty_driver *p, | |||
36 | } | 36 | } |
37 | switch (p->type) { | 37 | switch (p->type) { |
38 | case TTY_DRIVER_TYPE_SYSTEM: | 38 | case TTY_DRIVER_TYPE_SYSTEM: |
39 | seq_printf(m, "system"); | 39 | seq_puts(m, "system"); |
40 | if (p->subtype == SYSTEM_TYPE_TTY) | 40 | if (p->subtype == SYSTEM_TYPE_TTY) |
41 | seq_printf(m, ":/dev/tty"); | 41 | seq_puts(m, ":/dev/tty"); |
42 | else if (p->subtype == SYSTEM_TYPE_SYSCONS) | 42 | else if (p->subtype == SYSTEM_TYPE_SYSCONS) |
43 | seq_printf(m, ":console"); | 43 | seq_puts(m, ":console"); |
44 | else if (p->subtype == SYSTEM_TYPE_CONSOLE) | 44 | else if (p->subtype == SYSTEM_TYPE_CONSOLE) |
45 | seq_printf(m, ":vtmaster"); | 45 | seq_puts(m, ":vtmaster"); |
46 | break; | 46 | break; |
47 | case TTY_DRIVER_TYPE_CONSOLE: | 47 | case TTY_DRIVER_TYPE_CONSOLE: |
48 | seq_printf(m, "console"); | 48 | seq_puts(m, "console"); |
49 | break; | 49 | break; |
50 | case TTY_DRIVER_TYPE_SERIAL: | 50 | case TTY_DRIVER_TYPE_SERIAL: |
51 | seq_printf(m, "serial"); | 51 | seq_puts(m, "serial"); |
52 | break; | 52 | break; |
53 | case TTY_DRIVER_TYPE_PTY: | 53 | case TTY_DRIVER_TYPE_PTY: |
54 | if (p->subtype == PTY_TYPE_MASTER) | 54 | if (p->subtype == PTY_TYPE_MASTER) |
55 | seq_printf(m, "pty:master"); | 55 | seq_puts(m, "pty:master"); |
56 | else if (p->subtype == PTY_TYPE_SLAVE) | 56 | else if (p->subtype == PTY_TYPE_SLAVE) |
57 | seq_printf(m, "pty:slave"); | 57 | seq_puts(m, "pty:slave"); |
58 | else | 58 | else |
59 | seq_printf(m, "pty"); | 59 | seq_puts(m, "pty"); |
60 | break; | 60 | break; |
61 | default: | 61 | default: |
62 | seq_printf(m, "type:%d.%d", p->type, p->subtype); | 62 | seq_printf(m, "type:%d.%d", p->type, p->subtype); |
@@ -74,19 +74,19 @@ static int show_tty_driver(struct seq_file *m, void *v) | |||
74 | /* pseudo-drivers first */ | 74 | /* pseudo-drivers first */ |
75 | seq_printf(m, "%-20s /dev/%-8s ", "/dev/tty", "tty"); | 75 | seq_printf(m, "%-20s /dev/%-8s ", "/dev/tty", "tty"); |
76 | seq_printf(m, "%3d %7d ", TTYAUX_MAJOR, 0); | 76 | seq_printf(m, "%3d %7d ", TTYAUX_MAJOR, 0); |
77 | seq_printf(m, "system:/dev/tty\n"); | 77 | seq_puts(m, "system:/dev/tty\n"); |
78 | seq_printf(m, "%-20s /dev/%-8s ", "/dev/console", "console"); | 78 | seq_printf(m, "%-20s /dev/%-8s ", "/dev/console", "console"); |
79 | seq_printf(m, "%3d %7d ", TTYAUX_MAJOR, 1); | 79 | seq_printf(m, "%3d %7d ", TTYAUX_MAJOR, 1); |
80 | seq_printf(m, "system:console\n"); | 80 | seq_puts(m, "system:console\n"); |
81 | #ifdef CONFIG_UNIX98_PTYS | 81 | #ifdef CONFIG_UNIX98_PTYS |
82 | seq_printf(m, "%-20s /dev/%-8s ", "/dev/ptmx", "ptmx"); | 82 | seq_printf(m, "%-20s /dev/%-8s ", "/dev/ptmx", "ptmx"); |
83 | seq_printf(m, "%3d %7d ", TTYAUX_MAJOR, 2); | 83 | seq_printf(m, "%3d %7d ", TTYAUX_MAJOR, 2); |
84 | seq_printf(m, "system\n"); | 84 | seq_puts(m, "system\n"); |
85 | #endif | 85 | #endif |
86 | #ifdef CONFIG_VT | 86 | #ifdef CONFIG_VT |
87 | seq_printf(m, "%-20s /dev/%-8s ", "/dev/vc/0", "vc/0"); | 87 | seq_printf(m, "%-20s /dev/%-8s ", "/dev/vc/0", "vc/0"); |
88 | seq_printf(m, "%3d %7d ", TTY_MAJOR, 0); | 88 | seq_printf(m, "%3d %7d ", TTY_MAJOR, 0); |
89 | seq_printf(m, "system:vtmaster\n"); | 89 | seq_puts(m, "system:vtmaster\n"); |
90 | #endif | 90 | #endif |
91 | } | 91 | } |
92 | 92 | ||
diff --git a/fs/proc/softirqs.c b/fs/proc/softirqs.c index 37994737c98..62604be9f58 100644 --- a/fs/proc/softirqs.c +++ b/fs/proc/softirqs.c | |||
@@ -10,16 +10,16 @@ static int show_softirqs(struct seq_file *p, void *v) | |||
10 | { | 10 | { |
11 | int i, j; | 11 | int i, j; |
12 | 12 | ||
13 | seq_printf(p, " "); | 13 | seq_puts(p, " "); |
14 | for_each_possible_cpu(i) | 14 | for_each_possible_cpu(i) |
15 | seq_printf(p, "CPU%-8d", i); | 15 | seq_printf(p, "CPU%-8d", i); |
16 | seq_printf(p, "\n"); | 16 | seq_putc(p, '\n'); |
17 | 17 | ||
18 | for (i = 0; i < NR_SOFTIRQS; i++) { | 18 | for (i = 0; i < NR_SOFTIRQS; i++) { |
19 | seq_printf(p, "%12s:", softirq_to_name[i]); | 19 | seq_printf(p, "%12s:", softirq_to_name[i]); |
20 | for_each_possible_cpu(j) | 20 | for_each_possible_cpu(j) |
21 | seq_printf(p, " %10u", kstat_softirqs_cpu(i, j)); | 21 | seq_printf(p, " %10u", kstat_softirqs_cpu(i, j)); |
22 | seq_printf(p, "\n"); | 22 | seq_putc(p, '\n'); |
23 | } | 23 | } |
24 | return 0; | 24 | return 0; |
25 | } | 25 | } |
diff --git a/fs/proc/stat.c b/fs/proc/stat.c index e15a19c93ba..1cffa2b8a2f 100644 --- a/fs/proc/stat.c +++ b/fs/proc/stat.c | |||
@@ -126,7 +126,7 @@ static int show_stat(struct seq_file *p, void *v) | |||
126 | 126 | ||
127 | for (i = 0; i < NR_SOFTIRQS; i++) | 127 | for (i = 0; i < NR_SOFTIRQS; i++) |
128 | seq_printf(p, " %u", per_softirq_sums[i]); | 128 | seq_printf(p, " %u", per_softirq_sums[i]); |
129 | seq_printf(p, "\n"); | 129 | seq_putc(p, '\n'); |
130 | 130 | ||
131 | return 0; | 131 | return 0; |
132 | } | 132 | } |
diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c index c126c83b9a4..c3755bd8dd3 100644 --- a/fs/proc/task_mmu.c +++ b/fs/proc/task_mmu.c | |||
@@ -66,8 +66,9 @@ unsigned long task_vsize(struct mm_struct *mm) | |||
66 | return PAGE_SIZE * mm->total_vm; | 66 | return PAGE_SIZE * mm->total_vm; |
67 | } | 67 | } |
68 | 68 | ||
69 | int task_statm(struct mm_struct *mm, int *shared, int *text, | 69 | unsigned long task_statm(struct mm_struct *mm, |
70 | int *data, int *resident) | 70 | unsigned long *shared, unsigned long *text, |
71 | unsigned long *data, unsigned long *resident) | ||
71 | { | 72 | { |
72 | *shared = get_mm_counter(mm, MM_FILEPAGES); | 73 | *shared = get_mm_counter(mm, MM_FILEPAGES); |
73 | *text = (PAGE_ALIGN(mm->end_code) - (mm->start_code & PAGE_MASK)) | 74 | *text = (PAGE_ALIGN(mm->end_code) - (mm->start_code & PAGE_MASK)) |
diff --git a/fs/proc/task_nommu.c b/fs/proc/task_nommu.c index cb6306e6384..b535d3e5d5f 100644 --- a/fs/proc/task_nommu.c +++ b/fs/proc/task_nommu.c | |||
@@ -92,13 +92,14 @@ unsigned long task_vsize(struct mm_struct *mm) | |||
92 | return vsize; | 92 | return vsize; |
93 | } | 93 | } |
94 | 94 | ||
95 | int task_statm(struct mm_struct *mm, int *shared, int *text, | 95 | unsigned long task_statm(struct mm_struct *mm, |
96 | int *data, int *resident) | 96 | unsigned long *shared, unsigned long *text, |
97 | unsigned long *data, unsigned long *resident) | ||
97 | { | 98 | { |
98 | struct vm_area_struct *vma; | 99 | struct vm_area_struct *vma; |
99 | struct vm_region *region; | 100 | struct vm_region *region; |
100 | struct rb_node *p; | 101 | struct rb_node *p; |
101 | int size = kobjsize(mm); | 102 | unsigned long size = kobjsize(mm); |
102 | 103 | ||
103 | down_read(&mm->mmap_sem); | 104 | down_read(&mm->mmap_sem); |
104 | for (p = rb_first(&mm->mm_rb); p; p = rb_next(p)) { | 105 | for (p = rb_first(&mm->mm_rb); p; p = rb_next(p)) { |
diff --git a/fs/reiserfs/prints.c b/fs/reiserfs/prints.c index adbc6f53851..45de98b5946 100644 --- a/fs/reiserfs/prints.c +++ b/fs/reiserfs/prints.c | |||
@@ -586,13 +586,13 @@ void print_block(struct buffer_head *bh, ...) //int print_mode, int first, int l | |||
586 | va_list args; | 586 | va_list args; |
587 | int mode, first, last; | 587 | int mode, first, last; |
588 | 588 | ||
589 | va_start(args, bh); | ||
590 | |||
591 | if (!bh) { | 589 | if (!bh) { |
592 | printk("print_block: buffer is NULL\n"); | 590 | printk("print_block: buffer is NULL\n"); |
593 | return; | 591 | return; |
594 | } | 592 | } |
595 | 593 | ||
594 | va_start(args, bh); | ||
595 | |||
596 | mode = va_arg(args, int); | 596 | mode = va_arg(args, int); |
597 | first = va_arg(args, int); | 597 | first = va_arg(args, int); |
598 | last = va_arg(args, int); | 598 | last = va_arg(args, int); |
diff --git a/fs/select.c b/fs/select.c index b7b10aa3086..e56560d2b08 100644 --- a/fs/select.c +++ b/fs/select.c | |||
@@ -306,6 +306,8 @@ static int poll_select_copy_remaining(struct timespec *end_time, void __user *p, | |||
306 | rts.tv_sec = rts.tv_nsec = 0; | 306 | rts.tv_sec = rts.tv_nsec = 0; |
307 | 307 | ||
308 | if (timeval) { | 308 | if (timeval) { |
309 | if (sizeof(rtv) > sizeof(rtv.tv_sec) + sizeof(rtv.tv_usec)) | ||
310 | memset(&rtv, 0, sizeof(rtv)); | ||
309 | rtv.tv_sec = rts.tv_sec; | 311 | rtv.tv_sec = rts.tv_sec; |
310 | rtv.tv_usec = rts.tv_nsec / NSEC_PER_USEC; | 312 | rtv.tv_usec = rts.tv_nsec / NSEC_PER_USEC; |
311 | 313 | ||
diff --git a/fs/xfs/linux-2.6/xfs_super.c b/fs/xfs/linux-2.6/xfs_super.c index c51faaa5e29..a10f6416e56 100644 --- a/fs/xfs/linux-2.6/xfs_super.c +++ b/fs/xfs/linux-2.6/xfs_super.c | |||
@@ -947,7 +947,7 @@ out_reclaim: | |||
947 | * Slab object creation initialisation for the XFS inode. | 947 | * Slab object creation initialisation for the XFS inode. |
948 | * This covers only the idempotent fields in the XFS inode; | 948 | * This covers only the idempotent fields in the XFS inode; |
949 | * all other fields need to be initialised on allocation | 949 | * all other fields need to be initialised on allocation |
950 | * from the slab. This avoids the need to repeatedly intialise | 950 | * from the slab. This avoids the need to repeatedly initialise |
951 | * fields in the xfs inode that left in the initialise state | 951 | * fields in the xfs inode that left in the initialise state |
952 | * when freeing the inode. | 952 | * when freeing the inode. |
953 | */ | 953 | */ |