From: Yehuda Sadeh Date: Tue, 14 Oct 2008 01:37:39 +0000 (-0700) Subject: kclient: preliminary forced umount X-Git-Tag: v0.5~327 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=d3f6a6fc4124609846ce072d76461e206258cb0f;p=ceph.git kclient: preliminary forced umount --- diff --git a/src/kernel/addr.c b/src/kernel/addr.c index 68a339882512..89b33716dc32 100644 --- a/src/kernel/addr.c +++ b/src/kernel/addr.c @@ -520,6 +520,14 @@ static int ceph_writepages_start(struct address_space *mapping, int rc = 0; unsigned wsize = 1 << inode->i_blkbits; + client = ceph_inode_to_client(inode); + + dout(1, "writepage client=%p\n", client); + if (client->mount_state == CEPH_MOUNT_SHUTDOWN) { + dout(1, "writepage on forced umount\n"); + return -EIO; /* we're in a forced umount, don't write anything! */ + } + if (client->mount_args.wsize && client->mount_args.wsize < wsize) wsize = client->mount_args.wsize; if (wsize < PAGE_CACHE_SIZE) diff --git a/src/kernel/mds_client.c b/src/kernel/mds_client.c index 42861ac17b69..a4253a608ce2 100644 --- a/src/kernel/mds_client.c +++ b/src/kernel/mds_client.c @@ -1890,6 +1890,7 @@ void ceph_mdsc_close_sessions(struct ceph_mds_client *mdsc) int i; int n; unsigned long started, timeout = 30 * HZ; + struct ceph_client *client = mdsc->client; dout(10, "close_sessions\n"); mdsc->stopping = 1; @@ -1932,9 +1933,13 @@ void ceph_mdsc_close_sessions(struct ceph_mds_client *mdsc) if (n == 0) break; + if (client->mount_state == CEPH_MOUNT_SHUTDOWN) + break; + dout(10, "waiting for sessions to close\n"); mutex_unlock(&mdsc->mutex); up_write(&mdsc->snap_rwsem); + wait_for_completion_timeout(&mdsc->session_close_waiters, timeout); mutex_lock(&mdsc->mutex); diff --git a/src/kernel/mon_client.c b/src/kernel/mon_client.c index 45436042faf6..6f17475303e1 100644 --- a/src/kernel/mon_client.c +++ b/src/kernel/mon_client.c @@ -230,6 +230,11 @@ static void do_request_umount(struct work_struct *work) void ceph_monc_request_umount(struct ceph_mon_client *monc) { + struct ceph_client *client=monc->client; + + if (client->mount_state == CEPH_MOUNT_SHUTDOWN) + return; + mutex_lock(&monc->req_mutex); monc->umount_delay = BASE_DELAY_INTERVAL; do_request_umount(&monc->umount_delayed_work.work); diff --git a/src/kernel/super.c b/src/kernel/super.c index 9ba3dc6867c5..d625232bce11 100644 --- a/src/kernel/super.c +++ b/src/kernel/super.c @@ -70,11 +70,13 @@ static void ceph_put_super(struct super_block *s) ceph_mdsc_close_sessions(&cl->mdsc); ceph_monc_request_umount(&cl->monc); - rc = wait_event_timeout(cl->mount_wq, - (cl->mount_state == CEPH_MOUNT_UNMOUNTED), - seconds*HZ); - if (rc == 0) - derr(0, "umount timed out after %d seconds\n", seconds); + if (cl->mount_state != CEPH_MOUNT_SHUTDOWN) { + rc = wait_event_timeout(cl->mount_wq, + (cl->mount_state == CEPH_MOUNT_UNMOUNTED), + seconds*HZ); + if (rc == 0) + derr(0, "umount timed out after %d seconds\n", seconds); + } return; } @@ -258,6 +260,24 @@ static void destroy_inodecache(void) kmem_cache_destroy(ceph_inode_cachep); } +static void ceph_umount_begin(struct vfsmount *vfsmnt, int flags) +{ + struct ceph_client *client = ceph_sb_to_client(vfsmnt->mnt_sb); + + dout(30, "ceph_umount_begin\n"); + + if (!(flags & MNT_FORCE)) + return; + + if (!client) + return; + + client->mount_state = CEPH_MOUNT_SHUTDOWN; + + return; +} + + static const struct super_operations ceph_super_ops = { .alloc_inode = ceph_alloc_inode, .destroy_inode = ceph_destroy_inode, @@ -266,6 +286,7 @@ static const struct super_operations ceph_super_ops = { .put_super = ceph_put_super, .show_options = ceph_show_options, .statfs = ceph_statfs, + .umount_begin = ceph_umount_begin, }; @@ -1074,9 +1095,6 @@ static void ceph_kill_sb(struct super_block *s) } - - - /************************************/ static struct file_system_type ceph_fs_type = { diff --git a/src/kernel/super.h b/src/kernel/super.h index c7fddb7a58e9..d4ad676ed002 100644 --- a/src/kernel/super.h +++ b/src/kernel/super.h @@ -129,6 +129,7 @@ enum { CEPH_MOUNT_MOUNTED, CEPH_MOUNT_UNMOUNTING, CEPH_MOUNT_UNMOUNTED, + CEPH_MOUNT_SHUTDOWN, };