Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 54a7e755 authored by Mark Fasheh's avatar Mark Fasheh
Browse files

ocfs2: Add ->get_osb() dlmglue locking operation



Will be used to find the ocfs2_super structure from a given lockres.

Signed-off-by: default avatarMark Fasheh <mark.fasheh@oracle.com>
parent 2a45f2d1
Loading
Loading
Loading
Loading
+33 −0
Original line number Original line Diff line number Diff line
@@ -75,6 +75,8 @@ static void ocfs2_super_bast_func(void *opaque,
				  int level);
				  int level);
static void ocfs2_rename_bast_func(void *opaque,
static void ocfs2_rename_bast_func(void *opaque,
				   int level);
				   int level);
static struct ocfs2_super *ocfs2_get_dentry_osb(struct ocfs2_lock_res *lockres);
static struct ocfs2_super *ocfs2_get_inode_osb(struct ocfs2_lock_res *lockres);


/*
/*
 * Return value from ocfs2_convert_worker_t functions.
 * Return value from ocfs2_convert_worker_t functions.
@@ -116,6 +118,11 @@ static void ocfs2_dentry_post_unlock(struct ocfs2_super *osb,
 * These fine tune the behavior of the generic dlmglue locking infrastructure.
 * These fine tune the behavior of the generic dlmglue locking infrastructure.
 */
 */
struct ocfs2_lock_res_ops {
struct ocfs2_lock_res_ops {
	/*
	 * Translate an ocfs2_lock_res * into an ocfs2_super *. Define
	 * this callback if ->l_priv is not an ocfs2_super pointer
	 */
	struct ocfs2_super * (*get_osb)(struct ocfs2_lock_res *);
	void (*bast)(void *, int);
	void (*bast)(void *, int);
	int  (*unblock)(struct ocfs2_lock_res *, struct ocfs2_unblock_ctl *);
	int  (*unblock)(struct ocfs2_lock_res *, struct ocfs2_unblock_ctl *);
	void (*post_unlock)(struct ocfs2_super *, struct ocfs2_lock_res *);
	void (*post_unlock)(struct ocfs2_super *, struct ocfs2_lock_res *);
@@ -144,18 +151,21 @@ static int ocfs2_generic_unblock_lock(struct ocfs2_super *osb,
				      ocfs2_convert_worker_t *worker);
				      ocfs2_convert_worker_t *worker);


static struct ocfs2_lock_res_ops ocfs2_inode_rw_lops = {
static struct ocfs2_lock_res_ops ocfs2_inode_rw_lops = {
	.get_osb	= ocfs2_get_inode_osb,
	.bast		= ocfs2_inode_bast_func,
	.bast		= ocfs2_inode_bast_func,
	.unblock	= ocfs2_unblock_inode_lock,
	.unblock	= ocfs2_unblock_inode_lock,
	.flags		= 0,
	.flags		= 0,
};
};


static struct ocfs2_lock_res_ops ocfs2_inode_meta_lops = {
static struct ocfs2_lock_res_ops ocfs2_inode_meta_lops = {
	.get_osb	= ocfs2_get_inode_osb,
	.bast		= ocfs2_inode_bast_func,
	.bast		= ocfs2_inode_bast_func,
	.unblock	= ocfs2_unblock_meta,
	.unblock	= ocfs2_unblock_meta,
	.flags		= LOCK_TYPE_REQUIRES_REFRESH,
	.flags		= LOCK_TYPE_REQUIRES_REFRESH,
};
};


static struct ocfs2_lock_res_ops ocfs2_inode_data_lops = {
static struct ocfs2_lock_res_ops ocfs2_inode_data_lops = {
	.get_osb	= ocfs2_get_inode_osb,
	.bast		= ocfs2_inode_bast_func,
	.bast		= ocfs2_inode_bast_func,
	.unblock	= ocfs2_unblock_data,
	.unblock	= ocfs2_unblock_data,
	.flags		= 0,
	.flags		= 0,
@@ -174,6 +184,7 @@ static struct ocfs2_lock_res_ops ocfs2_rename_lops = {
};
};


static struct ocfs2_lock_res_ops ocfs2_dentry_lops = {
static struct ocfs2_lock_res_ops ocfs2_dentry_lops = {
	.get_osb	= ocfs2_get_dentry_osb,
	.bast		= ocfs2_dentry_bast_func,
	.bast		= ocfs2_dentry_bast_func,
	.unblock	= ocfs2_unblock_dentry_lock,
	.unblock	= ocfs2_unblock_dentry_lock,
	.post_unlock	= ocfs2_dentry_post_unlock,
	.post_unlock	= ocfs2_dentry_post_unlock,
@@ -219,6 +230,14 @@ static inline struct ocfs2_dentry_lock *ocfs2_lock_res_dl(struct ocfs2_lock_res
	return (struct ocfs2_dentry_lock *)lockres->l_priv;
	return (struct ocfs2_dentry_lock *)lockres->l_priv;
}
}


static inline struct ocfs2_super *ocfs2_get_lockres_osb(struct ocfs2_lock_res *lockres)
{
	if (lockres->l_ops->get_osb)
		return lockres->l_ops->get_osb(lockres);

	return (struct ocfs2_super *)lockres->l_priv;
}

static int ocfs2_lock_create(struct ocfs2_super *osb,
static int ocfs2_lock_create(struct ocfs2_super *osb,
			     struct ocfs2_lock_res *lockres,
			     struct ocfs2_lock_res *lockres,
			     int level,
			     int level,
@@ -352,6 +371,13 @@ void ocfs2_inode_lock_res_init(struct ocfs2_lock_res *res,
	ocfs2_lock_res_init_common(OCFS2_SB(inode->i_sb), res, type, ops, inode);
	ocfs2_lock_res_init_common(OCFS2_SB(inode->i_sb), res, type, ops, inode);
}
}


static struct ocfs2_super *ocfs2_get_inode_osb(struct ocfs2_lock_res *lockres)
{
	struct inode *inode = ocfs2_lock_res_inode(lockres);

	return OCFS2_SB(inode->i_sb);
}

static __u64 ocfs2_get_dentry_lock_ino(struct ocfs2_lock_res *lockres)
static __u64 ocfs2_get_dentry_lock_ino(struct ocfs2_lock_res *lockres)
{
{
	__be64 inode_blkno_be;
	__be64 inode_blkno_be;
@@ -362,6 +388,13 @@ static __u64 ocfs2_get_dentry_lock_ino(struct ocfs2_lock_res *lockres)
	return be64_to_cpu(inode_blkno_be);
	return be64_to_cpu(inode_blkno_be);
}
}


static struct ocfs2_super *ocfs2_get_dentry_osb(struct ocfs2_lock_res *lockres)
{
	struct ocfs2_dentry_lock *dl = lockres->l_priv;

	return OCFS2_SB(dl->dl_inode->i_sb);
}

void ocfs2_dentry_lock_res_init(struct ocfs2_dentry_lock *dl,
void ocfs2_dentry_lock_res_init(struct ocfs2_dentry_lock *dl,
				u64 parent, struct inode *inode)
				u64 parent, struct inode *inode)
{
{