Commit d1718e93 authored by David Howells's avatar David Howells Committed by Linus Torvalds

[PATCH] kAFS automount support

Here's a patch to allow the kAFS filesystem to use the automount facility
patch presented in a previous email.

It allows me to mount an AFS root volume on /afs and then just walk through
the directory structure causing referenced volumes to be automounted and
autoumounted.

For instance, if I do:

	[root@andromeda root]# mount -t afs \#root.afs. /afs
	[root@andromeda root]# ls /afs
	asd  cambridge  cambridge.redhat.com  grand.central.org
	[root@andromeda root]# ls /afs/cambridge
	afsdoc
	[root@andromeda root]# ls /afs/cambridge/afsdoc/
	ChangeLog  html  LICENSE  pdf  RELNOTES-1.2.2

And then look in the mountpoint catalogue, I see:

	[root@andromeda root]# cat /proc/mounts
	...
	#root.afs. /afs afs rw 0 0
	#root.cell. /afs/cambridge.redhat.com afs rw 0 0
	#afsdoc. /afs/cambridge.redhat.com/afsdoc afs rw 0 0

Then after waiting a few minutes:

	[root@andromeda root]# cat /proc/mounts
	...
	#root.afs. /afs afs rw 0 0

Is all that remains.
Signed-Off-By: default avatarDavid Howells <dhowells@redhat.com>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent c8a6ba01
...@@ -307,10 +307,8 @@ int afscm_start(void) ...@@ -307,10 +307,8 @@ int afscm_start(void)
if (ret < 0) if (ret < 0)
goto kill; goto kill;
#ifdef AFS_AUTOMOUNT_SUPPORT
afs_kafstimod_add_timer(&afs_mntpt_expiry_timer, afs_kafstimod_add_timer(&afs_mntpt_expiry_timer,
afs_mntpt_expiry_timeout * HZ); afs_mntpt_expiry_timeout * HZ);
#endif
} }
afscm_usage++; afscm_usage++;
...@@ -392,9 +390,7 @@ void afscm_stop(void) ...@@ -392,9 +390,7 @@ void afscm_stop(void)
} }
spin_unlock(&kafscmd_attention_lock); spin_unlock(&kafscmd_attention_lock);
#ifdef AFS_AUTOMOUNT_SUPPORT
afs_kafstimod_del_timer(&afs_mntpt_expiry_timer); afs_kafstimod_del_timer(&afs_mntpt_expiry_timer);
#endif
} }
up_write(&afscm_sem); up_write(&afscm_sem);
......
...@@ -107,11 +107,9 @@ extern struct cachefs_netfs afs_cache_netfs; ...@@ -107,11 +107,9 @@ extern struct cachefs_netfs afs_cache_netfs;
*/ */
extern struct inode_operations afs_mntpt_inode_operations; extern struct inode_operations afs_mntpt_inode_operations;
extern struct file_operations afs_mntpt_file_operations; extern struct file_operations afs_mntpt_file_operations;
#ifdef AFS_AUTOMOUNT_SUPPORT
extern struct afs_timer afs_mntpt_expiry_timer; extern struct afs_timer afs_mntpt_expiry_timer;
extern struct afs_timer_ops afs_mntpt_expiry_timer_ops; extern struct afs_timer_ops afs_mntpt_expiry_timer_ops;
extern unsigned long afs_mntpt_expiry_timeout; extern unsigned long afs_mntpt_expiry_timeout;
#endif
extern int afs_mntpt_check_symlink(struct afs_vnode *vnode); extern int afs_mntpt_check_symlink(struct afs_vnode *vnode);
......
...@@ -30,10 +30,7 @@ static struct dentry *afs_mntpt_lookup(struct inode *dir, ...@@ -30,10 +30,7 @@ static struct dentry *afs_mntpt_lookup(struct inode *dir,
struct dentry *dentry, struct dentry *dentry,
struct nameidata *nd); struct nameidata *nd);
static int afs_mntpt_open(struct inode *inode, struct file *file); static int afs_mntpt_open(struct inode *inode, struct file *file);
#ifdef AFS_AUTOMOUNT_SUPPORT
static int afs_mntpt_follow_link(struct dentry *dentry, struct nameidata *nd); static int afs_mntpt_follow_link(struct dentry *dentry, struct nameidata *nd);
#endif
struct file_operations afs_mntpt_file_operations = { struct file_operations afs_mntpt_file_operations = {
.open = afs_mntpt_open, .open = afs_mntpt_open,
...@@ -41,14 +38,11 @@ struct file_operations afs_mntpt_file_operations = { ...@@ -41,14 +38,11 @@ struct file_operations afs_mntpt_file_operations = {
struct inode_operations afs_mntpt_inode_operations = { struct inode_operations afs_mntpt_inode_operations = {
.lookup = afs_mntpt_lookup, .lookup = afs_mntpt_lookup,
#ifdef AFS_AUTOMOUNT_SUPPORT
.follow_link = afs_mntpt_follow_link, .follow_link = afs_mntpt_follow_link,
#endif
.readlink = page_readlink, .readlink = page_readlink,
.getattr = afs_inode_getattr, .getattr = afs_inode_getattr,
}; };
#ifdef AFS_AUTOMOUNT_SUPPORT
static LIST_HEAD(afs_vfsmounts); static LIST_HEAD(afs_vfsmounts);
static void afs_mntpt_expiry_timed_out(struct afs_timer *timer); static void afs_mntpt_expiry_timed_out(struct afs_timer *timer);
...@@ -60,7 +54,6 @@ struct afs_timer_ops afs_mntpt_expiry_timer_ops = { ...@@ -60,7 +54,6 @@ struct afs_timer_ops afs_mntpt_expiry_timer_ops = {
struct afs_timer afs_mntpt_expiry_timer; struct afs_timer afs_mntpt_expiry_timer;
unsigned long afs_mntpt_expiry_timeout = 20; unsigned long afs_mntpt_expiry_timeout = 20;
#endif
/*****************************************************************************/ /*****************************************************************************/
/* /*
...@@ -156,7 +149,6 @@ static int afs_mntpt_open(struct inode *inode, struct file *file) ...@@ -156,7 +149,6 @@ static int afs_mntpt_open(struct inode *inode, struct file *file)
return -EREMOTE; return -EREMOTE;
} /* end afs_mntpt_open() */ } /* end afs_mntpt_open() */
#ifdef AFS_AUTOMOUNT_SUPPORT
/*****************************************************************************/ /*****************************************************************************/
/* /*
* create a vfsmount to be automounted * create a vfsmount to be automounted
...@@ -168,6 +160,7 @@ static struct vfsmount *afs_mntpt_do_automount(struct dentry *mntpt) ...@@ -168,6 +160,7 @@ static struct vfsmount *afs_mntpt_do_automount(struct dentry *mntpt)
struct page *page = NULL; struct page *page = NULL;
size_t size; size_t size;
char *buf, *devname = NULL, *options = NULL; char *buf, *devname = NULL, *options = NULL;
filler_t *filler;
int ret; int ret;
kenter("{%s}", mntpt->d_name.name); kenter("{%s}", mntpt->d_name.name);
...@@ -189,7 +182,7 @@ static struct vfsmount *afs_mntpt_do_automount(struct dentry *mntpt) ...@@ -189,7 +182,7 @@ static struct vfsmount *afs_mntpt_do_automount(struct dentry *mntpt)
goto error; goto error;
/* read the contents of the AFS special symlink */ /* read the contents of the AFS special symlink */
filler_t *filler = mntpt->d_inode->i_mapping->a_ops->readpage; filler = mntpt->d_inode->i_mapping->a_ops->readpage;
page = read_cache_page(mntpt->d_inode->i_mapping, 0, filler, NULL); page = read_cache_page(mntpt->d_inode->i_mapping, 0, filler, NULL);
if (IS_ERR(page)) { if (IS_ERR(page)) {
...@@ -288,4 +281,3 @@ static void afs_mntpt_expiry_timed_out(struct afs_timer *timer) ...@@ -288,4 +281,3 @@ static void afs_mntpt_expiry_timed_out(struct afs_timer *timer)
kleave(""); kleave("");
} /* end afs_mntpt_expiry_timed_out() */ } /* end afs_mntpt_expiry_timed_out() */
#endif
...@@ -78,9 +78,7 @@ int __init afs_fs_init(void) ...@@ -78,9 +78,7 @@ int __init afs_fs_init(void)
_enter(""); _enter("");
#ifdef AFS_AUTOMOUNT_SUPPORT
afs_timer_init(&afs_mntpt_expiry_timer, &afs_mntpt_expiry_timer_ops); afs_timer_init(&afs_mntpt_expiry_timer, &afs_mntpt_expiry_timer_ops);
#endif
/* create ourselves an inode cache */ /* create ourselves an inode cache */
atomic_set(&afs_count_active_inodes, 0); atomic_set(&afs_count_active_inodes, 0);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment