Whamcloud - gitweb
LU-14644 vvp: wait for nrpages to be updated
[fs/lustre-release.git] / lustre / llite / llite_lib.c
index f7a7cb3..c11da6c 100644 (file)
@@ -27,7 +27,6 @@
  */
 /*
  * This file is part of Lustre, http://www.lustre.org/
- * Lustre is a trademark of Sun Microsystems, Inc.
  *
  * lustre/llite/llite_lib.c
  *
@@ -48,7 +47,6 @@
 #include <linux/user_namespace.h>
 #include <linux/delay.h>
 #include <linux/uidgid.h>
-#include <linux/security.h>
 #include <linux/fs_struct.h>
 
 #ifndef HAVE_CPUS_READ_LOCK
@@ -200,6 +198,11 @@ static struct ll_sb_info *ll_init_sbi(void)
        /* Per-filesystem file heat */
        sbi->ll_heat_decay_weight = SBI_DEFAULT_HEAT_DECAY_WEIGHT;
        sbi->ll_heat_period_second = SBI_DEFAULT_HEAT_PERIOD_SECOND;
+
+       /* Per-fs open heat level before requesting open lock */
+       sbi->ll_oc_thrsh_count = SBI_DEFAULT_OPENCACHE_THRESHOLD_COUNT;
+       sbi->ll_oc_max_ms = SBI_DEFAULT_OPENCACHE_THRESHOLD_MAX_MS;
+       sbi->ll_oc_thrsh_ms = SBI_DEFAULT_OPENCACHE_THRESHOLD_MS;
        RETURN(sbi);
 out_destroy_ra:
        if (sbi->ll_foreign_symlink_prefix)
@@ -332,7 +335,8 @@ static int client_common_fill_super(struct super_block *sb, char *md, char *dt)
                                   OBD_CONNECT2_PCC |
                                   OBD_CONNECT2_CRUSH | OBD_CONNECT2_LSEEK |
                                   OBD_CONNECT2_GETATTR_PFID |
-                                  OBD_CONNECT2_DOM_LVB;
+                                  OBD_CONNECT2_DOM_LVB |
+                                  OBD_CONNECT2_REP_MBITS;
 
 #ifdef HAVE_LRU_RESIZE_SUPPORT
         if (sbi->ll_flags & LL_SBI_LRU_RESIZE)
@@ -361,13 +365,7 @@ static int client_common_fill_super(struct super_block *sb, char *md, char *dt)
         */
        sb->s_flags |= SB_NOSEC;
 #endif
-
-       if (sbi->ll_flags & LL_SBI_FLOCK)
-               sbi->ll_fop = &ll_file_operations_flock;
-       else if (sbi->ll_flags & LL_SBI_LOCALFLOCK)
-               sbi->ll_fop = &ll_file_operations;
-       else
-               sbi->ll_fop = &ll_file_operations_noflock;
+       sbi->ll_fop = ll_select_file_operations(sbi);
 
        /* always ping even if server suppress_pings */
        if (sbi->ll_flags & LL_SBI_ALWAYS_PING)
@@ -530,7 +528,8 @@ static int client_common_fill_super(struct super_block *sb, char *md, char *dt)
                                  OBD_CONNECT_BULK_MBITS | OBD_CONNECT_SHORTIO |
                                  OBD_CONNECT_FLAGS2 | OBD_CONNECT_GRANT_SHRINK;
        data->ocd_connect_flags2 = OBD_CONNECT2_LOCKAHEAD |
-                                  OBD_CONNECT2_INC_XID | OBD_CONNECT2_LSEEK;
+                                  OBD_CONNECT2_INC_XID | OBD_CONNECT2_LSEEK |
+                                  OBD_CONNECT2_REP_MBITS;
 
        if (!OBD_FAIL_CHECK(OBD_FAIL_OSC_CONNECT_GRANT_PARAM))
                data->ocd_connect_flags |= OBD_CONNECT_GRANT_PARAM;
@@ -1222,6 +1221,8 @@ int ll_fill_super(struct super_block *sb)
        CDEBUG(D_VFSTRACE, "VFS Op: cfg_instance %s-%016lx (sb %p)\n",
               profilenm, cfg_instance, sb);
 
+       OBD_RACE(OBD_FAIL_LLITE_RACE_MOUNT);
+
        OBD_ALLOC_PTR(cfg);
        if (cfg == NULL)
                GOTO(out_free_cfg, err = -ENOMEM);
@@ -1589,30 +1590,27 @@ static void ll_update_default_lsm_md(struct inode *inode, struct lustre_md *md)
                        }
                        up_write(&lli->lli_lsm_sem);
                }
-       } else if (lli->lli_default_lsm_md) {
-               /* update default lsm if it changes */
+               return;
+       }
+
+       if (lli->lli_default_lsm_md) {
+               /* do nonthing if default lsm isn't changed */
                down_read(&lli->lli_lsm_sem);
                if (lli->lli_default_lsm_md &&
-                   !lsm_md_eq(lli->lli_default_lsm_md, md->default_lmv)) {
-                       up_read(&lli->lli_lsm_sem);
-                       down_write(&lli->lli_lsm_sem);
-                       if (lli->lli_default_lsm_md)
-                               lmv_free_memmd(lli->lli_default_lsm_md);
-                       lli->lli_default_lsm_md = md->default_lmv;
-                       lsm_md_dump(D_INODE, md->default_lmv);
-                       md->default_lmv = NULL;
-                       up_write(&lli->lli_lsm_sem);
-               } else {
+                   lsm_md_eq(lli->lli_default_lsm_md, md->default_lmv)) {
                        up_read(&lli->lli_lsm_sem);
+                       return;
                }
-       } else {
-               /* init default lsm */
-               down_write(&lli->lli_lsm_sem);
-               lli->lli_default_lsm_md = md->default_lmv;
-               lsm_md_dump(D_INODE, md->default_lmv);
-               md->default_lmv = NULL;
-               up_write(&lli->lli_lsm_sem);
+               up_read(&lli->lli_lsm_sem);
        }
+
+       down_write(&lli->lli_lsm_sem);
+       if (lli->lli_default_lsm_md)
+               lmv_free_memmd(lli->lli_default_lsm_md);
+       lli->lli_default_lsm_md = md->default_lmv;
+       lsm_md_dump(D_INODE, md->default_lmv);
+       md->default_lmv = NULL;
+       up_write(&lli->lli_lsm_sem);
 }
 
 static int ll_update_lsm_md(struct inode *inode, struct lustre_md *md)
@@ -2048,7 +2046,7 @@ int ll_setattr_raw(struct dentry *dentry, struct iattr *attr,
        /* POSIX: check before ATTR_*TIME_SET set (from inode_change_ok) */
        if (attr->ia_valid & TIMES_SET_FLAGS) {
                if ((!uid_eq(current_fsuid(), inode->i_uid)) &&
-                   !cfs_capable(CAP_FOWNER))
+                   !capable(CAP_FOWNER))
                        RETURN(-EPERM);
        }
 
@@ -2090,7 +2088,7 @@ int ll_setattr_raw(struct dentry *dentry, struct iattr *attr,
                 */
                xvalid |= OP_XVALID_OWNEROVERRIDE;
                op_data->op_bias |= MDS_DATA_MODIFIED;
-               ll_file_clear_flag(lli, LLIF_DATA_MODIFIED);
+               clear_bit(LLIF_DATA_MODIFIED, &lli->lli_flags);
        }
 
        if (attr->ia_valid & ATTR_FILE) {
@@ -2175,7 +2173,7 @@ int ll_setattr_raw(struct dentry *dentry, struct iattr *attr,
         * LLIF_DATA_MODIFIED is not set(see vvp_io_setattr_fini()).
         * This way we can save an RPC for common open + trunc
         * operation. */
-       if (ll_file_test_and_clear_flag(lli, LLIF_DATA_MODIFIED)) {
+       if (test_and_clear_bit(LLIF_DATA_MODIFIED, &lli->lli_flags)) {
                struct hsm_state_set hss = {
                        .hss_valid = HSS_SETMASK,
                        .hss_setmask = HS_DIRTY,
@@ -2422,9 +2420,9 @@ void ll_update_inode_flags(struct inode *inode, unsigned int ext_flags)
        ext_flags |= ll_inode_to_ext_flags(inode->i_flags) & LUSTRE_ENCRYPT_FL;
        inode->i_flags = ll_ext_to_inode_flags(ext_flags);
        if (ext_flags & LUSTRE_PROJINHERIT_FL)
-               ll_file_set_flag(ll_i2info(inode), LLIF_PROJECT_INHERIT);
+               set_bit(LLIF_PROJECT_INHERIT, &ll_i2info(inode)->lli_flags);
        else
-               ll_file_clear_flag(ll_i2info(inode), LLIF_PROJECT_INHERIT);
+               clear_bit(LLIF_PROJECT_INHERIT, &ll_i2info(inode)->lli_flags);
 }
 
 int ll_update_inode(struct inode *inode, struct lustre_md *md)
@@ -2540,14 +2538,42 @@ int ll_update_inode(struct inode *inode, struct lustre_md *md)
                 * glimpsing updated attrs
                 */
                if (body->mbo_t_state & MS_RESTORE)
-                       ll_file_set_flag(lli, LLIF_FILE_RESTORING);
+                       set_bit(LLIF_FILE_RESTORING, &lli->lli_flags);
                else
-                       ll_file_clear_flag(lli, LLIF_FILE_RESTORING);
+                       clear_bit(LLIF_FILE_RESTORING, &lli->lli_flags);
        }
 
        return 0;
 }
 
+void ll_truncate_inode_pages_final(struct inode *inode)
+{
+       struct address_space *mapping = &inode->i_data;
+       unsigned long nrpages;
+       unsigned long flags;
+
+       truncate_inode_pages_final(mapping);
+
+       /* Workaround for LU-118: Note nrpages may not be totally updated when
+        * truncate_inode_pages() returns, as there can be a page in the process
+        * of deletion (inside __delete_from_page_cache()) in the specified
+        * range. Thus mapping->nrpages can be non-zero when this function
+        * returns even after truncation of the whole mapping.  Only do this if
+        * npages isn't already zero.
+        */
+       nrpages = mapping->nrpages;
+       if (nrpages) {
+               ll_xa_lock_irqsave(&mapping->i_pages, flags);
+               nrpages = mapping->nrpages;
+               ll_xa_unlock_irqrestore(&mapping->i_pages, flags);
+       } /* Workaround end */
+
+       LASSERTF(nrpages == 0, "%s: inode="DFID"(%p) nrpages=%lu, "
+                "see https://jira.whamcloud.com/browse/LU-118\n",
+                ll_i2sbi(inode)->ll_fsname,
+                PFID(ll_inode2fid(inode)), inode, nrpages);
+}
+
 int ll_read_inode2(struct inode *inode, void *opaque)
 {
         struct lustre_md *md = opaque;
@@ -2605,10 +2631,6 @@ int ll_read_inode2(struct inode *inode, void *opaque)
 void ll_delete_inode(struct inode *inode)
 {
        struct ll_inode_info *lli = ll_i2info(inode);
-       struct address_space *mapping = &inode->i_data;
-       unsigned long nrpages;
-       unsigned long flags;
-
        ENTRY;
 
        if (S_ISREG(inode->i_mode) && lli->lli_clob != NULL) {
@@ -2622,27 +2644,8 @@ void ll_delete_inode(struct inode *inode)
                cl_sync_file_range(inode, 0, OBD_OBJECT_EOF, inode->i_nlink ?
                                   CL_FSYNC_LOCAL : CL_FSYNC_DISCARD, 1);
        }
-       truncate_inode_pages_final(mapping);
-
-       /* Workaround for LU-118: Note nrpages may not be totally updated when
-        * truncate_inode_pages() returns, as there can be a page in the process
-        * of deletion (inside __delete_from_page_cache()) in the specified
-        * range. Thus mapping->nrpages can be non-zero when this function
-        * returns even after truncation of the whole mapping.  Only do this if
-        * npages isn't already zero.
-        */
-       nrpages = mapping->nrpages;
-       if (nrpages) {
-               ll_xa_lock_irqsave(&mapping->i_pages, flags);
-               nrpages = mapping->nrpages;
-               ll_xa_unlock_irqrestore(&mapping->i_pages, flags);
-       } /* Workaround end */
-
-       LASSERTF(nrpages == 0, "%s: inode="DFID"(%p) nrpages=%lu, "
-                "see https://jira.whamcloud.com/browse/LU-118\n",
-                ll_i2sbi(inode)->ll_fsname,
-                PFID(ll_inode2fid(inode)), inode, nrpages);
 
+       ll_truncate_inode_pages_final(inode);
        ll_clear_inode(inode);
        clear_inode(inode);
 
@@ -3134,8 +3137,8 @@ struct md_op_data *ll_prep_md_op_data(struct md_op_data *op_data,
 void ll_finish_md_op_data(struct md_op_data *op_data)
 {
        ll_unlock_md_op_lsm(op_data);
-       security_release_secctx(op_data->op_file_secctx,
-                               op_data->op_file_secctx_size);
+       ll_security_release_secctx(op_data->op_file_secctx,
+                                  op_data->op_file_secctx_size);
        llcrypt_free_ctx(op_data->op_file_encctx, op_data->op_file_encctx_size);
        OBD_FREE_PTR(op_data);
 }
@@ -3198,7 +3201,7 @@ int ll_get_obd_name(struct inode *inode, unsigned int cmd, unsigned long arg)
         struct obd_device *obd;
         ENTRY;
 
-        if (cmd == OBD_IOC_GETDTNAME)
+       if (cmd == OBD_IOC_GETNAME_OLD || cmd == OBD_IOC_GETDTNAME)
                 obd = class_exp2obd(sbi->ll_dt_exp);
         else if (cmd == OBD_IOC_GETMDNAME)
                 obd = class_exp2obd(sbi->ll_md_exp);
@@ -3388,7 +3391,7 @@ int ll_getparent(struct file *file, struct getparent __user *arg)
 
        ENTRY;
 
-       if (!cfs_capable(CAP_DAC_READ_SEARCH) &&
+       if (!capable(CAP_DAC_READ_SEARCH) &&
            !(ll_i2sbi(inode)->ll_flags & LL_SBI_USER_FID2PATH))
                RETURN(-EPERM);