Whamcloud - gitweb
LU-12930 various: use schedule_timeout_*interruptible
[fs/lustre-release.git] / lustre / llite / llite_lib.c
index a47d84b..e384d64 100644 (file)
@@ -46,9 +46,7 @@
 #include <linux/mm.h>
 #include <linux/user_namespace.h>
 #include <linux/delay.h>
-#ifdef HAVE_UIDGID_HEADER
-# include <linux/uidgid.h>
-#endif
+#include <linux/uidgid.h>
 #include <linux/security.h>
 
 #include <uapi/linux/lustre/lustre_ioctl.h>
@@ -191,8 +189,7 @@ static void ll_free_sbi(struct super_block *sb)
        EXIT;
 }
 
-static int client_common_fill_super(struct super_block *sb, char *md, char *dt,
-                                    struct vfsmount *mnt)
+static int client_common_fill_super(struct super_block *sb, char *md, char *dt)
 {
        struct inode *root = NULL;
        struct ll_sb_info *sbi = ll_s2sbi(sb);
@@ -810,10 +807,9 @@ void ll_kill_super(struct super_block *sb)
                sb->s_dev = sbi->ll_sdev_orig;
 
                /* wait running statahead threads to quit */
-               while (atomic_read(&sbi->ll_sa_running) > 0) {
-                       set_current_state(TASK_UNINTERRUPTIBLE);
-                       schedule_timeout(cfs_time_seconds(1) >> 3);
-               }
+               while (atomic_read(&sbi->ll_sa_running) > 0)
+                       schedule_timeout_uninterruptible(
+                               cfs_time_seconds(1) >> 3);
        }
 
        EXIT;
@@ -995,7 +991,7 @@ void ll_lli_init(struct ll_inode_info *lli)
        } else {
                mutex_init(&lli->lli_size_mutex);
                lli->lli_symlink_name = NULL;
-               init_rwsem(&lli->lli_trunc_sem);
+               ll_trunc_sem_init(&lli->lli_trunc_sem);
                range_lock_tree_init(&lli->lli_write_tree);
                init_rwsem(&lli->lli_glimpse_sem);
                lli->lli_glimpse_time = ktime_set(0, 0);
@@ -1054,7 +1050,7 @@ static int super_setup_bdi_name(struct super_block *sb, char *fmt, ...)
 }
 #endif /* !HAVE_SUPER_SETUP_BDI_NAME */
 
-int ll_fill_super(struct super_block *sb, struct vfsmount *mnt)
+int ll_fill_super(struct super_block *sb)
 {
        struct  lustre_profile *lprof = NULL;
        struct  lustre_sb_info *lsi = s2lsi(sb);
@@ -1063,7 +1059,7 @@ int ll_fill_super(struct super_block *sb, struct vfsmount *mnt)
        char    *profilenm = get_profile_name(sb);
        struct config_llog_instance *cfg;
        /* %p for void* in printf needs 16+2 characters: 0xffffffffffffffff */
-       const int instlen = 16 + 2;
+       const int instlen = LUSTRE_MAXINSTANCE + 2;
        unsigned long cfg_instance = ll_get_cfg_instance(sb);
        char name[MAX_STRING_SIZE];
        int md_len = 0;
@@ -1078,8 +1074,6 @@ int ll_fill_super(struct super_block *sb, struct vfsmount *mnt)
        CDEBUG(D_VFSTRACE, "VFS Op: cfg_instance %s-%016lx (sb %p)\n",
               profilenm, cfg_instance, sb);
 
-       try_module_get(THIS_MODULE);
-
        OBD_ALLOC_PTR(cfg);
        if (cfg == NULL)
                GOTO(out_free_cfg, err = -ENOMEM);
@@ -1175,7 +1169,7 @@ int ll_fill_super(struct super_block *sb, struct vfsmount *mnt)
        snprintf(md, md_len - 1, "%s-%016lx", lprof->lp_md, cfg_instance);
 
        /* connections, registrations, sb setup */
-       err = client_common_fill_super(sb, md, dt, mnt);
+       err = client_common_fill_super(sb, md, dt);
        if (err < 0)
                GOTO(out_free_md, err);
 
@@ -1480,6 +1474,7 @@ static int ll_update_lsm_md(struct inode *inode, struct lustre_md *md)
 {
        struct ll_inode_info *lli = ll_i2info(inode);
        struct lmv_stripe_md *lsm = md->lmv;
+       struct cl_attr  *attr;
        int rc = 0;
 
        ENTRY;
@@ -1503,69 +1498,63 @@ static int ll_update_lsm_md(struct inode *inode, struct lustre_md *md)
         * normally dir layout doesn't change, only take read lock to check
         * that to avoid blocking other MD operations.
         */
-       if (lli->lli_lsm_md)
-               down_read(&lli->lli_lsm_sem);
-       else
-               down_write(&lli->lli_lsm_sem);
+       down_read(&lli->lli_lsm_sem);
 
-       /*
-        * if dir layout mismatch, check whether version is increased, which
-        * means layout is changed, this happens in dir migration and lfsck.
+       /* some current lookup initialized lsm, and unchanged */
+       if (lli->lli_lsm_md && lsm_md_eq(lli->lli_lsm_md, lsm))
+               GOTO(unlock, rc = 0);
+
+       /* if dir layout doesn't match, check whether version is increased,
+        * which means layout is changed, this happens in dir split/merge and
+        * lfsck.
         *
         * foreign LMV should not change.
         */
-       if (lli->lli_lsm_md && !lsm_md_eq(lli->lli_lsm_md, lsm)) {
-               if (lmv_dir_striped(lli->lli_lsm_md) &&
-                   lsm->lsm_md_layout_version <=
-                   lli->lli_lsm_md->lsm_md_layout_version) {
-                       CERROR("%s: "DFID" dir layout mismatch:\n",
-                              ll_i2sbi(inode)->ll_fsname,
-                              PFID(&lli->lli_fid));
-                       lsm_md_dump(D_ERROR, lli->lli_lsm_md);
-                       lsm_md_dump(D_ERROR, lsm);
-                       GOTO(unlock, rc = -EINVAL);
-               }
+       if (lli->lli_lsm_md && lmv_dir_striped(lli->lli_lsm_md) &&
+           lsm->lsm_md_layout_version <=
+           lli->lli_lsm_md->lsm_md_layout_version) {
+               CERROR("%s: "DFID" dir layout mismatch:\n",
+                      ll_i2sbi(inode)->ll_fsname, PFID(&lli->lli_fid));
+               lsm_md_dump(D_ERROR, lli->lli_lsm_md);
+               lsm_md_dump(D_ERROR, lsm);
+               GOTO(unlock, rc = -EINVAL);
+       }
 
-               /* layout changed, switch to write lock */
-               up_read(&lli->lli_lsm_sem);
-               down_write(&lli->lli_lsm_sem);
-               ll_dir_clear_lsm_md(inode);
+       up_read(&lli->lli_lsm_sem);
+       down_write(&lli->lli_lsm_sem);
+       /* clear existing lsm */
+       if (lli->lli_lsm_md) {
+               lmv_free_memmd(lli->lli_lsm_md);
+               lli->lli_lsm_md = NULL;
        }
 
-       /* set directory layout */
-       if (!lli->lli_lsm_md) {
-               struct cl_attr  *attr;
+       rc = ll_init_lsm_md(inode, md);
+       up_write(&lli->lli_lsm_sem);
 
-               rc = ll_init_lsm_md(inode, md);
-               up_write(&lli->lli_lsm_sem);
-               if (rc != 0)
-                       RETURN(rc);
+       if (rc)
+               RETURN(rc);
 
-               /* set md->lmv to NULL, so the following free lustre_md
-                * will not free this lsm */
-               md->lmv = NULL;
+       /* set md->lmv to NULL, so the following free lustre_md will not free
+        * this lsm.
+        */
+       md->lmv = NULL;
 
-               /*
-                * md_merge_attr() may take long, since lsm is already set,
-                * switch to read lock.
-                */
-               down_read(&lli->lli_lsm_sem);
+       /* md_merge_attr() may take long, since lsm is already set, switch to
+        * read lock.
+        */
+       down_read(&lli->lli_lsm_sem);
 
-               if (!lmv_dir_striped(lli->lli_lsm_md))
-                       GOTO(unlock, rc);
+       if (!lmv_dir_striped(lli->lli_lsm_md))
+               GOTO(unlock, rc = 0);
 
-               OBD_ALLOC_PTR(attr);
-               if (attr == NULL)
-                       GOTO(unlock, rc = -ENOMEM);
-
-               /* validate the lsm */
-               rc = md_merge_attr(ll_i2mdexp(inode), lsm, attr,
-                                  ll_md_blocking_ast);
-               if (rc != 0) {
-                       OBD_FREE_PTR(attr);
-                       GOTO(unlock, rc);
-               }
+       OBD_ALLOC_PTR(attr);
+       if (!attr)
+               GOTO(unlock, rc = -ENOMEM);
 
+       /* validate the lsm */
+       rc = md_merge_attr(ll_i2mdexp(inode), lli->lli_lsm_md, attr,
+                          ll_md_blocking_ast);
+       if (!rc) {
                if (md->body->mbo_valid & OBD_MD_FLNLINK)
                        md->body->mbo_nlink = attr->cat_nlink;
                if (md->body->mbo_valid & OBD_MD_FLSIZE)
@@ -1576,13 +1565,14 @@ static int ll_update_lsm_md(struct inode *inode, struct lustre_md *md)
                        md->body->mbo_ctime = attr->cat_ctime;
                if (md->body->mbo_valid & OBD_MD_FLMTIME)
                        md->body->mbo_mtime = attr->cat_mtime;
-
-               OBD_FREE_PTR(attr);
        }
+
+       OBD_FREE_PTR(attr);
+       GOTO(unlock, rc);
 unlock:
        up_read(&lli->lli_lsm_sem);
 
-       RETURN(rc);
+       return rc;
 }
 
 void ll_clear_inode(struct inode *inode)
@@ -2619,8 +2609,10 @@ out:
        /* cleanup will be done if necessary */
        md_free_lustre_md(sbi->ll_md_exp, &md);
 
-       if (rc != 0 && it != NULL && it->it_op & IT_OPEN)
+       if (rc != 0 && it != NULL && it->it_op & IT_OPEN) {
+               ll_intent_drop_lock(it);
                ll_open_cleanup(sb != NULL ? sb : (*inode)->i_sb, req);
+       }
 
        return rc;
 }