aboutsummaryrefslogtreecommitdiffstats
path: root/fs/minix
diff options
context:
space:
mode:
authorGlenn Elliott <gelliott@cs.unc.edu>2012-03-04 19:47:13 -0500
committerGlenn Elliott <gelliott@cs.unc.edu>2012-03-04 19:47:13 -0500
commitc71c03bda1e86c9d5198c5d83f712e695c4f2a1e (patch)
treeecb166cb3e2b7e2adb3b5e292245fefd23381ac8 /fs/minix
parentea53c912f8a86a8567697115b6a0d8152beee5c8 (diff)
parent6a00f206debf8a5c8899055726ad127dbeeed098 (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/Kconfig8
-rw-r--r--fs/minix/inode.c19
-rw-r--r--fs/minix/minix.h74
-rw-r--r--fs/minix/namei.c12
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
19config MINIX_FS_NATIVE_ENDIAN
20 def_bool MINIX_FS
21 depends on H8300 || M32R || MICROBLAZE || MIPS || S390 || SUPERH || SPARC || XTENSA || (M68K && !MMU)
22
23config 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
71static void minix_destroy_inode(struct inode *inode) 71static 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
78static void minix_destroy_inode(struct inode *inode)
79{
80 call_rcu(&inode->i_rcu, minix_i_callback);
81}
82
76static void init_once(void *foo) 83static 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)
392static const struct address_space_operations minix_aops = { 399static 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
617static int minix_get_sb(struct file_system_type *fs_type, 623static 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
624static struct file_system_type minix_fs_type = { 629static 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
120static 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
145static 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);