]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - fs/xfs/xfs_mount.h
[XFS] Add parameters to xfs_bmapi() and xfs_bunmapi() to have them report
[mv-sheeva.git] / fs / xfs / xfs_mount.h
index 3432fd5a3986745ebee217f9ba84a0797853318f..a682eb5581028095721b83099a3506b6ccfd888a 100644 (file)
@@ -63,6 +63,8 @@ struct xfs_perag;
 struct xfs_iocore;
 struct xfs_bmbt_irec;
 struct xfs_bmap_free;
+struct xfs_extdelta;
+struct xfs_swapext;
 
 extern struct vfsops xfs_vfsops;
 extern struct vnodeops xfs_vnodeops;
@@ -194,7 +196,12 @@ typedef int                (*xfs_bmapi_t)(struct xfs_trans *, void *,
                                xfs_fileoff_t, xfs_filblks_t, int,
                                xfs_fsblock_t *, xfs_extlen_t,
                                struct xfs_bmbt_irec *, int *,
-                               struct xfs_bmap_free *);
+                               struct xfs_bmap_free *, struct xfs_extdelta *);
+typedef int            (*xfs_bunmapi_t)(struct xfs_trans *,
+                               void *, xfs_fileoff_t,
+                               xfs_filblks_t, int, xfs_extnum_t,
+                               xfs_fsblock_t *, struct xfs_bmap_free *,
+                               struct xfs_extdelta *, int *);
 typedef int            (*xfs_bmap_eof_t)(void *, xfs_fileoff_t, int, int *);
 typedef int            (*xfs_iomap_write_direct_t)(
                                void *, xfs_off_t, size_t, int,
@@ -214,10 +221,13 @@ typedef int               (*xfs_lock_nowait_t)(void *, uint);
 typedef void           (*xfs_unlk_t)(void *, unsigned int);
 typedef xfs_fsize_t    (*xfs_size_t)(void *);
 typedef xfs_fsize_t    (*xfs_iodone_t)(struct vfs *);
+typedef int            (*xfs_swap_extents_t)(void *, void *,
+                               struct xfs_swapext*);
 
 typedef struct xfs_ioops {
        xfs_ioinit_t                    xfs_ioinit;
        xfs_bmapi_t                     xfs_bmapi_func;
+       xfs_bunmapi_t                   xfs_bunmapi_func;
        xfs_bmap_eof_t                  xfs_bmap_eof_func;
        xfs_iomap_write_direct_t        xfs_iomap_write_direct;
        xfs_iomap_write_delay_t         xfs_iomap_write_delay;
@@ -230,13 +240,17 @@ typedef struct xfs_ioops {
        xfs_unlk_t                      xfs_unlock;
        xfs_size_t                      xfs_size_func;
        xfs_iodone_t                    xfs_iodone;
+       xfs_swap_extents_t              xfs_swap_extents_func;
 } xfs_ioops_t;
 
 #define XFS_IOINIT(vfsp, args, flags) \
        (*(mp)->m_io_ops.xfs_ioinit)(vfsp, args, flags)
-#define XFS_BMAPI(mp, trans,io,bno,len,f,first,tot,mval,nmap,flist)    \
+#define XFS_BMAPI(mp, trans,io,bno,len,f,first,tot,mval,nmap,flist,delta) \
        (*(mp)->m_io_ops.xfs_bmapi_func) \
-               (trans,(io)->io_obj,bno,len,f,first,tot,mval,nmap,flist)
+               (trans,(io)->io_obj,bno,len,f,first,tot,mval,nmap,flist,delta)
+#define XFS_BUNMAPI(mp, trans,io,bno,len,f,nexts,first,flist,delta,done) \
+       (*(mp)->m_io_ops.xfs_bunmapi_func) \
+               (trans,(io)->io_obj,bno,len,f,nexts,first,flist,delta,done)
 #define XFS_BMAP_EOF(mp, io, endoff, whichfork, eof) \
        (*(mp)->m_io_ops.xfs_bmap_eof_func) \
                ((io)->io_obj, endoff, whichfork, eof)
@@ -266,7 +280,38 @@ typedef struct xfs_ioops {
        (*(mp)->m_io_ops.xfs_size_func)((io)->io_obj)
 #define XFS_IODONE(vfsp) \
        (*(mp)->m_io_ops.xfs_iodone)(vfsp)
+#define XFS_SWAP_EXTENTS(mp, io, tio, sxp) \
+       (*(mp)->m_io_ops.xfs_swap_extents_func) \
+               ((io)->io_obj, (tio)->io_obj, sxp)
 
+#ifdef HAVE_PERCPU_SB
+
+/*
+ * Valid per-cpu incore superblock counters. Note that if you add new counters,
+ * you may need to define new counter disabled bit field descriptors as there
+ * are more possible fields in the superblock that can fit in a bitfield on a
+ * 32 bit platform. The XFS_SBS_* values for the current current counters just
+ * fit.
+ */
+typedef struct xfs_icsb_cnts {
+       uint64_t        icsb_fdblocks;
+       uint64_t        icsb_ifree;
+       uint64_t        icsb_icount;
+       unsigned long   icsb_flags;
+} xfs_icsb_cnts_t;
+
+#define XFS_ICSB_FLAG_LOCK     (1 << 0)        /* counter lock bit */
+
+#define XFS_ICSB_SB_LOCKED     (1 << 0)        /* sb already locked */
+#define XFS_ICSB_LAZY_COUNT    (1 << 1)        /* accuracy not needed */
+
+extern int     xfs_icsb_init_counters(struct xfs_mount *);
+extern void    xfs_icsb_sync_counters_lazy(struct xfs_mount *);
+
+#else
+#define xfs_icsb_init_counters(mp)     (0)
+#define xfs_icsb_sync_counters_lazy(mp)        do { } while (0)
+#endif
 
 typedef struct xfs_mount {
        bhv_desc_t              m_bhv;          /* vfs xfs behavior */
@@ -308,7 +353,6 @@ typedef struct xfs_mount {
        xfs_buftarg_t           *m_ddev_targp;  /* saves taking the address */
        xfs_buftarg_t           *m_logdev_targp;/* ptr to log device */
        xfs_buftarg_t           *m_rtdev_targp; /* ptr to rt device */
-#define m_dev          m_ddev_targp->pbr_dev
        __uint8_t               m_dircook_elog; /* log d-cookie entry bits */
        __uint8_t               m_blkbit_log;   /* blocklog + NBBY */
        __uint8_t               m_blkbb_log;    /* blocklog - BBSHIFT */
@@ -352,7 +396,7 @@ typedef struct xfs_mount {
 #endif
        int                     m_dalign;       /* stripe unit */
        int                     m_swidth;       /* stripe width */
-       int                     m_sinoalign;    /* stripe unit inode alignmnt */
+       int                     m_sinoalign;    /* stripe unit inode alignment */
        int                     m_attr_magicpct;/* 37% of the blocksize */
        int                     m_dir_magicpct; /* 37% of the dir blocksize */
        __uint8_t               m_mk_sharedro;  /* mark shared ro on unmount */
@@ -373,6 +417,11 @@ typedef struct xfs_mount {
        struct xfs_qmops        m_qm_ops;       /* vector of XQM ops */
        struct xfs_ioops        m_io_ops;       /* vector of I/O ops */
        atomic_t                m_active_trans; /* number trans frozen */
+#ifdef HAVE_PERCPU_SB
+       xfs_icsb_cnts_t         *m_sb_cnts;     /* per-cpu superblock counters */
+       unsigned long           m_icsb_counters; /* disabled per-cpu counters */
+       struct notifier_block   m_icsb_notifier; /* hotplug cpu notifier */
+#endif
 } xfs_mount_t;
 
 /*
@@ -387,13 +436,11 @@ typedef struct xfs_mount {
 #define XFS_MOUNT_FS_SHUTDOWN  (1ULL << 4)     /* atomic stop of all filesystem
                                                   operations, typically for
                                                   disk errors in metadata */
-#define XFS_MOUNT_NOATIME      (1ULL << 5)     /* don't modify inode access
-                                                  times on reads */
 #define XFS_MOUNT_RETERR       (1ULL << 6)     /* return alignment errors to
                                                   user */
 #define XFS_MOUNT_NOALIGN      (1ULL << 7)     /* turn off stripe alignment
                                                   allocations */
-#define XFS_MOUNT_COMPAT_ATTR  (1ULL << 8)     /* do not use attr2 format */
+#define XFS_MOUNT_ATTR2                (1ULL << 8)     /* allow use of attr2 format */
                             /* (1ULL << 9)     -- currently unused */
 #define XFS_MOUNT_NORECOVERY   (1ULL << 10)    /* no recovery - dirty fs */
 #define XFS_MOUNT_SHARED       (1ULL << 11)    /* shared mount */
@@ -412,6 +459,8 @@ typedef struct xfs_mount {
 #define XFS_MOUNT_DIRSYNC      (1ULL << 21)    /* synchronous directory ops */
 #define XFS_MOUNT_COMPAT_IOSIZE        (1ULL << 22)    /* don't report large preferred
                                                 * I/O size in stat() */
+#define XFS_MOUNT_NO_PERCPU_SB (1ULL << 23)    /* don't use per-cpu superblock
+                                                  counters */
 
 
 /*
@@ -473,19 +522,17 @@ xfs_preferred_iosize(xfs_mount_t *mp)
 #define XFS_CORRUPT_INCORE     0x8     /* Corrupt in-memory data structures */
 #define XFS_SHUTDOWN_REMOTE_REQ 0x10   /* Shutdown came from remote cell */
 
-/*
- * xflags for xfs_syncsub
- */
-#define XFS_XSYNC_RELOC                0x01
-
 /*
  * Flags for xfs_mountfs
  */
 #define XFS_MFSI_SECOND                0x01    /* Secondary mount -- skip stuff */
 #define XFS_MFSI_CLIENT                0x02    /* Is a client -- skip lots of stuff */
+/*     XFS_MFSI_RRINODES       */
 #define XFS_MFSI_NOUNLINK      0x08    /* Skip unlinked inode processing in */
                                        /* log recovery */
 #define XFS_MFSI_NO_QUOTACHECK 0x10    /* Skip quotacheck processing */
+/*     XFS_MFSI_CONVERT_SUNIT  */
+#define XFS_MFSI_QUIET         0x40    /* Be silent if mount errors found */
 
 /*
  * Macros for getting from mount to vfs and back.
@@ -549,10 +596,12 @@ extern void       xfs_unmountfs_close(xfs_mount_t *, struct cred *);
 extern int     xfs_unmountfs_writesb(xfs_mount_t *);
 extern int     xfs_unmount_flush(xfs_mount_t *, int);
 extern int     xfs_mod_incore_sb(xfs_mount_t *, xfs_sb_field_t, int, int);
+extern int     xfs_mod_incore_sb_unlocked(xfs_mount_t *, xfs_sb_field_t,
+                       int, int);
 extern int     xfs_mod_incore_sb_batch(xfs_mount_t *, xfs_mod_sb_t *,
                        uint, int);
 extern struct xfs_buf *xfs_getsb(xfs_mount_t *, int);
-extern int     xfs_readsb(xfs_mount_t *mp);
+extern int     xfs_readsb(xfs_mount_t *, int);
 extern void    xfs_freesb(xfs_mount_t *);
 extern void    xfs_do_force_shutdown(bhv_desc_t *, int, char *, int);
 extern int     xfs_syncsub(xfs_mount_t *, int, int, int *);