LCOV - code coverage report
Current view: top level - fs - bad_inode.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 0 59 0.0 %
Date: 2023-04-06 08:38:28 Functions: 0 25 0.0 %

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

Generated by: LCOV version 1.14