RHEL4/fs/bad_inode.c
<<
>>
Prefs
   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#include <asm/poll.h>
  19
  20
  21static loff_t bad_file_llseek(struct file *file, loff_t offset, int origin)
  22{
  23        return -EIO;
  24}
  25
  26static ssize_t bad_file_read(struct file *filp, char __user *buf,
  27                        size_t size, loff_t *ppos)
  28{
  29        return -EIO;
  30}
  31
  32static ssize_t bad_file_write(struct file *filp, const char __user *buf,
  33                        size_t siz, loff_t *ppos)
  34{
  35        return -EIO;
  36}
  37
  38static ssize_t bad_file_aio_read(struct kiocb *iocb, char __user *buf,
  39                        size_t count, loff_t pos)
  40{
  41        return -EIO;
  42}
  43
  44static ssize_t bad_file_aio_write(struct kiocb *iocb, const char __user *buf,
  45                        size_t count, loff_t pos)
  46{
  47        return -EIO;
  48}
  49
  50static int bad_file_readdir(struct file *filp, void *dirent, filldir_t filldir)
  51{
  52        return -EIO;
  53}
  54
  55static unsigned int bad_file_poll(struct file *filp, struct poll_table_struct *wait)
  56{
  57        return POLLERR;
  58}
  59
  60static int bad_file_ioctl (struct inode *inode, struct file *filp,
  61                        unsigned int cmd, unsigned long arg)
  62{
  63        return -EIO;
  64}
  65
  66static int bad_file_mmap(struct file *file, struct vm_area_struct *vma)
  67{
  68        return -EIO;
  69}
  70
  71static int bad_file_open(struct inode *inode, struct file *filp)
  72{
  73        return -EIO;
  74}
  75
  76static int bad_file_flush(struct file *file)
  77{
  78        return -EIO;
  79}
  80
  81static int bad_file_release(struct inode *inode, struct file *filp)
  82{
  83        return -EIO;
  84}
  85
  86static int bad_file_fsync(struct file *file, struct dentry *dentry,
  87                        int datasync)
  88{
  89        return -EIO;
  90}
  91
  92static int bad_file_aio_fsync(struct kiocb *iocb, int datasync)
  93{
  94        return -EIO;
  95}
  96
  97static int bad_file_fasync(int fd, struct file *filp, int on)
  98{
  99        return -EIO;
 100}
 101
 102static int bad_file_lock(struct file *file, int cmd, struct file_lock *fl)
 103{
 104        return -EIO;
 105}
 106
 107static ssize_t bad_file_readv(struct file *filp, const struct iovec *iov,
 108                        unsigned long nr_segs, loff_t *ppos)
 109{
 110        return -EIO;
 111}
 112
 113static ssize_t bad_file_writev(struct file *filp, const struct iovec *iov,
 114                        unsigned long nr_segs, loff_t *ppos)
 115{
 116        return -EIO;
 117}
 118
 119static ssize_t bad_file_sendfile(struct file *in_file, loff_t *ppos,
 120                        size_t count, read_actor_t actor, void *target)
 121{
 122        return -EIO;
 123}
 124
 125static ssize_t bad_file_sendpage(struct file *file, struct page *page,
 126                        int off, size_t len, loff_t *pos, int more)
 127{
 128        return -EIO;
 129}
 130
 131static unsigned long bad_file_get_unmapped_area(struct file *file,
 132                                unsigned long addr, unsigned long len,
 133                                unsigned long pgoff, unsigned long flags)
 134{
 135        return -EIO;
 136}
 137
 138static int bad_file_check_flags(int flags)
 139{
 140        return -EIO;
 141}
 142
 143static int bad_file_dir_notify(struct file *file, unsigned long arg)
 144{
 145        return -EIO;
 146}
 147
 148static int bad_file_flock(struct file *filp, int cmd, struct file_lock *fl)
 149{
 150        return -EIO;
 151}
 152
 153static struct file_operations bad_file_ops =
 154{
 155        .llseek         = bad_file_llseek,
 156        .read           = bad_file_read,
 157        .aio_read       = bad_file_aio_read,
 158        .write          = bad_file_write,
 159        .aio_write      = bad_file_aio_write,
 160        .readdir        = bad_file_readdir,
 161        .poll           = bad_file_poll,
 162        .ioctl          = bad_file_ioctl,
 163        .mmap           = bad_file_mmap,
 164        .open           = bad_file_open,
 165        .flush          = bad_file_flush,
 166        .release        = bad_file_release,
 167        .fsync          = bad_file_fsync,
 168        .aio_fsync      = bad_file_aio_fsync,
 169        .fasync         = bad_file_fasync,
 170        .lock           = bad_file_lock,
 171        .readv          = bad_file_readv,
 172        .writev         = bad_file_writev,
 173        .sendfile       = bad_file_sendfile,
 174        .sendpage       = bad_file_sendpage,
 175        .get_unmapped_area = bad_file_get_unmapped_area,
 176        .check_flags    = bad_file_check_flags,
 177        .dir_notify     = bad_file_dir_notify,
 178        .flock          = bad_file_flock,
 179};
 180
 181static int bad_inode_create (struct inode *dir, struct dentry *dentry,
 182                int mode, struct nameidata *nd)
 183{
 184        return -EIO;
 185}
 186
 187static struct dentry *bad_inode_lookup(struct inode *dir,
 188                        struct dentry *dentry, struct nameidata *nd)
 189{
 190        return ERR_PTR(-EIO);
 191}
 192
 193static int bad_inode_link (struct dentry *old_dentry, struct inode *dir,
 194                struct dentry *dentry)
 195{
 196        return -EIO;
 197}
 198
 199static int bad_inode_unlink(struct inode *dir, struct dentry *dentry)
 200{
 201        return -EIO;
 202}
 203
 204static int bad_inode_symlink (struct inode *dir, struct dentry *dentry,
 205                const char *symname)
 206{
 207        return -EIO;
 208}
 209
 210static int bad_inode_mkdir(struct inode *dir, struct dentry *dentry,
 211                        int mode)
 212{
 213        return -EIO;
 214}
 215
 216static int bad_inode_rmdir (struct inode *dir, struct dentry *dentry)
 217{
 218        return -EIO;
 219}
 220
 221static int bad_inode_mknod (struct inode *dir, struct dentry *dentry,
 222                        int mode, dev_t rdev)
 223{
 224        return -EIO;
 225}
 226
 227static int bad_inode_rename (struct inode *old_dir, struct dentry *old_dentry,
 228                struct inode *new_dir, struct dentry *new_dentry)
 229{
 230        return -EIO;
 231}
 232
 233static int bad_inode_readlink(struct dentry *dentry, char __user *buffer,
 234                int buflen)
 235{
 236        return -EIO;
 237}
 238
 239/*
 240 * The follow_link operation is special: it must behave as a no-op
 241 * so that a bad root inode can at least be unmounted. To do this
 242 * we must dput() the base and return the dentry with a dget().
 243 */
 244static int bad_inode_follow_link(struct dentry *dent, struct nameidata *nd)
 245{
 246        nd_set_link(nd, ERR_PTR(-EIO));
 247        return 0;
 248}
 249
 250static int bad_inode_permission(struct inode *inode, int mask,
 251                        struct nameidata *nd)
 252{
 253        return -EIO;
 254}
 255
 256static int bad_inode_getattr(struct vfsmount *mnt, struct dentry *dentry,
 257                        struct kstat *stat)
 258{
 259        return -EIO;
 260}
 261
 262static int bad_inode_setattr(struct dentry *direntry, struct iattr *attrs)
 263{
 264        return -EIO;
 265}
 266
 267static int bad_inode_setxattr(struct dentry *dentry, const char *name,
 268                const void *value, size_t size, int flags)
 269{
 270        return -EIO;
 271}
 272
 273static ssize_t bad_inode_getxattr(struct dentry *dentry, const char *name,
 274                        void *buffer, size_t size)
 275{
 276        return -EIO;
 277}
 278
 279static ssize_t bad_inode_listxattr(struct dentry *dentry, char *buffer,
 280                        size_t buffer_size)
 281{
 282        return -EIO;
 283}
 284
 285static int bad_inode_removexattr(struct dentry *dentry, const char *name)
 286{
 287        return -EIO;
 288}
 289
 290static struct inode_operations bad_inode_ops =
 291{
 292        .create         = bad_inode_create,
 293        .lookup         = bad_inode_lookup,
 294        .link           = bad_inode_link,
 295        .unlink         = bad_inode_unlink,
 296        .symlink        = bad_inode_symlink,
 297        .mkdir          = bad_inode_mkdir,
 298        .rmdir          = bad_inode_rmdir,
 299        .mknod          = bad_inode_mknod,
 300        .rename         = bad_inode_rename,
 301        .readlink       = bad_inode_readlink,
 302        .follow_link    = bad_inode_follow_link,
 303        /* put_link returns void */
 304        /* truncate returns void */
 305        .permission     = bad_inode_permission,
 306        .getattr        = bad_inode_getattr,
 307        .setattr        = bad_inode_setattr,
 308        .setxattr       = bad_inode_setxattr,
 309        .getxattr       = bad_inode_getxattr,
 310        .listxattr      = bad_inode_listxattr,
 311        .removexattr    = bad_inode_removexattr,
 312};
 313
 314
 315/*
 316 * When a filesystem is unable to read an inode due to an I/O error in
 317 * its read_inode() function, it can call make_bad_inode() to return a
 318 * set of stubs which will return EIO errors as required. 
 319 *
 320 * We only need to do limited initialisation: all other fields are
 321 * preinitialised to zero automatically.
 322 */
 323 
 324/**
 325 *      make_bad_inode - mark an inode bad due to an I/O error
 326 *      @inode: Inode to mark bad
 327 *
 328 *      When an inode cannot be read due to a media or remote network
 329 *      failure this function makes the inode "bad" and causes I/O operations
 330 *      on it to fail from this point on.
 331 */
 332 
 333void make_bad_inode(struct inode *inode)
 334{
 335        remove_inode_hash(inode);
 336
 337        inode->i_mode = S_IFREG;
 338        inode->i_atime = inode->i_mtime = inode->i_ctime =
 339                current_fs_time(inode->i_sb);
 340        inode->i_op = &bad_inode_ops;
 341        inode->i_fop = &bad_file_ops;
 342}
 343EXPORT_SYMBOL(make_bad_inode);
 344
 345/*
 346 * This tests whether an inode has been flagged as bad. The test uses
 347 * &bad_inode_ops to cover the case of invalidated inodes as well as
 348 * those created by make_bad_inode() above.
 349 */
 350 
 351/**
 352 *      is_bad_inode - is an inode errored
 353 *      @inode: inode to test
 354 *
 355 *      Returns true if the inode in question has been marked as bad.
 356 */
 357 
 358int is_bad_inode(struct inode *inode)
 359{
 360        return (inode->i_op == &bad_inode_ops); 
 361}
 362
 363EXPORT_SYMBOL(is_bad_inode);
 364
 365/**
 366 * iget_failed - Mark an under-construction inode as dead and release it
 367 * @inode: The inode to discard
 368 *
 369 * Mark an under-construction inode as dead and release it.
 370 */
 371void iget_failed(struct inode *inode)
 372{
 373        make_bad_inode(inode);
 374        unlock_new_inode(inode);
 375        iput(inode);
 376}
 377EXPORT_SYMBOL(iget_failed);
 378