Contents of /alx-src/tags/kernel26-2.6.12-alx-r9/fs/bad_inode.c
Parent Directory | Revision Log
Revision 630 -
(show annotations)
(download)
Wed Mar 4 11:03:09 2009 UTC (15 years, 6 months ago) by niro
File MIME type: text/plain
File size: 2863 byte(s)
Wed Mar 4 11:03:09 2009 UTC (15 years, 6 months ago) by niro
File MIME type: text/plain
File size: 2863 byte(s)
Tag kernel26-2.6.12-alx-r9
1 | /* |
2 | * linux/fs/bad_inode.c |
3 | * |
4 | * Copyright (C) 1997, Stephen Tweedie |
5 | * |
6 | * Provide stub functions for unreadable inodes |
7 | * |
8 | * Fabian Frederick : August 2003 - All file operations assigned to EIO |
9 | */ |
10 | |
11 | #include <linux/fs.h> |
12 | #include <linux/module.h> |
13 | #include <linux/stat.h> |
14 | #include <linux/time.h> |
15 | #include <linux/smp_lock.h> |
16 | #include <linux/namei.h> |
17 | |
18 | static int return_EIO(void) |
19 | { |
20 | return -EIO; |
21 | } |
22 | |
23 | #define EIO_ERROR ((void *) (return_EIO)) |
24 | |
25 | static struct file_operations bad_file_ops = |
26 | { |
27 | .llseek = EIO_ERROR, |
28 | .aio_read = EIO_ERROR, |
29 | .read = EIO_ERROR, |
30 | .write = EIO_ERROR, |
31 | .aio_write = EIO_ERROR, |
32 | .readdir = EIO_ERROR, |
33 | .poll = EIO_ERROR, |
34 | .ioctl = EIO_ERROR, |
35 | .mmap = EIO_ERROR, |
36 | .open = EIO_ERROR, |
37 | .flush = EIO_ERROR, |
38 | .release = EIO_ERROR, |
39 | .fsync = EIO_ERROR, |
40 | .aio_fsync = EIO_ERROR, |
41 | .fasync = EIO_ERROR, |
42 | .lock = EIO_ERROR, |
43 | .readv = EIO_ERROR, |
44 | .writev = EIO_ERROR, |
45 | .sendfile = EIO_ERROR, |
46 | .sendpage = EIO_ERROR, |
47 | .get_unmapped_area = EIO_ERROR, |
48 | }; |
49 | |
50 | static struct inode_operations bad_inode_ops = |
51 | { |
52 | .create = EIO_ERROR, |
53 | .lookup = EIO_ERROR, |
54 | .link = EIO_ERROR, |
55 | .unlink = EIO_ERROR, |
56 | .symlink = EIO_ERROR, |
57 | .mkdir = EIO_ERROR, |
58 | .rmdir = EIO_ERROR, |
59 | .mknod = EIO_ERROR, |
60 | .rename = EIO_ERROR, |
61 | .readlink = EIO_ERROR, |
62 | /* follow_link must be no-op, otherwise unmounting this inode |
63 | won't work */ |
64 | .truncate = EIO_ERROR, |
65 | .permission = EIO_ERROR, |
66 | .getattr = EIO_ERROR, |
67 | .setattr = EIO_ERROR, |
68 | .setxattr = EIO_ERROR, |
69 | .getxattr = EIO_ERROR, |
70 | .listxattr = EIO_ERROR, |
71 | .removexattr = EIO_ERROR, |
72 | }; |
73 | |
74 | |
75 | /* |
76 | * When a filesystem is unable to read an inode due to an I/O error in |
77 | * its read_inode() function, it can call make_bad_inode() to return a |
78 | * set of stubs which will return EIO errors as required. |
79 | * |
80 | * We only need to do limited initialisation: all other fields are |
81 | * preinitialised to zero automatically. |
82 | */ |
83 | |
84 | /** |
85 | * make_bad_inode - mark an inode bad due to an I/O error |
86 | * @inode: Inode to mark bad |
87 | * |
88 | * When an inode cannot be read due to a media or remote network |
89 | * failure this function makes the inode "bad" and causes I/O operations |
90 | * on it to fail from this point on. |
91 | */ |
92 | |
93 | void make_bad_inode(struct inode * inode) |
94 | { |
95 | remove_inode_hash(inode); |
96 | |
97 | inode->i_mode = S_IFREG; |
98 | inode->i_atime = inode->i_mtime = inode->i_ctime = |
99 | current_fs_time(inode->i_sb); |
100 | inode->i_op = &bad_inode_ops; |
101 | inode->i_fop = &bad_file_ops; |
102 | } |
103 | EXPORT_SYMBOL(make_bad_inode); |
104 | |
105 | /* |
106 | * This tests whether an inode has been flagged as bad. The test uses |
107 | * &bad_inode_ops to cover the case of invalidated inodes as well as |
108 | * those created by make_bad_inode() above. |
109 | */ |
110 | |
111 | /** |
112 | * is_bad_inode - is an inode errored |
113 | * @inode: inode to test |
114 | * |
115 | * Returns true if the inode in question has been marked as bad. |
116 | */ |
117 | |
118 | int is_bad_inode(struct inode * inode) |
119 | { |
120 | return (inode->i_op == &bad_inode_ops); |
121 | } |
122 | |
123 | EXPORT_SYMBOL(is_bad_inode); |