]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
kclient: preliminary forced umount
authorYehuda Sadeh <yehuda@hq.newdream.net>
Tue, 14 Oct 2008 01:37:39 +0000 (18:37 -0700)
committerYehuda Sadeh <yehuda@hq.newdream.net>
Tue, 14 Oct 2008 01:37:54 +0000 (18:37 -0700)
src/kernel/addr.c
src/kernel/mds_client.c
src/kernel/mon_client.c
src/kernel/super.c
src/kernel/super.h

index 68a33988251242dfa3830376d443be280e3f0e35..89b33716dc329747b40a1708ebfa78c5d7d6564d 100644 (file)
@@ -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)
index 42861ac17b69b2714e716b78ce52236280818359..a4253a608ce20890a1264f554c0301065e8d40c5 100644 (file)
@@ -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);
index 45436042faf60391be1ca202299afb02cbe8a436..6f17475303e1fdc1897234370cc97bc949c33c7c 100644 (file)
@@ -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);
index 9ba3dc6867c5f3175f27ce09fb0cbe9ef4f1d464..d625232bce11de6e9e2696ffc6e869a854c8b72a 100644 (file)
@@ -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 = {
index c7fddb7a58e9a7da9fcec27a7ed567e3825b067f..d4ad676ed0028ba2e4b4591c82cf6de2ec91f109 100644 (file)
@@ -129,6 +129,7 @@ enum {
        CEPH_MOUNT_MOUNTED,
        CEPH_MOUNT_UNMOUNTING,
        CEPH_MOUNT_UNMOUNTED,
+       CEPH_MOUNT_SHUTDOWN,
 };