xref: /linux/fs/sysv/inode.c (revision 0dd9ac63ce26ec87b080ca9c3e6efed33c23ace6)
1 /*
2  *  linux/fs/sysv/inode.c
3  *
4  *  minix/inode.c
5  *  Copyright (C) 1991, 1992  Linus Torvalds
6  *
7  *  xenix/inode.c
8  *  Copyright (C) 1992  Doug Evans
9  *
10  *  coh/inode.c
11  *  Copyright (C) 1993  Pascal Haible, Bruno Haible
12  *
13  *  sysv/inode.c
14  *  Copyright (C) 1993  Paul B. Monday
15  *
16  *  sysv/inode.c
17  *  Copyright (C) 1993  Bruno Haible
18  *  Copyright (C) 1997, 1998  Krzysztof G. Baranowski
19  *
20  *  This file contains code for allocating/freeing inodes and for read/writing
21  *  the superblock.
22  */
23 
24 #include <linux/highuid.h>
25 #include <linux/slab.h>
26 #include <linux/init.h>
27 #include <linux/buffer_head.h>
28 #include <linux/vfs.h>
29 #include <linux/writeback.h>
30 #include <linux/namei.h>
31 #include <asm/byteorder.h>
32 #include "sysv.h"
33 
34 static int sysv_sync_fs(struct super_block *sb, int wait)
35 {
36 	struct sysv_sb_info *sbi = SYSV_SB(sb);
37 	unsigned long time = get_seconds(), old_time;
38 
39 	lock_super(sb);
40 
41 	/*
42 	 * If we are going to write out the super block,
43 	 * then attach current time stamp.
44 	 * But if the filesystem was marked clean, keep it clean.
45 	 */
46 	sb->s_dirt = 0;
47 	old_time = fs32_to_cpu(sbi, *sbi->s_sb_time);
48 	if (sbi->s_type == FSTYPE_SYSV4) {
49 		if (*sbi->s_sb_state == cpu_to_fs32(sbi, 0x7c269d38 - old_time))
50 			*sbi->s_sb_state = cpu_to_fs32(sbi, 0x7c269d38 - time);
51 		*sbi->s_sb_time = cpu_to_fs32(sbi, time);
52 		mark_buffer_dirty(sbi->s_bh2);
53 	}
54 
55 	unlock_super(sb);
56 
57 	return 0;
58 }
59 
60 static void sysv_write_super(struct super_block *sb)
61 {
62 	if (!(sb->s_flags & MS_RDONLY))
63 		sysv_sync_fs(sb, 1);
64 	else
65 		sb->s_dirt = 0;
66 }
67 
68 static int sysv_remount(struct super_block *sb, int *flags, char *data)
69 {
70 	struct sysv_sb_info *sbi = SYSV_SB(sb);
71 	lock_super(sb);
72 	if (sbi->s_forced_ro)
73 		*flags |= MS_RDONLY;
74 	if (!(*flags & MS_RDONLY))
75 		sb->s_dirt = 1;
76 	unlock_super(sb);
77 	return 0;
78 }
79 
80 static void sysv_put_super(struct super_block *sb)
81 {
82 	struct sysv_sb_info *sbi = SYSV_SB(sb);
83 
84 	if (sb->s_dirt)
85 		sysv_write_super(sb);
86 
87 	if (!(sb->s_flags & MS_RDONLY)) {
88 		/* XXX ext2 also updates the state here */
89 		mark_buffer_dirty(sbi->s_bh1);
90 		if (sbi->s_bh1 != sbi->s_bh2)
91 			mark_buffer_dirty(sbi->s_bh2);
92 	}
93 
94 	brelse(sbi->s_bh1);
95 	if (sbi->s_bh1 != sbi->s_bh2)
96 		brelse(sbi->s_bh2);
97 
98 	kfree(sbi);
99 }
100 
101 static int sysv_statfs(struct dentry *dentry, struct kstatfs *buf)
102 {
103 	struct super_block *sb = dentry->d_sb;
104 	struct sysv_sb_info *sbi = SYSV_SB(sb);
105 	u64 id = huge_encode_dev(sb->s_bdev->bd_dev);
106 
107 	buf->f_type = sb->s_magic;
108 	buf->f_bsize = sb->s_blocksize;
109 	buf->f_blocks = sbi->s_ndatazones;
110 	buf->f_bavail = buf->f_bfree = sysv_count_free_blocks(sb);
111 	buf->f_files = sbi->s_ninodes;
112 	buf->f_ffree = sysv_count_free_inodes(sb);
113 	buf->f_namelen = SYSV_NAMELEN;
114 	buf->f_fsid.val[0] = (u32)id;
115 	buf->f_fsid.val[1] = (u32)(id >> 32);
116 	return 0;
117 }
118 
119 /*
120  * NXI <-> N0XI for PDP, XIN <-> XIN0 for le32, NIX <-> 0NIX for be32
121  */
122 static inline void read3byte(struct sysv_sb_info *sbi,
123 	unsigned char * from, unsigned char * to)
124 {
125 	if (sbi->s_bytesex == BYTESEX_PDP) {
126 		to[0] = from[0];
127 		to[1] = 0;
128 		to[2] = from[1];
129 		to[3] = from[2];
130 	} else if (sbi->s_bytesex == BYTESEX_LE) {
131 		to[0] = from[0];
132 		to[1] = from[1];
133 		to[2] = from[2];
134 		to[3] = 0;
135 	} else {
136 		to[0] = 0;
137 		to[1] = from[0];
138 		to[2] = from[1];
139 		to[3] = from[2];
140 	}
141 }
142 
143 static inline void write3byte(struct sysv_sb_info *sbi,
144 	unsigned char * from, unsigned char * to)
145 {
146 	if (sbi->s_bytesex == BYTESEX_PDP) {
147 		to[0] = from[0];
148 		to[1] = from[2];
149 		to[2] = from[3];
150 	} else if (sbi->s_bytesex == BYTESEX_LE) {
151 		to[0] = from[0];
152 		to[1] = from[1];
153 		to[2] = from[2];
154 	} else {
155 		to[0] = from[1];
156 		to[1] = from[2];
157 		to[2] = from[3];
158 	}
159 }
160 
161 static const struct inode_operations sysv_symlink_inode_operations = {
162 	.readlink	= generic_readlink,
163 	.follow_link	= page_follow_link_light,
164 	.put_link	= page_put_link,
165 	.getattr	= sysv_getattr,
166 };
167 
168 void sysv_set_inode(struct inode *inode, dev_t rdev)
169 {
170 	if (S_ISREG(inode->i_mode)) {
171 		inode->i_op = &sysv_file_inode_operations;
172 		inode->i_fop = &sysv_file_operations;
173 		inode->i_mapping->a_ops = &sysv_aops;
174 	} else if (S_ISDIR(inode->i_mode)) {
175 		inode->i_op = &sysv_dir_inode_operations;
176 		inode->i_fop = &sysv_dir_operations;
177 		inode->i_mapping->a_ops = &sysv_aops;
178 	} else if (S_ISLNK(inode->i_mode)) {
179 		if (inode->i_blocks) {
180 			inode->i_op = &sysv_symlink_inode_operations;
181 			inode->i_mapping->a_ops = &sysv_aops;
182 		} else {
183 			inode->i_op = &sysv_fast_symlink_inode_operations;
184 			nd_terminate_link(SYSV_I(inode)->i_data, inode->i_size,
185 				sizeof(SYSV_I(inode)->i_data) - 1);
186 		}
187 	} else
188 		init_special_inode(inode, inode->i_mode, rdev);
189 }
190 
191 struct inode *sysv_iget(struct super_block *sb, unsigned int ino)
192 {
193 	struct sysv_sb_info * sbi = SYSV_SB(sb);
194 	struct buffer_head * bh;
195 	struct sysv_inode * raw_inode;
196 	struct sysv_inode_info * si;
197 	struct inode *inode;
198 	unsigned int block;
199 
200 	if (!ino || ino > sbi->s_ninodes) {
201 		printk("Bad inode number on dev %s: %d is out of range\n",
202 		       sb->s_id, ino);
203 		return ERR_PTR(-EIO);
204 	}
205 
206 	inode = iget_locked(sb, ino);
207 	if (!inode)
208 		return ERR_PTR(-ENOMEM);
209 	if (!(inode->i_state & I_NEW))
210 		return inode;
211 
212 	raw_inode = sysv_raw_inode(sb, ino, &bh);
213 	if (!raw_inode) {
214 		printk("Major problem: unable to read inode from dev %s\n",
215 		       inode->i_sb->s_id);
216 		goto bad_inode;
217 	}
218 	/* SystemV FS: kludge permissions if ino==SYSV_ROOT_INO ?? */
219 	inode->i_mode = fs16_to_cpu(sbi, raw_inode->i_mode);
220 	inode->i_uid = (uid_t)fs16_to_cpu(sbi, raw_inode->i_uid);
221 	inode->i_gid = (gid_t)fs16_to_cpu(sbi, raw_inode->i_gid);
222 	inode->i_nlink = fs16_to_cpu(sbi, raw_inode->i_nlink);
223 	inode->i_size = fs32_to_cpu(sbi, raw_inode->i_size);
224 	inode->i_atime.tv_sec = fs32_to_cpu(sbi, raw_inode->i_atime);
225 	inode->i_mtime.tv_sec = fs32_to_cpu(sbi, raw_inode->i_mtime);
226 	inode->i_ctime.tv_sec = fs32_to_cpu(sbi, raw_inode->i_ctime);
227 	inode->i_ctime.tv_nsec = 0;
228 	inode->i_atime.tv_nsec = 0;
229 	inode->i_mtime.tv_nsec = 0;
230 	inode->i_blocks = 0;
231 
232 	si = SYSV_I(inode);
233 	for (block = 0; block < 10+1+1+1; block++)
234 		read3byte(sbi, &raw_inode->i_data[3*block],
235 				(u8 *)&si->i_data[block]);
236 	brelse(bh);
237 	si->i_dir_start_lookup = 0;
238 	if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode))
239 		sysv_set_inode(inode,
240 			       old_decode_dev(fs32_to_cpu(sbi, si->i_data[0])));
241 	else
242 		sysv_set_inode(inode, 0);
243 	unlock_new_inode(inode);
244 	return inode;
245 
246 bad_inode:
247 	iget_failed(inode);
248 	return ERR_PTR(-EIO);
249 }
250 
251 static int __sysv_write_inode(struct inode *inode, int wait)
252 {
253 	struct super_block * sb = inode->i_sb;
254 	struct sysv_sb_info * sbi = SYSV_SB(sb);
255 	struct buffer_head * bh;
256 	struct sysv_inode * raw_inode;
257 	struct sysv_inode_info * si;
258 	unsigned int ino, block;
259 	int err = 0;
260 
261 	ino = inode->i_ino;
262 	if (!ino || ino > sbi->s_ninodes) {
263 		printk("Bad inode number on dev %s: %d is out of range\n",
264 		       inode->i_sb->s_id, ino);
265 		return -EIO;
266 	}
267 	raw_inode = sysv_raw_inode(sb, ino, &bh);
268 	if (!raw_inode) {
269 		printk("unable to read i-node block\n");
270 		return -EIO;
271 	}
272 
273 	raw_inode->i_mode = cpu_to_fs16(sbi, inode->i_mode);
274 	raw_inode->i_uid = cpu_to_fs16(sbi, fs_high2lowuid(inode->i_uid));
275 	raw_inode->i_gid = cpu_to_fs16(sbi, fs_high2lowgid(inode->i_gid));
276 	raw_inode->i_nlink = cpu_to_fs16(sbi, inode->i_nlink);
277 	raw_inode->i_size = cpu_to_fs32(sbi, inode->i_size);
278 	raw_inode->i_atime = cpu_to_fs32(sbi, inode->i_atime.tv_sec);
279 	raw_inode->i_mtime = cpu_to_fs32(sbi, inode->i_mtime.tv_sec);
280 	raw_inode->i_ctime = cpu_to_fs32(sbi, inode->i_ctime.tv_sec);
281 
282 	si = SYSV_I(inode);
283 	if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode))
284 		si->i_data[0] = cpu_to_fs32(sbi, old_encode_dev(inode->i_rdev));
285 	for (block = 0; block < 10+1+1+1; block++)
286 		write3byte(sbi, (u8 *)&si->i_data[block],
287 			&raw_inode->i_data[3*block]);
288 	mark_buffer_dirty(bh);
289 	if (wait) {
290                 sync_dirty_buffer(bh);
291                 if (buffer_req(bh) && !buffer_uptodate(bh)) {
292                         printk ("IO error syncing sysv inode [%s:%08x]\n",
293                                 sb->s_id, ino);
294                         err = -EIO;
295                 }
296         }
297 	brelse(bh);
298 	return 0;
299 }
300 
301 int sysv_write_inode(struct inode *inode, struct writeback_control *wbc)
302 {
303 	return __sysv_write_inode(inode, wbc->sync_mode == WB_SYNC_ALL);
304 }
305 
306 int sysv_sync_inode(struct inode *inode)
307 {
308 	return __sysv_write_inode(inode, 1);
309 }
310 
311 static void sysv_delete_inode(struct inode *inode)
312 {
313 	truncate_inode_pages(&inode->i_data, 0);
314 	inode->i_size = 0;
315 	sysv_truncate(inode);
316 	sysv_free_inode(inode);
317 }
318 
319 static struct kmem_cache *sysv_inode_cachep;
320 
321 static struct inode *sysv_alloc_inode(struct super_block *sb)
322 {
323 	struct sysv_inode_info *si;
324 
325 	si = kmem_cache_alloc(sysv_inode_cachep, GFP_KERNEL);
326 	if (!si)
327 		return NULL;
328 	return &si->vfs_inode;
329 }
330 
331 static void sysv_destroy_inode(struct inode *inode)
332 {
333 	kmem_cache_free(sysv_inode_cachep, SYSV_I(inode));
334 }
335 
336 static void init_once(void *p)
337 {
338 	struct sysv_inode_info *si = (struct sysv_inode_info *)p;
339 
340 	inode_init_once(&si->vfs_inode);
341 }
342 
343 const struct super_operations sysv_sops = {
344 	.alloc_inode	= sysv_alloc_inode,
345 	.destroy_inode	= sysv_destroy_inode,
346 	.write_inode	= sysv_write_inode,
347 	.delete_inode	= sysv_delete_inode,
348 	.put_super	= sysv_put_super,
349 	.write_super	= sysv_write_super,
350 	.sync_fs	= sysv_sync_fs,
351 	.remount_fs	= sysv_remount,
352 	.statfs		= sysv_statfs,
353 };
354 
355 int __init sysv_init_icache(void)
356 {
357 	sysv_inode_cachep = kmem_cache_create("sysv_inode_cache",
358 			sizeof(struct sysv_inode_info), 0,
359 			SLAB_RECLAIM_ACCOUNT|SLAB_MEM_SPREAD,
360 			init_once);
361 	if (!sysv_inode_cachep)
362 		return -ENOMEM;
363 	return 0;
364 }
365 
366 void sysv_destroy_icache(void)
367 {
368 	kmem_cache_destroy(sysv_inode_cachep);
369 }
370