root/fs/bad_inode.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. bad_file_open
  2. bad_inode_create
  3. bad_inode_lookup
  4. bad_inode_link
  5. bad_inode_unlink
  6. bad_inode_symlink
  7. bad_inode_mkdir
  8. bad_inode_rmdir
  9. bad_inode_mknod
  10. bad_inode_rename2
  11. bad_inode_readlink
  12. bad_inode_permission
  13. bad_inode_getattr
  14. bad_inode_setattr
  15. bad_inode_listxattr
  16. bad_inode_get_link
  17. bad_inode_get_acl
  18. bad_inode_fiemap
  19. bad_inode_update_time
  20. bad_inode_atomic_open
  21. bad_inode_tmpfile
  22. bad_inode_set_acl
  23. make_bad_inode
  24. is_bad_inode
  25. iget_failed

   1 // SPDX-License-Identifier: GPL-2.0
   2 /*
   3  *  linux/fs/bad_inode.c
   4  *
   5  *  Copyright (C) 1997, Stephen Tweedie
   6  *
   7  *  Provide stub functions for unreadable inodes
   8  *
   9  *  Fabian Frederick : August 2003 - All file operations assigned to EIO
  10  */
  11 
  12 #include <linux/fs.h>
  13 #include <linux/export.h>
  14 #include <linux/stat.h>
  15 #include <linux/time.h>
  16 #include <linux/namei.h>
  17 #include <linux/poll.h>
  18 
  19 static int bad_file_open(struct inode *inode, struct file *filp)
  20 {
  21         return -EIO;
  22 }
  23 
  24 static const struct file_operations bad_file_ops =
  25 {
  26         .open           = bad_file_open,
  27 };
  28 
  29 static int bad_inode_create (struct inode *dir, struct dentry *dentry,
  30                 umode_t mode, bool excl)
  31 {
  32         return -EIO;
  33 }
  34 
  35 static struct dentry *bad_inode_lookup(struct inode *dir,
  36                         struct dentry *dentry, unsigned int flags)
  37 {
  38         return ERR_PTR(-EIO);
  39 }
  40 
  41 static int bad_inode_link (struct dentry *old_dentry, struct inode *dir,
  42                 struct dentry *dentry)
  43 {
  44         return -EIO;
  45 }
  46 
  47 static int bad_inode_unlink(struct inode *dir, struct dentry *dentry)
  48 {
  49         return -EIO;
  50 }
  51 
  52 static int bad_inode_symlink (struct inode *dir, struct dentry *dentry,
  53                 const char *symname)
  54 {
  55         return -EIO;
  56 }
  57 
  58 static int bad_inode_mkdir(struct inode *dir, struct dentry *dentry,
  59                         umode_t mode)
  60 {
  61         return -EIO;
  62 }
  63 
  64 static int bad_inode_rmdir (struct inode *dir, struct dentry *dentry)
  65 {
  66         return -EIO;
  67 }
  68 
  69 static int bad_inode_mknod (struct inode *dir, struct dentry *dentry,
  70                         umode_t mode, dev_t rdev)
  71 {
  72         return -EIO;
  73 }
  74 
  75 static int bad_inode_rename2(struct inode *old_dir, struct dentry *old_dentry,
  76                              struct inode *new_dir, struct dentry *new_dentry,
  77                              unsigned int flags)
  78 {
  79         return -EIO;
  80 }
  81 
  82 static int bad_inode_readlink(struct dentry *dentry, char __user *buffer,
  83                 int buflen)
  84 {
  85         return -EIO;
  86 }
  87 
  88 static int bad_inode_permission(struct inode *inode, int mask)
  89 {
  90         return -EIO;
  91 }
  92 
  93 static int bad_inode_getattr(const struct path *path, struct kstat *stat,
  94                              u32 request_mask, unsigned int query_flags)
  95 {
  96         return -EIO;
  97 }
  98 
  99 static int bad_inode_setattr(struct dentry *direntry, struct iattr *attrs)
 100 {
 101         return -EIO;
 102 }
 103 
 104 static ssize_t bad_inode_listxattr(struct dentry *dentry, char *buffer,
 105                         size_t buffer_size)
 106 {
 107         return -EIO;
 108 }
 109 
 110 static const char *bad_inode_get_link(struct dentry *dentry,
 111                                       struct inode *inode,
 112                                       struct delayed_call *done)
 113 {
 114         return ERR_PTR(-EIO);
 115 }
 116 
 117 static struct posix_acl *bad_inode_get_acl(struct inode *inode, int type)
 118 {
 119         return ERR_PTR(-EIO);
 120 }
 121 
 122 static int bad_inode_fiemap(struct inode *inode,
 123                             struct fiemap_extent_info *fieinfo, u64 start,
 124                             u64 len)
 125 {
 126         return -EIO;
 127 }
 128 
 129 static int bad_inode_update_time(struct inode *inode, struct timespec64 *time,
 130                                  int flags)
 131 {
 132         return -EIO;
 133 }
 134 
 135 static int bad_inode_atomic_open(struct inode *inode, struct dentry *dentry,
 136                                  struct file *file, unsigned int open_flag,
 137                                  umode_t create_mode)
 138 {
 139         return -EIO;
 140 }
 141 
 142 static int bad_inode_tmpfile(struct inode *inode, struct dentry *dentry,
 143                              umode_t mode)
 144 {
 145         return -EIO;
 146 }
 147 
 148 static int bad_inode_set_acl(struct inode *inode, struct posix_acl *acl,
 149                              int type)
 150 {
 151         return -EIO;
 152 }
 153 
 154 static const struct inode_operations bad_inode_ops =
 155 {
 156         .create         = bad_inode_create,
 157         .lookup         = bad_inode_lookup,
 158         .link           = bad_inode_link,
 159         .unlink         = bad_inode_unlink,
 160         .symlink        = bad_inode_symlink,
 161         .mkdir          = bad_inode_mkdir,
 162         .rmdir          = bad_inode_rmdir,
 163         .mknod          = bad_inode_mknod,
 164         .rename         = bad_inode_rename2,
 165         .readlink       = bad_inode_readlink,
 166         .permission     = bad_inode_permission,
 167         .getattr        = bad_inode_getattr,
 168         .setattr        = bad_inode_setattr,
 169         .listxattr      = bad_inode_listxattr,
 170         .get_link       = bad_inode_get_link,
 171         .get_acl        = bad_inode_get_acl,
 172         .fiemap         = bad_inode_fiemap,
 173         .update_time    = bad_inode_update_time,
 174         .atomic_open    = bad_inode_atomic_open,
 175         .tmpfile        = bad_inode_tmpfile,
 176         .set_acl        = bad_inode_set_acl,
 177 };
 178 
 179 
 180 /*
 181  * When a filesystem is unable to read an inode due to an I/O error in
 182  * its read_inode() function, it can call make_bad_inode() to return a
 183  * set of stubs which will return EIO errors as required. 
 184  *
 185  * We only need to do limited initialisation: all other fields are
 186  * preinitialised to zero automatically.
 187  */
 188  
 189 /**
 190  *      make_bad_inode - mark an inode bad due to an I/O error
 191  *      @inode: Inode to mark bad
 192  *
 193  *      When an inode cannot be read due to a media or remote network
 194  *      failure this function makes the inode "bad" and causes I/O operations
 195  *      on it to fail from this point on.
 196  */
 197  
 198 void make_bad_inode(struct inode *inode)
 199 {
 200         remove_inode_hash(inode);
 201 
 202         inode->i_mode = S_IFREG;
 203         inode->i_atime = inode->i_mtime = inode->i_ctime =
 204                 current_time(inode);
 205         inode->i_op = &bad_inode_ops;   
 206         inode->i_opflags &= ~IOP_XATTR;
 207         inode->i_fop = &bad_file_ops;   
 208 }
 209 EXPORT_SYMBOL(make_bad_inode);
 210 
 211 /*
 212  * This tests whether an inode has been flagged as bad. The test uses
 213  * &bad_inode_ops to cover the case of invalidated inodes as well as
 214  * those created by make_bad_inode() above.
 215  */
 216  
 217 /**
 218  *      is_bad_inode - is an inode errored
 219  *      @inode: inode to test
 220  *
 221  *      Returns true if the inode in question has been marked as bad.
 222  */
 223  
 224 bool is_bad_inode(struct inode *inode)
 225 {
 226         return (inode->i_op == &bad_inode_ops); 
 227 }
 228 
 229 EXPORT_SYMBOL(is_bad_inode);
 230 
 231 /**
 232  * iget_failed - Mark an under-construction inode as dead and release it
 233  * @inode: The inode to discard
 234  *
 235  * Mark an under-construction inode as dead and release it.
 236  */
 237 void iget_failed(struct inode *inode)
 238 {
 239         make_bad_inode(inode);
 240         unlock_new_inode(inode);
 241         iput(inode);
 242 }
 243 EXPORT_SYMBOL(iget_failed);

/* [<][>][^][v][top][bottom][index][help] */