cifs: Fix non-availability of dedup breaking generic/304
[platform/kernel/linux-starfive.git] / fs / smb / client / cifsfs.c
index 73c44e0..99497f1 100644 (file)
@@ -117,6 +117,10 @@ module_param(cifs_max_pending, uint, 0444);
 MODULE_PARM_DESC(cifs_max_pending, "Simultaneous requests to server for "
                                   "CIFS/SMB1 dialect (N/A for SMB3) "
                                   "Default: 32767 Range: 2 to 32767.");
+unsigned int dir_cache_timeout = 30;
+module_param(dir_cache_timeout, uint, 0644);
+MODULE_PARM_DESC(dir_cache_timeout, "Number of seconds to cache directory contents for which we have a lease. Default: 30 "
+                                "Range: 1 to 65000 seconds, 0 to disable caching dir contents");
 #ifdef CONFIG_CIFS_STATS2
 unsigned int slow_rsp_threshold = 1;
 module_param(slow_rsp_threshold, uint, 0644);
@@ -695,6 +699,8 @@ cifs_show_options(struct seq_file *s, struct dentry *root)
                seq_printf(s, ",snapshot=%llu", tcon->snapshot_time);
        if (tcon->handle_timeout)
                seq_printf(s, ",handletimeout=%u", tcon->handle_timeout);
+       if (tcon->max_cached_dirs != MAX_CACHED_FIDS)
+               seq_printf(s, ",max_cached_dirs=%u", tcon->max_cached_dirs);
 
        /*
         * Display file and directory attribute timeout in seconds.
@@ -1185,6 +1191,7 @@ const char *cifs_get_link(struct dentry *dentry, struct inode *inode,
 
 const struct inode_operations cifs_symlink_inode_ops = {
        .get_link = cifs_get_link,
+       .setattr = cifs_setattr,
        .permission = cifs_permission,
        .listxattr = cifs_listxattr,
 };
@@ -1201,7 +1208,9 @@ static loff_t cifs_remap_file_range(struct file *src_file, loff_t off,
        unsigned int xid;
        int rc;
 
-       if (remap_flags & ~(REMAP_FILE_DEDUP | REMAP_FILE_ADVISORY))
+       if (remap_flags & REMAP_FILE_DEDUP)
+               return -EOPNOTSUPP;
+       if (remap_flags & ~REMAP_FILE_ADVISORY)
                return -EINVAL;
 
        cifs_dbg(FYI, "clone range\n");
@@ -1679,6 +1688,12 @@ init_cifs(void)
                         CIFS_MAX_REQ);
        }
 
+       /* Limit max to about 18 hours, and setting to zero disables directory entry caching */
+       if (dir_cache_timeout > 65000) {
+               dir_cache_timeout = 65000;
+               cifs_dbg(VFS, "dir_cache_timeout set to max of 65000 seconds\n");
+       }
+
        cifsiod_wq = alloc_workqueue("cifsiod", WQ_FREEZABLE|WQ_MEM_RECLAIM, 0);
        if (!cifsiod_wq) {
                rc = -ENOMEM;