LCOV - code coverage report
Current view: top level - include/linux - exportfs.h (source / functions) Hit Total Coverage
Test: coverage.info Lines: 0 1 0.0 %
Date: 2023-08-24 13:40:31 Functions: 0 0 -

          Line data    Source code
       1             : /* SPDX-License-Identifier: GPL-2.0 */
       2             : #ifndef LINUX_EXPORTFS_H
       3             : #define LINUX_EXPORTFS_H 1
       4             : 
       5             : #include <linux/types.h>
       6             : 
       7             : struct dentry;
       8             : struct iattr;
       9             : struct inode;
      10             : struct iomap;
      11             : struct super_block;
      12             : struct vfsmount;
      13             : 
      14             : /* limit the handle size to NFSv4 handle size now */
      15             : #define MAX_HANDLE_SZ 128
      16             : 
      17             : /*
      18             :  * The fileid_type identifies how the file within the filesystem is encoded.
      19             :  * In theory this is freely set and parsed by the filesystem, but we try to
      20             :  * stick to conventions so we can share some generic code and don't confuse
      21             :  * sniffers like ethereal/wireshark.
      22             :  *
      23             :  * The filesystem must not use the value '0' or '0xff'.
      24             :  */
      25             : enum fid_type {
      26             :         /*
      27             :          * The root, or export point, of the filesystem.
      28             :          * (Never actually passed down to the filesystem.
      29             :          */
      30             :         FILEID_ROOT = 0,
      31             : 
      32             :         /*
      33             :          * 32bit inode number, 32 bit generation number.
      34             :          */
      35             :         FILEID_INO32_GEN = 1,
      36             : 
      37             :         /*
      38             :          * 32bit inode number, 32 bit generation number,
      39             :          * 32 bit parent directory inode number.
      40             :          */
      41             :         FILEID_INO32_GEN_PARENT = 2,
      42             : 
      43             :         /*
      44             :          * 64 bit object ID, 64 bit root object ID,
      45             :          * 32 bit generation number.
      46             :          */
      47             :         FILEID_BTRFS_WITHOUT_PARENT = 0x4d,
      48             : 
      49             :         /*
      50             :          * 64 bit object ID, 64 bit root object ID,
      51             :          * 32 bit generation number,
      52             :          * 64 bit parent object ID, 32 bit parent generation.
      53             :          */
      54             :         FILEID_BTRFS_WITH_PARENT = 0x4e,
      55             : 
      56             :         /*
      57             :          * 64 bit object ID, 64 bit root object ID,
      58             :          * 32 bit generation number,
      59             :          * 64 bit parent object ID, 32 bit parent generation,
      60             :          * 64 bit parent root object ID.
      61             :          */
      62             :         FILEID_BTRFS_WITH_PARENT_ROOT = 0x4f,
      63             : 
      64             :         /*
      65             :          * 32 bit block number, 16 bit partition reference,
      66             :          * 16 bit unused, 32 bit generation number.
      67             :          */
      68             :         FILEID_UDF_WITHOUT_PARENT = 0x51,
      69             : 
      70             :         /*
      71             :          * 32 bit block number, 16 bit partition reference,
      72             :          * 16 bit unused, 32 bit generation number,
      73             :          * 32 bit parent block number, 32 bit parent generation number
      74             :          */
      75             :         FILEID_UDF_WITH_PARENT = 0x52,
      76             : 
      77             :         /*
      78             :          * 64 bit checkpoint number, 64 bit inode number,
      79             :          * 32 bit generation number.
      80             :          */
      81             :         FILEID_NILFS_WITHOUT_PARENT = 0x61,
      82             : 
      83             :         /*
      84             :          * 64 bit checkpoint number, 64 bit inode number,
      85             :          * 32 bit generation number, 32 bit parent generation.
      86             :          * 64 bit parent inode number.
      87             :          */
      88             :         FILEID_NILFS_WITH_PARENT = 0x62,
      89             : 
      90             :         /*
      91             :          * 32 bit generation number, 40 bit i_pos.
      92             :          */
      93             :         FILEID_FAT_WITHOUT_PARENT = 0x71,
      94             : 
      95             :         /*
      96             :          * 32 bit generation number, 40 bit i_pos,
      97             :          * 32 bit parent generation number, 40 bit parent i_pos
      98             :          */
      99             :         FILEID_FAT_WITH_PARENT = 0x72,
     100             : 
     101             :         /*
     102             :          * 128 bit child FID (struct lu_fid)
     103             :          * 128 bit parent FID (struct lu_fid)
     104             :          */
     105             :         FILEID_LUSTRE = 0x97,
     106             : 
     107             :         /*
     108             :          * 64 bit unique kernfs id
     109             :          */
     110             :         FILEID_KERNFS = 0xfe,
     111             : 
     112             :         /*
     113             :          * Filesystems must not use 0xff file ID.
     114             :          */
     115             :         FILEID_INVALID = 0xff,
     116             : };
     117             : 
     118             : struct fid {
     119             :         union {
     120             :                 struct {
     121             :                         u32 ino;
     122             :                         u32 gen;
     123             :                         u32 parent_ino;
     124             :                         u32 parent_gen;
     125             :                 } i32;
     126             :                 struct {
     127             :                         u32 block;
     128             :                         u16 partref;
     129             :                         u16 parent_partref;
     130             :                         u32 generation;
     131             :                         u32 parent_block;
     132             :                         u32 parent_generation;
     133             :                 } udf;
     134             :                 DECLARE_FLEX_ARRAY(__u32, raw);
     135             :         };
     136             : };
     137             : 
     138             : #define EXPORT_FH_CONNECTABLE   0x1 /* Encode file handle with parent */
     139             : #define EXPORT_FH_FID           0x2 /* File handle may be non-decodeable */
     140             : 
     141             : /**
     142             :  * struct export_operations - for nfsd to communicate with file systems
     143             :  * @encode_fh:      encode a file handle fragment from a dentry
     144             :  * @fh_to_dentry:   find the implied object and get a dentry for it
     145             :  * @fh_to_parent:   find the implied object's parent and get a dentry for it
     146             :  * @get_name:       find the name for a given inode in a given directory
     147             :  * @get_parent:     find the parent of a given directory
     148             :  * @commit_metadata: commit metadata changes to stable storage
     149             :  *
     150             :  * See Documentation/filesystems/nfs/exporting.rst for details on how to use
     151             :  * this interface correctly.
     152             :  *
     153             :  * encode_fh:
     154             :  *    @encode_fh should store in the file handle fragment @fh (using at most
     155             :  *    @max_len bytes) information that can be used by @decode_fh to recover the
     156             :  *    file referred to by the &struct dentry @de.  If @flag has CONNECTABLE bit
     157             :  *    set, the encode_fh() should store sufficient information so that a good
     158             :  *    attempt can be made to find not only the file but also it's place in the
     159             :  *    filesystem.   This typically means storing a reference to de->d_parent in
     160             :  *    the filehandle fragment.  encode_fh() should return the fileid_type on
     161             :  *    success and on error returns 255 (if the space needed to encode fh is
     162             :  *    greater than @max_len*4 bytes). On error @max_len contains the minimum
     163             :  *    size(in 4 byte unit) needed to encode the file handle.
     164             :  *
     165             :  * fh_to_dentry:
     166             :  *    @fh_to_dentry is given a &struct super_block (@sb) and a file handle
     167             :  *    fragment (@fh, @fh_len). It should return a &struct dentry which refers
     168             :  *    to the same file that the file handle fragment refers to.  If it cannot,
     169             :  *    it should return a %NULL pointer if the file cannot be found, or an
     170             :  *    %ERR_PTR error code of %ENOMEM if a memory allocation failure occurred.
     171             :  *    Any other error code is treated like %NULL, and will cause an %ESTALE error
     172             :  *    for callers of exportfs_decode_fh().
     173             :  *    Any suitable dentry can be returned including, if necessary, a new dentry
     174             :  *    created with d_alloc_root.  The caller can then find any other extant
     175             :  *    dentries by following the d_alias links.
     176             :  *
     177             :  * fh_to_parent:
     178             :  *    Same as @fh_to_dentry, except that it returns a pointer to the parent
     179             :  *    dentry if it was encoded into the filehandle fragment by @encode_fh.
     180             :  *
     181             :  * get_name:
     182             :  *    @get_name should find a name for the given @child in the given @parent
     183             :  *    directory.  The name should be stored in the @name (with the
     184             :  *    understanding that it is already pointing to a %NAME_MAX+1 sized
     185             :  *    buffer.   get_name() should return %0 on success, a negative error code
     186             :  *    or error.  @get_name will be called without @parent->i_mutex held.
     187             :  *
     188             :  * get_parent:
     189             :  *    @get_parent should find the parent directory for the given @child which
     190             :  *    is also a directory.  In the event that it cannot be found, or storage
     191             :  *    space cannot be allocated, a %ERR_PTR should be returned.
     192             :  *
     193             :  * commit_metadata:
     194             :  *    @commit_metadata should commit metadata changes to stable storage.
     195             :  *
     196             :  * Locking rules:
     197             :  *    get_parent is called with child->d_inode->i_mutex down
     198             :  *    get_name is not (which is possibly inconsistent)
     199             :  */
     200             : 
     201             : struct export_operations {
     202             :         int (*encode_fh)(struct inode *inode, __u32 *fh, int *max_len,
     203             :                         struct inode *parent);
     204             :         struct dentry * (*fh_to_dentry)(struct super_block *sb, struct fid *fid,
     205             :                         int fh_len, int fh_type);
     206             :         struct dentry * (*fh_to_parent)(struct super_block *sb, struct fid *fid,
     207             :                         int fh_len, int fh_type);
     208             :         int (*get_name)(struct dentry *parent, char *name,
     209             :                         struct dentry *child);
     210             :         struct dentry * (*get_parent)(struct dentry *child);
     211             :         int (*commit_metadata)(struct inode *inode);
     212             : 
     213             :         int (*get_uuid)(struct super_block *sb, u8 *buf, u32 *len, u64 *offset);
     214             :         int (*map_blocks)(struct inode *inode, loff_t offset,
     215             :                           u64 len, struct iomap *iomap,
     216             :                           bool write, u32 *device_generation);
     217             :         int (*commit_blocks)(struct inode *inode, struct iomap *iomaps,
     218             :                              int nr_iomaps, struct iattr *iattr);
     219             : #define EXPORT_OP_NOWCC                 (0x1) /* don't collect v3 wcc data */
     220             : #define EXPORT_OP_NOSUBTREECHK          (0x2) /* no subtree checking */
     221             : #define EXPORT_OP_CLOSE_BEFORE_UNLINK   (0x4) /* close files before unlink */
     222             : #define EXPORT_OP_REMOTE_FS             (0x8) /* Filesystem is remote */
     223             : #define EXPORT_OP_NOATOMIC_ATTR         (0x10) /* Filesystem cannot supply
     224             :                                                   atomic attribute updates
     225             :                                                 */
     226             : #define EXPORT_OP_FLUSH_ON_CLOSE        (0x20) /* fs flushes file data on close */
     227             :         unsigned long   flags;
     228             : };
     229             : 
     230             : extern int exportfs_encode_inode_fh(struct inode *inode, struct fid *fid,
     231             :                                     int *max_len, struct inode *parent,
     232             :                                     int flags);
     233             : extern int exportfs_encode_fh(struct dentry *dentry, struct fid *fid,
     234             :                               int *max_len, int flags);
     235             : 
     236             : static inline int exportfs_encode_fid(struct inode *inode, struct fid *fid,
     237             :                                       int *max_len)
     238             : {
     239           0 :         return exportfs_encode_inode_fh(inode, fid, max_len, NULL,
     240             :                                         EXPORT_FH_FID);
     241             : }
     242             : 
     243             : extern struct dentry *exportfs_decode_fh_raw(struct vfsmount *mnt,
     244             :                                              struct fid *fid, int fh_len,
     245             :                                              int fileid_type,
     246             :                                              int (*acceptable)(void *, struct dentry *),
     247             :                                              void *context);
     248             : extern struct dentry *exportfs_decode_fh(struct vfsmount *mnt, struct fid *fid,
     249             :         int fh_len, int fileid_type, int (*acceptable)(void *, struct dentry *),
     250             :         void *context);
     251             : 
     252             : /*
     253             :  * Generic helpers for filesystems.
     254             :  */
     255             : extern struct dentry *generic_fh_to_dentry(struct super_block *sb,
     256             :         struct fid *fid, int fh_len, int fh_type,
     257             :         struct inode *(*get_inode) (struct super_block *sb, u64 ino, u32 gen));
     258             : extern struct dentry *generic_fh_to_parent(struct super_block *sb,
     259             :         struct fid *fid, int fh_len, int fh_type,
     260             :         struct inode *(*get_inode) (struct super_block *sb, u64 ino, u32 gen));
     261             : 
     262             : #endif /* LINUX_EXPORTFS_H */

Generated by: LCOV version 1.14