linux/fs/ocfs2/dlmglue.h
<<
>>
Prefs
   1/* -*- mode: c; c-basic-offset: 8; -*-
   2 * vim: noexpandtab sw=8 ts=8 sts=0:
   3 *
   4 * dlmglue.h
   5 *
   6 * description here
   7 *
   8 * Copyright (C) 2002, 2004 Oracle.  All rights reserved.
   9 *
  10 * This program is free software; you can redistribute it and/or
  11 * modify it under the terms of the GNU General Public
  12 * License as published by the Free Software Foundation; either
  13 * version 2 of the License, or (at your option) any later version.
  14 *
  15 * This program is distributed in the hope that it will be useful,
  16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  18 * General Public License for more details.
  19 *
  20 * You should have received a copy of the GNU General Public
  21 * License along with this program; if not, write to the
  22 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
  23 * Boston, MA 021110-1307, USA.
  24 */
  25
  26
  27#ifndef DLMGLUE_H
  28#define DLMGLUE_H
  29
  30#include "dcache.h"
  31
  32#define OCFS2_LVB_VERSION 5
  33
  34struct ocfs2_meta_lvb {
  35        __u8         lvb_version;
  36        __u8         lvb_reserved0;
  37        __be16       lvb_idynfeatures;
  38        __be32       lvb_iclusters;
  39        __be32       lvb_iuid;
  40        __be32       lvb_igid;
  41        __be64       lvb_iatime_packed;
  42        __be64       lvb_ictime_packed;
  43        __be64       lvb_imtime_packed;
  44        __be64       lvb_isize;
  45        __be16       lvb_imode;
  46        __be16       lvb_inlink;
  47        __be32       lvb_iattr;
  48        __be32       lvb_igeneration;
  49        __be32       lvb_reserved2;
  50};
  51
  52#define OCFS2_QINFO_LVB_VERSION 1
  53
  54struct ocfs2_qinfo_lvb {
  55        __u8    lvb_version;
  56        __u8    lvb_reserved[3];
  57        __be32  lvb_bgrace;
  58        __be32  lvb_igrace;
  59        __be32  lvb_syncms;
  60        __be32  lvb_blocks;
  61        __be32  lvb_free_blk;
  62        __be32  lvb_free_entry;
  63};
  64
  65#define OCFS2_ORPHAN_LVB_VERSION 1
  66
  67struct ocfs2_orphan_scan_lvb {
  68        __u8    lvb_version;
  69        __u8    lvb_reserved[3];
  70        __be32  lvb_os_seqno;
  71};
  72
  73/* ocfs2_inode_lock_full() 'arg_flags' flags */
  74/* don't wait on recovery. */
  75#define OCFS2_META_LOCK_RECOVERY        (0x01)
  76/* Instruct the dlm not to queue ourselves on the other node. */
  77#define OCFS2_META_LOCK_NOQUEUE         (0x02)
  78/* don't block waiting for the downconvert thread, instead return -EAGAIN */
  79#define OCFS2_LOCK_NONBLOCK             (0x04)
  80
  81/* Locking subclasses of inode cluster lock */
  82enum {
  83        OI_LS_NORMAL = 0,
  84        OI_LS_PARENT,
  85        OI_LS_RENAME1,
  86        OI_LS_RENAME2,
  87        OI_LS_REFLINK_TARGET,
  88};
  89
  90int ocfs2_dlm_init(struct ocfs2_super *osb);
  91void ocfs2_dlm_shutdown(struct ocfs2_super *osb, int hangup_pending);
  92void ocfs2_lock_res_init_once(struct ocfs2_lock_res *res);
  93void ocfs2_inode_lock_res_init(struct ocfs2_lock_res *res,
  94                               enum ocfs2_lock_type type,
  95                               unsigned int generation,
  96                               struct inode *inode);
  97void ocfs2_dentry_lock_res_init(struct ocfs2_dentry_lock *dl,
  98                                u64 parent, struct inode *inode);
  99struct ocfs2_file_private;
 100void ocfs2_file_lock_res_init(struct ocfs2_lock_res *lockres,
 101                              struct ocfs2_file_private *fp);
 102struct ocfs2_mem_dqinfo;
 103void ocfs2_qinfo_lock_res_init(struct ocfs2_lock_res *lockres,
 104                               struct ocfs2_mem_dqinfo *info);
 105void ocfs2_refcount_lock_res_init(struct ocfs2_lock_res *lockres,
 106                                  struct ocfs2_super *osb, u64 ref_blkno,
 107                                  unsigned int generation);
 108void ocfs2_lock_res_free(struct ocfs2_lock_res *res);
 109int ocfs2_create_new_inode_locks(struct inode *inode);
 110int ocfs2_drop_inode_locks(struct inode *inode);
 111int ocfs2_rw_lock(struct inode *inode, int write);
 112void ocfs2_rw_unlock(struct inode *inode, int write);
 113int ocfs2_open_lock(struct inode *inode);
 114int ocfs2_try_open_lock(struct inode *inode, int write);
 115void ocfs2_open_unlock(struct inode *inode);
 116int ocfs2_inode_lock_atime(struct inode *inode,
 117                          struct vfsmount *vfsmnt,
 118                          int *level);
 119int ocfs2_inode_lock_full_nested(struct inode *inode,
 120                         struct buffer_head **ret_bh,
 121                         int ex,
 122                         int arg_flags,
 123                         int subclass);
 124int ocfs2_inode_lock_with_page(struct inode *inode,
 125                              struct buffer_head **ret_bh,
 126                              int ex,
 127                              struct page *page);
 128/* Variants without special locking class or flags */
 129#define ocfs2_inode_lock_full(i, r, e, f)\
 130                ocfs2_inode_lock_full_nested(i, r, e, f, OI_LS_NORMAL)
 131#define ocfs2_inode_lock_nested(i, b, e, s)\
 132                ocfs2_inode_lock_full_nested(i, b, e, 0, s)
 133/* 99% of the time we don't want to supply any additional flags --
 134 * those are for very specific cases only. */
 135#define ocfs2_inode_lock(i, b, e) ocfs2_inode_lock_full_nested(i, b, e, 0, OI_LS_NORMAL)
 136void ocfs2_inode_unlock(struct inode *inode,
 137                       int ex);
 138int ocfs2_super_lock(struct ocfs2_super *osb,
 139                     int ex);
 140void ocfs2_super_unlock(struct ocfs2_super *osb,
 141                        int ex);
 142int ocfs2_orphan_scan_lock(struct ocfs2_super *osb, u32 *seqno);
 143void ocfs2_orphan_scan_unlock(struct ocfs2_super *osb, u32 seqno);
 144
 145int ocfs2_rename_lock(struct ocfs2_super *osb);
 146void ocfs2_rename_unlock(struct ocfs2_super *osb);
 147int ocfs2_nfs_sync_lock(struct ocfs2_super *osb, int ex);
 148void ocfs2_nfs_sync_unlock(struct ocfs2_super *osb, int ex);
 149int ocfs2_dentry_lock(struct dentry *dentry, int ex);
 150void ocfs2_dentry_unlock(struct dentry *dentry, int ex);
 151int ocfs2_file_lock(struct file *file, int ex, int trylock);
 152void ocfs2_file_unlock(struct file *file);
 153int ocfs2_qinfo_lock(struct ocfs2_mem_dqinfo *oinfo, int ex);
 154void ocfs2_qinfo_unlock(struct ocfs2_mem_dqinfo *oinfo, int ex);
 155struct ocfs2_refcount_tree;
 156int ocfs2_refcount_lock(struct ocfs2_refcount_tree *ref_tree, int ex);
 157void ocfs2_refcount_unlock(struct ocfs2_refcount_tree *ref_tree, int ex);
 158
 159
 160void ocfs2_mark_lockres_freeing(struct ocfs2_super *osb,
 161                                struct ocfs2_lock_res *lockres);
 162void ocfs2_simple_drop_lockres(struct ocfs2_super *osb,
 163                               struct ocfs2_lock_res *lockres);
 164
 165/* for the downconvert thread */
 166void ocfs2_wake_downconvert_thread(struct ocfs2_super *osb);
 167
 168struct ocfs2_dlm_debug *ocfs2_new_dlm_debug(void);
 169void ocfs2_put_dlm_debug(struct ocfs2_dlm_debug *dlm_debug);
 170
 171/* To set the locking protocol on module initialization */
 172void ocfs2_set_locking_protocol(void);
 173#endif  /* DLMGLUE_H */
 174