diff options
author | Glenn Elliott <gelliott@cs.unc.edu> | 2012-03-04 19:47:13 -0500 |
---|---|---|
committer | Glenn Elliott <gelliott@cs.unc.edu> | 2012-03-04 19:47:13 -0500 |
commit | c71c03bda1e86c9d5198c5d83f712e695c4f2a1e (patch) | |
tree | ecb166cb3e2b7e2adb3b5e292245fefd23381ac8 /fs/minix | |
parent | ea53c912f8a86a8567697115b6a0d8152beee5c8 (diff) | |
parent | 6a00f206debf8a5c8899055726ad127dbeeed098 (diff) |
Merge branch 'mpi-master' into wip-k-fmlpwip-k-fmlp
Conflicts:
litmus/sched_cedf.c
Diffstat (limited to 'fs/minix')
-rw-r--r-- | fs/minix/Kconfig | 8 | ||||
-rw-r--r-- | fs/minix/inode.c | 19 | ||||
-rw-r--r-- | fs/minix/minix.h | 74 | ||||
-rw-r--r-- | fs/minix/namei.c | 12 |
4 files changed, 97 insertions, 16 deletions
diff --git a/fs/minix/Kconfig b/fs/minix/Kconfig index 0fd7ca994264..6624684dd5de 100644 --- a/fs/minix/Kconfig +++ b/fs/minix/Kconfig | |||
@@ -15,3 +15,11 @@ config MINIX_FS | |||
15 | module will be called minix. Note that the file system of your root | 15 | module will be called minix. Note that the file system of your root |
16 | partition (the one containing the directory /) cannot be compiled as | 16 | partition (the one containing the directory /) cannot be compiled as |
17 | a module. | 17 | a module. |
18 | |||
19 | config MINIX_FS_NATIVE_ENDIAN | ||
20 | def_bool MINIX_FS | ||
21 | depends on H8300 || M32R || MICROBLAZE || MIPS || S390 || SUPERH || SPARC || XTENSA || (M68K && !MMU) | ||
22 | |||
23 | config MINIX_FS_BIG_ENDIAN_16BIT_INDEXED | ||
24 | def_bool MINIX_FS | ||
25 | depends on M68K && MMU | ||
diff --git a/fs/minix/inode.c b/fs/minix/inode.c index e39d6bf2e8fb..adcdc0a4e182 100644 --- a/fs/minix/inode.c +++ b/fs/minix/inode.c | |||
@@ -68,11 +68,18 @@ static struct inode *minix_alloc_inode(struct super_block *sb) | |||
68 | return &ei->vfs_inode; | 68 | return &ei->vfs_inode; |
69 | } | 69 | } |
70 | 70 | ||
71 | static void minix_destroy_inode(struct inode *inode) | 71 | static void minix_i_callback(struct rcu_head *head) |
72 | { | 72 | { |
73 | struct inode *inode = container_of(head, struct inode, i_rcu); | ||
74 | INIT_LIST_HEAD(&inode->i_dentry); | ||
73 | kmem_cache_free(minix_inode_cachep, minix_i(inode)); | 75 | kmem_cache_free(minix_inode_cachep, minix_i(inode)); |
74 | } | 76 | } |
75 | 77 | ||
78 | static void minix_destroy_inode(struct inode *inode) | ||
79 | { | ||
80 | call_rcu(&inode->i_rcu, minix_i_callback); | ||
81 | } | ||
82 | |||
76 | static void init_once(void *foo) | 83 | static void init_once(void *foo) |
77 | { | 84 | { |
78 | struct minix_inode_info *ei = (struct minix_inode_info *) foo; | 85 | struct minix_inode_info *ei = (struct minix_inode_info *) foo; |
@@ -392,7 +399,6 @@ static sector_t minix_bmap(struct address_space *mapping, sector_t block) | |||
392 | static const struct address_space_operations minix_aops = { | 399 | static const struct address_space_operations minix_aops = { |
393 | .readpage = minix_readpage, | 400 | .readpage = minix_readpage, |
394 | .writepage = minix_writepage, | 401 | .writepage = minix_writepage, |
395 | .sync_page = block_sync_page, | ||
396 | .write_begin = minix_write_begin, | 402 | .write_begin = minix_write_begin, |
397 | .write_end = generic_write_end, | 403 | .write_end = generic_write_end, |
398 | .bmap = minix_bmap | 404 | .bmap = minix_bmap |
@@ -614,17 +620,16 @@ void minix_truncate(struct inode * inode) | |||
614 | V2_minix_truncate(inode); | 620 | V2_minix_truncate(inode); |
615 | } | 621 | } |
616 | 622 | ||
617 | static int minix_get_sb(struct file_system_type *fs_type, | 623 | static struct dentry *minix_mount(struct file_system_type *fs_type, |
618 | int flags, const char *dev_name, void *data, struct vfsmount *mnt) | 624 | int flags, const char *dev_name, void *data) |
619 | { | 625 | { |
620 | return get_sb_bdev(fs_type, flags, dev_name, data, minix_fill_super, | 626 | return mount_bdev(fs_type, flags, dev_name, data, minix_fill_super); |
621 | mnt); | ||
622 | } | 627 | } |
623 | 628 | ||
624 | static struct file_system_type minix_fs_type = { | 629 | static struct file_system_type minix_fs_type = { |
625 | .owner = THIS_MODULE, | 630 | .owner = THIS_MODULE, |
626 | .name = "minix", | 631 | .name = "minix", |
627 | .get_sb = minix_get_sb, | 632 | .mount = minix_mount, |
628 | .kill_sb = kill_block_super, | 633 | .kill_sb = kill_block_super, |
629 | .fs_flags = FS_REQUIRES_DEV, | 634 | .fs_flags = FS_REQUIRES_DEV, |
630 | }; | 635 | }; |
diff --git a/fs/minix/minix.h b/fs/minix/minix.h index 407b1c84911e..341e2122879a 100644 --- a/fs/minix/minix.h +++ b/fs/minix/minix.h | |||
@@ -88,4 +88,78 @@ static inline struct minix_inode_info *minix_i(struct inode *inode) | |||
88 | return list_entry(inode, struct minix_inode_info, vfs_inode); | 88 | return list_entry(inode, struct minix_inode_info, vfs_inode); |
89 | } | 89 | } |
90 | 90 | ||
91 | #if defined(CONFIG_MINIX_FS_NATIVE_ENDIAN) && \ | ||
92 | defined(CONFIG_MINIX_FS_BIG_ENDIAN_16BIT_INDEXED) | ||
93 | |||
94 | #error Minix file system byte order broken | ||
95 | |||
96 | #elif defined(CONFIG_MINIX_FS_NATIVE_ENDIAN) | ||
97 | |||
98 | /* | ||
99 | * big-endian 32 or 64 bit indexed bitmaps on big-endian system or | ||
100 | * little-endian bitmaps on little-endian system | ||
101 | */ | ||
102 | |||
103 | #define minix_test_and_set_bit(nr, addr) \ | ||
104 | __test_and_set_bit((nr), (unsigned long *)(addr)) | ||
105 | #define minix_set_bit(nr, addr) \ | ||
106 | __set_bit((nr), (unsigned long *)(addr)) | ||
107 | #define minix_test_and_clear_bit(nr, addr) \ | ||
108 | __test_and_clear_bit((nr), (unsigned long *)(addr)) | ||
109 | #define minix_test_bit(nr, addr) \ | ||
110 | test_bit((nr), (unsigned long *)(addr)) | ||
111 | #define minix_find_first_zero_bit(addr, size) \ | ||
112 | find_first_zero_bit((unsigned long *)(addr), (size)) | ||
113 | |||
114 | #elif defined(CONFIG_MINIX_FS_BIG_ENDIAN_16BIT_INDEXED) | ||
115 | |||
116 | /* | ||
117 | * big-endian 16bit indexed bitmaps | ||
118 | */ | ||
119 | |||
120 | static inline int minix_find_first_zero_bit(const void *vaddr, unsigned size) | ||
121 | { | ||
122 | const unsigned short *p = vaddr, *addr = vaddr; | ||
123 | unsigned short num; | ||
124 | |||
125 | if (!size) | ||
126 | return 0; | ||
127 | |||
128 | size = (size >> 4) + ((size & 15) > 0); | ||
129 | while (*p++ == 0xffff) { | ||
130 | if (--size == 0) | ||
131 | return (p - addr) << 4; | ||
132 | } | ||
133 | |||
134 | num = *--p; | ||
135 | return ((p - addr) << 4) + ffz(num); | ||
136 | } | ||
137 | |||
138 | #define minix_test_and_set_bit(nr, addr) \ | ||
139 | __test_and_set_bit((nr) ^ 16, (unsigned long *)(addr)) | ||
140 | #define minix_set_bit(nr, addr) \ | ||
141 | __set_bit((nr) ^ 16, (unsigned long *)(addr)) | ||
142 | #define minix_test_and_clear_bit(nr, addr) \ | ||
143 | __test_and_clear_bit((nr) ^ 16, (unsigned long *)(addr)) | ||
144 | |||
145 | static inline int minix_test_bit(int nr, const void *vaddr) | ||
146 | { | ||
147 | const unsigned short *p = vaddr; | ||
148 | return (p[nr >> 4] & (1U << (nr & 15))) != 0; | ||
149 | } | ||
150 | |||
151 | #else | ||
152 | |||
153 | /* | ||
154 | * little-endian bitmaps | ||
155 | */ | ||
156 | |||
157 | #define minix_test_and_set_bit __test_and_set_bit_le | ||
158 | #define minix_set_bit __set_bit_le | ||
159 | #define minix_test_and_clear_bit __test_and_clear_bit_le | ||
160 | #define minix_test_bit test_bit_le | ||
161 | #define minix_find_first_zero_bit find_first_zero_bit_le | ||
162 | |||
163 | #endif | ||
164 | |||
91 | #endif /* FS_MINIX_H */ | 165 | #endif /* FS_MINIX_H */ |
diff --git a/fs/minix/namei.c b/fs/minix/namei.c index f3f3578393a4..6e6777f1b4b2 100644 --- a/fs/minix/namei.c +++ b/fs/minix/namei.c | |||
@@ -23,8 +23,6 @@ static struct dentry *minix_lookup(struct inode * dir, struct dentry *dentry, st | |||
23 | struct inode * inode = NULL; | 23 | struct inode * inode = NULL; |
24 | ino_t ino; | 24 | ino_t ino; |
25 | 25 | ||
26 | dentry->d_op = dir->i_sb->s_root->d_op; | ||
27 | |||
28 | if (dentry->d_name.len > minix_sb(dir->i_sb)->s_namelen) | 26 | if (dentry->d_name.len > minix_sb(dir->i_sb)->s_namelen) |
29 | return ERR_PTR(-ENAMETOOLONG); | 27 | return ERR_PTR(-ENAMETOOLONG); |
30 | 28 | ||
@@ -101,7 +99,7 @@ static int minix_link(struct dentry * old_dentry, struct inode * dir, | |||
101 | 99 | ||
102 | inode->i_ctime = CURRENT_TIME_SEC; | 100 | inode->i_ctime = CURRENT_TIME_SEC; |
103 | inode_inc_link_count(inode); | 101 | inode_inc_link_count(inode); |
104 | atomic_inc(&inode->i_count); | 102 | ihold(inode); |
105 | return add_nondir(dentry, inode); | 103 | return add_nondir(dentry, inode); |
106 | } | 104 | } |
107 | 105 | ||
@@ -215,7 +213,6 @@ static int minix_rename(struct inode * old_dir, struct dentry *old_dentry, | |||
215 | new_de = minix_find_entry(new_dentry, &new_page); | 213 | new_de = minix_find_entry(new_dentry, &new_page); |
216 | if (!new_de) | 214 | if (!new_de) |
217 | goto out_dir; | 215 | goto out_dir; |
218 | inode_inc_link_count(old_inode); | ||
219 | minix_set_link(new_de, new_page, old_inode); | 216 | minix_set_link(new_de, new_page, old_inode); |
220 | new_inode->i_ctime = CURRENT_TIME_SEC; | 217 | new_inode->i_ctime = CURRENT_TIME_SEC; |
221 | if (dir_de) | 218 | if (dir_de) |
@@ -227,18 +224,15 @@ static int minix_rename(struct inode * old_dir, struct dentry *old_dentry, | |||
227 | if (new_dir->i_nlink >= info->s_link_max) | 224 | if (new_dir->i_nlink >= info->s_link_max) |
228 | goto out_dir; | 225 | goto out_dir; |
229 | } | 226 | } |
230 | inode_inc_link_count(old_inode); | ||
231 | err = minix_add_link(new_dentry, old_inode); | 227 | err = minix_add_link(new_dentry, old_inode); |
232 | if (err) { | 228 | if (err) |
233 | inode_dec_link_count(old_inode); | ||
234 | goto out_dir; | 229 | goto out_dir; |
235 | } | ||
236 | if (dir_de) | 230 | if (dir_de) |
237 | inode_inc_link_count(new_dir); | 231 | inode_inc_link_count(new_dir); |
238 | } | 232 | } |
239 | 233 | ||
240 | minix_delete_entry(old_de, old_page); | 234 | minix_delete_entry(old_de, old_page); |
241 | inode_dec_link_count(old_inode); | 235 | mark_inode_dirty(old_inode); |
242 | 236 | ||
243 | if (dir_de) { | 237 | if (dir_de) { |
244 | minix_set_link(dir_de, dir_page, new_dir); | 238 | minix_set_link(dir_de, dir_page, new_dir); |