Merge git://oss.sgi.com:8090/xfs/xfs-2.6
[linux-drm-fsl-dcu.git] / fs / xfs / xfs_mount.h
index 66cbee79864e224e30ee9d04044748e6caaa25c9..82304b94646db94cd4a2b85c88fef0d1bce26a03 100644 (file)
@@ -18,6 +18,7 @@
 #ifndef __XFS_MOUNT_H__
 #define        __XFS_MOUNT_H__
 
+
 typedef struct xfs_trans_reservations {
        uint    tr_write;       /* extent alloc trans */
        uint    tr_itruncate;   /* truncate trans */
@@ -53,8 +54,8 @@ typedef struct xfs_trans_reservations {
 #else
 struct cred;
 struct log;
-struct vfs;
-struct vnode;
+struct bhv_vfs;
+struct bhv_vnode;
 struct xfs_mount_args;
 struct xfs_ihash;
 struct xfs_chash;
@@ -63,9 +64,11 @@ 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;
+extern struct bhv_vfsops xfs_vfsops;
+extern struct bhv_vnodeops xfs_vnodeops;
 
 #define        AIL_LOCK_T              lock_t
 #define        AIL_LOCKINIT(x,y)       spinlock_init(x,y)
@@ -78,15 +81,15 @@ extern struct vnodeops xfs_vnodeops;
  * Prototypes and functions for the Data Migration subsystem.
  */
 
-typedef int    (*xfs_send_data_t)(int, struct vnode *,
-                       xfs_off_t, size_t, int, vrwlock_t *);
+typedef int    (*xfs_send_data_t)(int, struct bhv_vnode *,
+                       xfs_off_t, size_t, int, bhv_vrwlock_t *);
 typedef int    (*xfs_send_mmap_t)(struct vm_area_struct *, uint);
-typedef int    (*xfs_send_destroy_t)(struct vnode *, dm_right_t);
-typedef int    (*xfs_send_namesp_t)(dm_eventtype_t, struct vfs *,
-                       struct vnode *,
-                       dm_right_t, struct vnode *, dm_right_t,
+typedef int    (*xfs_send_destroy_t)(struct bhv_vnode *, dm_right_t);
+typedef int    (*xfs_send_namesp_t)(dm_eventtype_t, struct bhv_vfs *,
+                       struct bhv_vnode *,
+                       dm_right_t, struct bhv_vnode *, dm_right_t,
                        char *, char *, mode_t, int, int);
-typedef void   (*xfs_send_unmount_t)(struct vfs *, struct vnode *,
+typedef void   (*xfs_send_unmount_t)(struct bhv_vfs *, struct bhv_vnode *,
                        dm_right_t, mode_t, int, int);
 
 typedef struct xfs_dmops {
@@ -188,13 +191,18 @@ typedef struct xfs_qmops {
  * Prototypes and functions for I/O core modularization.
  */
 
-typedef int            (*xfs_ioinit_t)(struct vfs *,
+typedef int            (*xfs_ioinit_t)(struct bhv_vfs *,
                                struct xfs_mount_args *, int);
 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,
@@ -213,11 +221,14 @@ typedef void              (*xfs_lock_demote_t)(void *, uint);
 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 xfs_fsize_t    (*xfs_iodone_t)(struct bhv_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 +241,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,6 +281,9 @@ 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
 
@@ -289,11 +307,13 @@ typedef struct xfs_icsb_cnts {
 #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 *);
+extern void    xfs_icsb_reinit_counters(struct xfs_mount *);
+extern void    xfs_icsb_sync_counters_flags(struct xfs_mount *, int);
 
 #else
 #define xfs_icsb_init_counters(mp)     (0)
-#define xfs_icsb_sync_counters_lazy(mp)        do { } while (0)
+#define xfs_icsb_reinit_counters(mp)   do { } while (0)
+#define xfs_icsb_sync_counters_flags(mp, flags)        do { } while (0)
 #endif
 
 typedef struct xfs_mount {
@@ -314,7 +334,7 @@ typedef struct xfs_mount {
        xfs_agnumber_t          m_agirotor;     /* last ag dir inode alloced */
        lock_t                  m_agirotor_lock;/* .. and lock protecting it */
        xfs_agnumber_t          m_maxagi;       /* highest inode alloc group */
-       uint                    m_ihsize;       /* size of next field */
+       size_t                  m_ihsize;       /* size of next field */
        struct xfs_ihash        *m_ihash;       /* fs private inode hash table*/
        struct xfs_inode        *m_inodes;      /* active inode list */
        struct list_head        m_del_inodes;   /* inodes to reclaim */
@@ -386,8 +406,6 @@ typedef struct xfs_mount {
        __uint8_t               m_inode_quiesce;/* call quiesce on new inodes.
                                                   field governed by m_ilock */
        __uint8_t               m_sectbb_log;   /* sectlog - BBSHIFT */
-       __uint8_t               m_dirversion;   /* 1 or 2 */
-       xfs_dirops_t            m_dirops;       /* table of dir funcs */
        int                     m_dirblksize;   /* directory block sz--bytes */
        int                     m_dirblkfsbs;   /* directory block sz--fsbs */
        xfs_dablk_t             m_dirdatablk;   /* blockno of dir data v2 */
@@ -404,6 +422,7 @@ typedef struct xfs_mount {
        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 */
+       struct mutex            m_icsb_mutex;   /* balancer sync lock */
 #endif
 } xfs_mount_t;
 
@@ -494,31 +513,25 @@ xfs_preferred_iosize(xfs_mount_t *mp)
 
 #define XFS_FORCED_SHUTDOWN(mp)        ((mp)->m_flags & XFS_MOUNT_FS_SHUTDOWN)
 #define xfs_force_shutdown(m,f)        \
-       VFS_FORCE_SHUTDOWN((XFS_MTOVFS(m)), f, __FILE__, __LINE__)
-
-/*
- * Flags sent to xfs_force_shutdown.
- */
-#define XFS_METADATA_IO_ERROR  0x1
-#define XFS_LOG_IO_ERROR       0x2
-#define XFS_FORCE_UMOUNT       0x4
-#define XFS_CORRUPT_INCORE     0x8     /* Corrupt in-memory data structures */
-#define XFS_SHUTDOWN_REMOTE_REQ 0x10   /* Shutdown came from remote cell */
+       bhv_vfs_force_shutdown((XFS_MTOVFS(m)), f, __FILE__, __LINE__)
 
 /*
  * 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.
  */
 #define        XFS_MTOVFS(mp)          xfs_mtovfs(mp)
-static inline struct vfs *xfs_mtovfs(xfs_mount_t *mp)
+static inline struct bhv_vfs *xfs_mtovfs(xfs_mount_t *mp)
 {
        return bhvtovfs(&mp->m_bhv);
 }
@@ -530,9 +543,10 @@ static inline xfs_mount_t *xfs_bhvtom(bhv_desc_t *bdp)
 }
 
 #define XFS_VFSTOM(vfs) xfs_vfstom(vfs)
-static inline xfs_mount_t *xfs_vfstom(vfs_t *vfs)
+static inline xfs_mount_t *xfs_vfstom(bhv_vfs_t *vfs)
 {
-       return XFS_BHVTOM(bhv_lookup(VFS_BHVHEAD(vfs), &xfs_vfsops));
+       return XFS_BHVTOM(bhv_lookup_range(VFS_BHVHEAD(vfs),
+                               VFS_POSITION_XFS, VFS_POSITION_XFS));
 }
 
 #define XFS_DADDR_TO_AGNO(mp,d)         xfs_daddr_to_agno(mp,d)
@@ -552,12 +566,33 @@ xfs_daddr_to_agbno(struct xfs_mount *mp, xfs_daddr_t d)
        return (xfs_agblock_t) do_div(ld, mp->m_sb.sb_agblocks);
 }
 
+/*
+ * Per-cpu superblock locking functions
+ */
+#ifdef HAVE_PERCPU_SB
+STATIC_INLINE void
+xfs_icsb_lock(xfs_mount_t *mp)
+{
+       mutex_lock(&mp->m_icsb_mutex);
+}
+
+STATIC_INLINE void
+xfs_icsb_unlock(xfs_mount_t *mp)
+{
+       mutex_unlock(&mp->m_icsb_mutex);
+}
+#else
+#define xfs_icsb_lock(mp)
+#define xfs_icsb_unlock(mp)
+#endif
+
 /*
  * This structure is for use by the xfs_mod_incore_sb_batch() routine.
+ * xfs_growfs can specify a few fields which are more than int limit
  */
 typedef struct xfs_mod_sb {
        xfs_sb_field_t  msb_field;      /* Field to modify, see below */
-       int             msb_delta;      /* Change to make to specified field */
+       int64_t         msb_delta;      /* Change to make to specified field */
 } xfs_mod_sb_t;
 
 #define        XFS_MOUNT_ILOCK(mp)     mutex_lock(&((mp)->m_ilock))
@@ -568,25 +603,25 @@ typedef struct xfs_mod_sb {
 extern xfs_mount_t *xfs_mount_init(void);
 extern void    xfs_mod_sb(xfs_trans_t *, __int64_t);
 extern void    xfs_mount_free(xfs_mount_t *mp, int remove_bhv);
-extern int     xfs_mountfs(struct vfs *, xfs_mount_t *mp, int);
+extern int     xfs_mountfs(struct bhv_vfs *, xfs_mount_t *mp, int);
 extern void    xfs_mountfs_check_barriers(xfs_mount_t *mp);
 
 extern int     xfs_unmountfs(xfs_mount_t *, struct cred *);
 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(xfs_mount_t *, xfs_sb_field_t, int64_t, int);
 extern int     xfs_mod_incore_sb_unlocked(xfs_mount_t *, xfs_sb_field_t,
-                       int, int);
+                       int64_t, 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 *);
-extern int     xfs_sync_inodes(xfs_mount_t *, int, int, int *);
-extern xfs_agnumber_t  xfs_initialize_perag(struct vfs *, xfs_mount_t *,
+extern int     xfs_syncsub(xfs_mount_t *, int, int *);
+extern int     xfs_sync_inodes(xfs_mount_t *, int, int *);
+extern xfs_agnumber_t  xfs_initialize_perag(struct bhv_vfs *, xfs_mount_t *,
                                                xfs_agnumber_t);
 extern void    xfs_xlatesb(void *, struct xfs_sb *, int, __int64_t);