]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - fs/cifs/inode.c
Merge tag 'for-linus' of git://git.kernel.org/pub/scm/virt/kvm/kvm
[linux.git] / fs / cifs / inode.c
index 7ab5be7944aa8436f35e1e6d1ac6f277a07e14af..4d1fcd76d022f6848c16294411d5a937e053e27a 100644 (file)
@@ -23,6 +23,8 @@
 #include <linux/slab.h>
 #include <linux/pagemap.h>
 #include <linux/freezer.h>
+#include <linux/sched/signal.h>
+
 #include <asm/div64.h>
 #include "cifsfs.h"
 #include "cifspdu.h"
@@ -320,9 +322,9 @@ cifs_create_dfs_fattr(struct cifs_fattr *fattr, struct super_block *sb)
        fattr->cf_mode = S_IFDIR | S_IXUGO | S_IRWXU;
        fattr->cf_uid = cifs_sb->mnt_uid;
        fattr->cf_gid = cifs_sb->mnt_gid;
-       fattr->cf_atime = CURRENT_TIME;
-       fattr->cf_ctime = CURRENT_TIME;
-       fattr->cf_mtime = CURRENT_TIME;
+       ktime_get_real_ts(&fattr->cf_mtime);
+       fattr->cf_mtime = timespec_trunc(fattr->cf_mtime, sb->s_time_gran);
+       fattr->cf_atime = fattr->cf_ctime = fattr->cf_mtime;
        fattr->cf_nlink = 2;
        fattr->cf_flags |= CIFS_FATTR_DFS_REFERRAL;
 }
@@ -561,8 +563,7 @@ static int cifs_sfu_mode(struct cifs_fattr *fattr, const unsigned char *path,
 
        rc = tcon->ses->server->ops->query_all_EAs(xid, tcon, path,
                        "SETFILEBITS", ea_value, 4 /* size of buf */,
-                       cifs_sb->local_nls,
-                       cifs_remap(cifs_sb));
+                       cifs_sb);
        cifs_put_tlink(tlink);
        if (rc < 0)
                return (int)rc;
@@ -584,9 +585,10 @@ static int cifs_sfu_mode(struct cifs_fattr *fattr, const unsigned char *path,
 /* Fill a cifs_fattr struct with info from FILE_ALL_INFO */
 static void
 cifs_all_info_to_fattr(struct cifs_fattr *fattr, FILE_ALL_INFO *info,
-                      struct cifs_sb_info *cifs_sb, bool adjust_tz,
+                      struct super_block *sb, bool adjust_tz,
                       bool symlink)
 {
+       struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
        struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
 
        memset(fattr, 0, sizeof(*fattr));
@@ -596,8 +598,10 @@ cifs_all_info_to_fattr(struct cifs_fattr *fattr, FILE_ALL_INFO *info,
 
        if (info->LastAccessTime)
                fattr->cf_atime = cifs_NTtimeToUnix(info->LastAccessTime);
-       else
-               fattr->cf_atime = CURRENT_TIME;
+       else {
+               ktime_get_real_ts(&fattr->cf_atime);
+               fattr->cf_atime = timespec_trunc(fattr->cf_atime, sb->s_time_gran);
+       }
 
        fattr->cf_ctime = cifs_NTtimeToUnix(info->ChangeTime);
        fattr->cf_mtime = cifs_NTtimeToUnix(info->LastWriteTime);
@@ -657,7 +661,6 @@ cifs_get_file_info(struct file *filp)
        FILE_ALL_INFO find_data;
        struct cifs_fattr fattr;
        struct inode *inode = file_inode(filp);
-       struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
        struct cifsFileInfo *cfile = filp->private_data;
        struct cifs_tcon *tcon = tlink_tcon(cfile->tlink);
        struct TCP_Server_Info *server = tcon->ses->server;
@@ -669,7 +672,7 @@ cifs_get_file_info(struct file *filp)
        rc = server->ops->query_file_info(xid, tcon, &cfile->fid, &find_data);
        switch (rc) {
        case 0:
-               cifs_all_info_to_fattr(&fattr, &find_data, cifs_sb, false,
+               cifs_all_info_to_fattr(&fattr, &find_data, inode->i_sb, false,
                                       false);
                break;
        case -EREMOTE:
@@ -751,7 +754,7 @@ cifs_get_inode_info(struct inode **inode, const char *full_path,
        }
 
        if (!rc) {
-               cifs_all_info_to_fattr(&fattr, data, cifs_sb, adjust_tz,
+               cifs_all_info_to_fattr(&fattr, data, sb, adjust_tz,
                                       symlink);
        } else if (rc == -EREMOTE) {
                cifs_create_dfs_fattr(&fattr, sb);
@@ -1361,9 +1364,9 @@ int cifs_unlink(struct inode *dir, struct dentry *dentry)
                cifs_inode = CIFS_I(inode);
                cifs_inode->time = 0;   /* will force revalidate to get info
                                           when needed */
-               inode->i_ctime = current_fs_time(sb);
+               inode->i_ctime = current_time(inode);
        }
-       dir->i_ctime = dir->i_mtime = current_fs_time(sb);
+       dir->i_ctime = dir->i_mtime = current_time(dir);
        cifs_inode = CIFS_I(dir);
        CIFS_I(dir)->time = 0;  /* force revalidate of dir as well */
 unlink_out:
@@ -1631,7 +1634,7 @@ int cifs_rmdir(struct inode *inode, struct dentry *direntry)
        cifsInode->time = 0;
 
        d_inode(direntry)->i_ctime = inode->i_ctime = inode->i_mtime =
-               current_fs_time(inode->i_sb);
+               current_time(inode);
 
 rmdir_exit:
        kfree(full_path);
@@ -1804,7 +1807,7 @@ cifs_rename2(struct inode *source_dir, struct dentry *source_dentry,
        CIFS_I(source_dir)->time = CIFS_I(target_dir)->time = 0;
 
        source_dir->i_ctime = source_dir->i_mtime = target_dir->i_ctime =
-               target_dir->i_mtime = current_fs_time(source_dir->i_sb);
+               target_dir->i_mtime = current_time(source_dir);
 
 cifs_rename_exit:
        kfree(info_buf_source);
@@ -1990,9 +1993,10 @@ int cifs_revalidate_dentry(struct dentry *dentry)
        return cifs_revalidate_mapping(inode);
 }
 
-int cifs_getattr(struct vfsmount *mnt, struct dentry *dentry,
-                struct kstat *stat)
+int cifs_getattr(const struct path *path, struct kstat *stat,
+                u32 request_mask, unsigned int flags)
 {
+       struct dentry *dentry = path->dentry;
        struct cifs_sb_info *cifs_sb = CIFS_SB(dentry->d_sb);
        struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
        struct inode *inode = d_inode(dentry);