diff options
Diffstat (limited to 'libglusterfs')
| -rw-r--r-- | libglusterfs/src/glusterfs.h | 1 | ||||
| -rw-r--r-- | libglusterfs/src/inode.c | 48 | ||||
| -rw-r--r-- | libglusterfs/src/inode.h | 3 | ||||
| -rw-r--r-- | libglusterfs/src/xlator.h | 3 | 
4 files changed, 55 insertions, 0 deletions
diff --git a/libglusterfs/src/glusterfs.h b/libglusterfs/src/glusterfs.h index 780353d29a8..357284e27b4 100644 --- a/libglusterfs/src/glusterfs.h +++ b/libglusterfs/src/glusterfs.h @@ -285,6 +285,7 @@ struct _cmd_args {          int              selinux;          int              worm;          int              mac_compat; +	int		 fopen_keep_cache;  	struct list_head xlator_options;  /* list of xlator_option_t */  	/* fuse options */ diff --git a/libglusterfs/src/inode.c b/libglusterfs/src/inode.c index e32eddb5d1c..a0088c03c55 100644 --- a/libglusterfs/src/inode.c +++ b/libglusterfs/src/inode.c @@ -950,6 +950,54 @@ inode_forget (inode_t *inode, uint64_t nlookup)          return 0;  } +/* + * Invalidate an inode. This is invoked when a translator decides that an inode's + * cache is no longer valid. Any translator interested in taking action in this + * situation can define the invalidate callback. + */ +int +inode_invalidate(inode_t *inode) +{ +	int ret = 0; +	xlator_t *xl = NULL; +	xlator_t *old_THIS = NULL; + +	if (!inode) { +		gf_log_callingfn(THIS->name, GF_LOG_WARNING, "inode not found"); +		return -1; +	} + +	/* +	 * The master xlator is not in the graph but it can define an invalidate +	 * handler. +	 */ +	xl = inode->table->xl->ctx->master; +	if (xl && xl->cbks->invalidate) { +		old_THIS = THIS; +		THIS = xl; +		ret = xl->cbks->invalidate(xl, inode); +		THIS = old_THIS; +		if (ret) +			return ret; +	} + +	xl = inode->table->xl->graph->first; +	while (xl) { +		old_THIS = THIS; +		THIS = xl; +		if (xl->cbks->invalidate) +			ret = xl->cbks->invalidate(xl, inode); +		THIS = old_THIS; + +		if (ret) +			break; + +		xl = xl->next; +	} + +	return ret; +} +  static void  __inode_unlink (inode_t *inode, inode_t *parent, const char *name) diff --git a/libglusterfs/src/inode.h b/libglusterfs/src/inode.h index 41003df71ca..20e28f6820d 100644 --- a/libglusterfs/src/inode.h +++ b/libglusterfs/src/inode.h @@ -131,6 +131,9 @@ int  inode_forget (inode_t *inode, uint64_t nlookup);  int +inode_invalidate(inode_t *inode); + +int  inode_rename (inode_table_t *table, inode_t *olddir, const char *oldname,  	      inode_t *newdir, const char *newname,  	      inode_t *inode, struct iatt *stbuf); diff --git a/libglusterfs/src/xlator.h b/libglusterfs/src/xlator.h index 2fce7dc474a..5162d20e500 100644 --- a/libglusterfs/src/xlator.h +++ b/libglusterfs/src/xlator.h @@ -730,10 +730,13 @@ typedef int32_t (*cbk_forget_t) (xlator_t *this,  typedef int32_t (*cbk_release_t) (xlator_t *this,                                    fd_t *fd); +typedef int32_t (*cbk_invalidate_t)(xlator_t *this, inode_t *inode); +  struct xlator_cbks {          cbk_forget_t    forget;          cbk_release_t   release;          cbk_release_t   releasedir; +	cbk_invalidate_t invalidate;  };  typedef int32_t (*dumpop_priv_t) (xlator_t *this);  | 
