]> git.proxmox.com Git - mirror_ubuntu-zesty-kernel.git/blobdiff - fs/9p/vfs_inode_dotl.c
fs/9p: iattr_valid flags are kernel internal flags map them to 9p values.
[mirror_ubuntu-zesty-kernel.git] / fs / 9p / vfs_inode_dotl.c
index 0b5745e219460fcda4d686349e3ba5ce69122318..7ca7171273d1736f6182a3390d3fb6cf8ed723bd 100644 (file)
@@ -283,13 +283,13 @@ v9fs_vfs_create_dotl(struct inode *dir, struct dentry *dentry, int omode,
        }
 
        name = (char *) dentry->d_name.name;
-       P9_DPRINTK(P9_DEBUG_VFS, "v9fs_vfs_create_dotl: name:%s flags:0x%x "
-                       "mode:0x%x\n", name, flags, omode);
+       p9_debug(P9_DEBUG_VFS, "name:%s flags:0x%x mode:0x%x\n",
+                name, flags, omode);
 
        dfid = v9fs_fid_lookup(dentry->d_parent);
        if (IS_ERR(dfid)) {
                err = PTR_ERR(dfid);
-               P9_DPRINTK(P9_DEBUG_VFS, "fid lookup failed %d\n", err);
+               p9_debug(P9_DEBUG_VFS, "fid lookup failed %d\n", err);
                return err;
        }
 
@@ -297,7 +297,7 @@ v9fs_vfs_create_dotl(struct inode *dir, struct dentry *dentry, int omode,
        ofid = p9_client_walk(dfid, 0, NULL, 1);
        if (IS_ERR(ofid)) {
                err = PTR_ERR(ofid);
-               P9_DPRINTK(P9_DEBUG_VFS, "p9_client_walk failed %d\n", err);
+               p9_debug(P9_DEBUG_VFS, "p9_client_walk failed %d\n", err);
                return err;
        }
 
@@ -307,16 +307,15 @@ v9fs_vfs_create_dotl(struct inode *dir, struct dentry *dentry, int omode,
        /* Update mode based on ACL value */
        err = v9fs_acl_mode(dir, &mode, &dacl, &pacl);
        if (err) {
-               P9_DPRINTK(P9_DEBUG_VFS,
-                          "Failed to get acl values in creat %d\n", err);
+               p9_debug(P9_DEBUG_VFS, "Failed to get acl values in creat %d\n",
+                        err);
                goto error;
        }
        err = p9_client_create_dotl(ofid, name, v9fs_open_to_dotl_flags(flags),
                                    mode, gid, &qid);
        if (err < 0) {
-               P9_DPRINTK(P9_DEBUG_VFS,
-                               "p9_client_open_dotl failed in creat %d\n",
-                               err);
+               p9_debug(P9_DEBUG_VFS, "p9_client_open_dotl failed in creat %d\n",
+                        err);
                goto error;
        }
        v9fs_invalidate_inode_attr(dir);
@@ -325,14 +324,14 @@ v9fs_vfs_create_dotl(struct inode *dir, struct dentry *dentry, int omode,
        fid = p9_client_walk(dfid, 1, &name, 1);
        if (IS_ERR(fid)) {
                err = PTR_ERR(fid);
-               P9_DPRINTK(P9_DEBUG_VFS, "p9_client_walk failed %d\n", err);
+               p9_debug(P9_DEBUG_VFS, "p9_client_walk failed %d\n", err);
                fid = NULL;
                goto error;
        }
        inode = v9fs_get_new_inode_from_fid(v9ses, fid, dir->i_sb);
        if (IS_ERR(inode)) {
                err = PTR_ERR(inode);
-               P9_DPRINTK(P9_DEBUG_VFS, "inode creation failed %d\n", err);
+               p9_debug(P9_DEBUG_VFS, "inode creation failed %d\n", err);
                goto error;
        }
        err = v9fs_fid_add(dentry, fid);
@@ -408,7 +407,7 @@ static int v9fs_vfs_mkdir_dotl(struct inode *dir,
        struct dentry *dir_dentry;
        struct posix_acl *dacl = NULL, *pacl = NULL;
 
-       P9_DPRINTK(P9_DEBUG_VFS, "name %s\n", dentry->d_name.name);
+       p9_debug(P9_DEBUG_VFS, "name %s\n", dentry->d_name.name);
        err = 0;
        v9ses = v9fs_inode2v9ses(dir);
 
@@ -420,7 +419,7 @@ static int v9fs_vfs_mkdir_dotl(struct inode *dir,
        dfid = v9fs_fid_lookup(dir_dentry);
        if (IS_ERR(dfid)) {
                err = PTR_ERR(dfid);
-               P9_DPRINTK(P9_DEBUG_VFS, "fid lookup failed %d\n", err);
+               p9_debug(P9_DEBUG_VFS, "fid lookup failed %d\n", err);
                dfid = NULL;
                goto error;
        }
@@ -430,8 +429,8 @@ static int v9fs_vfs_mkdir_dotl(struct inode *dir,
        /* Update mode based on ACL value */
        err = v9fs_acl_mode(dir, &mode, &dacl, &pacl);
        if (err) {
-               P9_DPRINTK(P9_DEBUG_VFS,
-                          "Failed to get acl values in mkdir %d\n", err);
+               p9_debug(P9_DEBUG_VFS, "Failed to get acl values in mkdir %d\n",
+                        err);
                goto error;
        }
        name = (char *) dentry->d_name.name;
@@ -444,8 +443,8 @@ static int v9fs_vfs_mkdir_dotl(struct inode *dir,
                fid = p9_client_walk(dfid, 1, &name, 1);
                if (IS_ERR(fid)) {
                        err = PTR_ERR(fid);
-                       P9_DPRINTK(P9_DEBUG_VFS, "p9_client_walk failed %d\n",
-                               err);
+                       p9_debug(P9_DEBUG_VFS, "p9_client_walk failed %d\n",
+                                err);
                        fid = NULL;
                        goto error;
                }
@@ -453,8 +452,8 @@ static int v9fs_vfs_mkdir_dotl(struct inode *dir,
                inode = v9fs_get_new_inode_from_fid(v9ses, fid, dir->i_sb);
                if (IS_ERR(inode)) {
                        err = PTR_ERR(inode);
-                       P9_DPRINTK(P9_DEBUG_VFS, "inode creation failed %d\n",
-                               err);
+                       p9_debug(P9_DEBUG_VFS, "inode creation failed %d\n",
+                                err);
                        goto error;
                }
                err = v9fs_fid_add(dentry, fid);
@@ -495,7 +494,7 @@ v9fs_vfs_getattr_dotl(struct vfsmount *mnt, struct dentry *dentry,
        struct p9_fid *fid;
        struct p9_stat_dotl *st;
 
-       P9_DPRINTK(P9_DEBUG_VFS, "dentry: %p\n", dentry);
+       p9_debug(P9_DEBUG_VFS, "dentry: %p\n", dentry);
        err = -EPERM;
        v9ses = v9fs_dentry2v9ses(dentry);
        if (v9ses->cache == CACHE_LOOSE || v9ses->cache == CACHE_FSCACHE) {
@@ -523,6 +522,46 @@ v9fs_vfs_getattr_dotl(struct vfsmount *mnt, struct dentry *dentry,
        return 0;
 }
 
+/*
+ * Attribute flags.
+ */
+#define P9_ATTR_MODE           (1 << 0)
+#define P9_ATTR_UID            (1 << 1)
+#define P9_ATTR_GID            (1 << 2)
+#define P9_ATTR_SIZE           (1 << 3)
+#define P9_ATTR_ATIME          (1 << 4)
+#define P9_ATTR_MTIME          (1 << 5)
+#define P9_ATTR_CTIME          (1 << 6)
+#define P9_ATTR_ATIME_SET      (1 << 7)
+#define P9_ATTR_MTIME_SET      (1 << 8)
+
+struct dotl_iattr_map {
+       int iattr_valid;
+       int p9_iattr_valid;
+};
+
+static int v9fs_mapped_iattr_valid(int iattr_valid)
+{
+       int i;
+       int p9_iattr_valid = 0;
+       struct dotl_iattr_map dotl_iattr_map[] = {
+               { ATTR_MODE,            P9_ATTR_MODE },
+               { ATTR_UID,             P9_ATTR_UID },
+               { ATTR_GID,             P9_ATTR_GID },
+               { ATTR_SIZE,            P9_ATTR_SIZE },
+               { ATTR_ATIME,           P9_ATTR_ATIME },
+               { ATTR_MTIME,           P9_ATTR_MTIME },
+               { ATTR_CTIME,           P9_ATTR_CTIME },
+               { ATTR_ATIME_SET,       P9_ATTR_ATIME_SET },
+               { ATTR_MTIME_SET,       P9_ATTR_MTIME_SET },
+       };
+       for (i = 0; i < ARRAY_SIZE(dotl_iattr_map); i++) {
+               if (iattr_valid & dotl_iattr_map[i].iattr_valid)
+                       p9_iattr_valid |= dotl_iattr_map[i].p9_iattr_valid;
+       }
+       return p9_iattr_valid;
+}
+
 /**
  * v9fs_vfs_setattr_dotl - set file metadata
  * @dentry: file whose metadata to set
@@ -537,13 +576,13 @@ int v9fs_vfs_setattr_dotl(struct dentry *dentry, struct iattr *iattr)
        struct p9_fid *fid;
        struct p9_iattr_dotl p9attr;
 
-       P9_DPRINTK(P9_DEBUG_VFS, "\n");
+       p9_debug(P9_DEBUG_VFS, "\n");
 
        retval = inode_change_ok(dentry->d_inode, iattr);
        if (retval)
                return retval;
 
-       p9attr.valid = iattr->ia_valid;
+       p9attr.valid = v9fs_mapped_iattr_valid(iattr->ia_valid);
        p9attr.mode = iattr->ia_mode;
        p9attr.uid = iattr->ia_uid;
        p9attr.gid = iattr->ia_gid;
@@ -670,14 +709,13 @@ v9fs_vfs_symlink_dotl(struct inode *dir, struct dentry *dentry,
        struct v9fs_session_info *v9ses;
 
        name = (char *) dentry->d_name.name;
-       P9_DPRINTK(P9_DEBUG_VFS, "v9fs_vfs_symlink_dotl : %lu,%s,%s\n",
-                       dir->i_ino, name, symname);
+       p9_debug(P9_DEBUG_VFS, "%lu,%s,%s\n", dir->i_ino, name, symname);
        v9ses = v9fs_inode2v9ses(dir);
 
        dfid = v9fs_fid_lookup(dentry->d_parent);
        if (IS_ERR(dfid)) {
                err = PTR_ERR(dfid);
-               P9_DPRINTK(P9_DEBUG_VFS, "fid lookup failed %d\n", err);
+               p9_debug(P9_DEBUG_VFS, "fid lookup failed %d\n", err);
                return err;
        }
 
@@ -687,7 +725,7 @@ v9fs_vfs_symlink_dotl(struct inode *dir, struct dentry *dentry,
        err = p9_client_symlink(dfid, name, (char *)symname, gid, &qid);
 
        if (err < 0) {
-               P9_DPRINTK(P9_DEBUG_VFS, "p9_client_symlink failed %d\n", err);
+               p9_debug(P9_DEBUG_VFS, "p9_client_symlink failed %d\n", err);
                goto error;
        }
 
@@ -697,8 +735,8 @@ v9fs_vfs_symlink_dotl(struct inode *dir, struct dentry *dentry,
                fid = p9_client_walk(dfid, 1, &name, 1);
                if (IS_ERR(fid)) {
                        err = PTR_ERR(fid);
-                       P9_DPRINTK(P9_DEBUG_VFS, "p9_client_walk failed %d\n",
-                                       err);
+                       p9_debug(P9_DEBUG_VFS, "p9_client_walk failed %d\n",
+                                err);
                        fid = NULL;
                        goto error;
                }
@@ -707,8 +745,8 @@ v9fs_vfs_symlink_dotl(struct inode *dir, struct dentry *dentry,
                inode = v9fs_get_new_inode_from_fid(v9ses, fid, dir->i_sb);
                if (IS_ERR(inode)) {
                        err = PTR_ERR(inode);
-                       P9_DPRINTK(P9_DEBUG_VFS, "inode creation failed %d\n",
-                                       err);
+                       p9_debug(P9_DEBUG_VFS, "inode creation failed %d\n",
+                                err);
                        goto error;
                }
                err = v9fs_fid_add(dentry, fid);
@@ -751,9 +789,8 @@ v9fs_vfs_link_dotl(struct dentry *old_dentry, struct inode *dir,
        struct p9_fid *dfid, *oldfid;
        struct v9fs_session_info *v9ses;
 
-       P9_DPRINTK(P9_DEBUG_VFS, "dir ino: %lu, old_name: %s, new_name: %s\n",
-                       dir->i_ino, old_dentry->d_name.name,
-                       dentry->d_name.name);
+       p9_debug(P9_DEBUG_VFS, "dir ino: %lu, old_name: %s, new_name: %s\n",
+                dir->i_ino, old_dentry->d_name.name, dentry->d_name.name);
 
        v9ses = v9fs_inode2v9ses(dir);
        dir_dentry = v9fs_dentry_from_dir_inode(dir);
@@ -770,7 +807,7 @@ v9fs_vfs_link_dotl(struct dentry *old_dentry, struct inode *dir,
        err = p9_client_link(dfid, oldfid, (char *)dentry->d_name.name);
 
        if (err < 0) {
-               P9_DPRINTK(P9_DEBUG_VFS, "p9_client_link failed %d\n", err);
+               p9_debug(P9_DEBUG_VFS, "p9_client_link failed %d\n", err);
                return err;
        }
 
@@ -813,9 +850,9 @@ v9fs_vfs_mknod_dotl(struct inode *dir, struct dentry *dentry, int omode,
        struct dentry *dir_dentry;
        struct posix_acl *dacl = NULL, *pacl = NULL;
 
-       P9_DPRINTK(P9_DEBUG_VFS,
-               " %lu,%s mode: %x MAJOR: %u MINOR: %u\n", dir->i_ino,
-               dentry->d_name.name, omode, MAJOR(rdev), MINOR(rdev));
+       p9_debug(P9_DEBUG_VFS, " %lu,%s mode: %x MAJOR: %u MINOR: %u\n",
+                dir->i_ino, dentry->d_name.name, omode,
+                MAJOR(rdev), MINOR(rdev));
 
        if (!new_valid_dev(rdev))
                return -EINVAL;
@@ -825,7 +862,7 @@ v9fs_vfs_mknod_dotl(struct inode *dir, struct dentry *dentry, int omode,
        dfid = v9fs_fid_lookup(dir_dentry);
        if (IS_ERR(dfid)) {
                err = PTR_ERR(dfid);
-               P9_DPRINTK(P9_DEBUG_VFS, "fid lookup failed %d\n", err);
+               p9_debug(P9_DEBUG_VFS, "fid lookup failed %d\n", err);
                dfid = NULL;
                goto error;
        }
@@ -835,8 +872,8 @@ v9fs_vfs_mknod_dotl(struct inode *dir, struct dentry *dentry, int omode,
        /* Update mode based on ACL value */
        err = v9fs_acl_mode(dir, &mode, &dacl, &pacl);
        if (err) {
-               P9_DPRINTK(P9_DEBUG_VFS,
-                          "Failed to get acl values in mknod %d\n", err);
+               p9_debug(P9_DEBUG_VFS, "Failed to get acl values in mknod %d\n",
+                        err);
                goto error;
        }
        name = (char *) dentry->d_name.name;
@@ -851,8 +888,8 @@ v9fs_vfs_mknod_dotl(struct inode *dir, struct dentry *dentry, int omode,
                fid = p9_client_walk(dfid, 1, &name, 1);
                if (IS_ERR(fid)) {
                        err = PTR_ERR(fid);
-                       P9_DPRINTK(P9_DEBUG_VFS, "p9_client_walk failed %d\n",
-                               err);
+                       p9_debug(P9_DEBUG_VFS, "p9_client_walk failed %d\n",
+                                err);
                        fid = NULL;
                        goto error;
                }
@@ -860,8 +897,8 @@ v9fs_vfs_mknod_dotl(struct inode *dir, struct dentry *dentry, int omode,
                inode = v9fs_get_new_inode_from_fid(v9ses, fid, dir->i_sb);
                if (IS_ERR(inode)) {
                        err = PTR_ERR(inode);
-                       P9_DPRINTK(P9_DEBUG_VFS, "inode creation failed %d\n",
-                               err);
+                       p9_debug(P9_DEBUG_VFS, "inode creation failed %d\n",
+                                err);
                        goto error;
                }
                err = v9fs_fid_add(dentry, fid);
@@ -905,7 +942,7 @@ v9fs_vfs_follow_link_dotl(struct dentry *dentry, struct nameidata *nd)
        char *link = __getname();
        char *target;
 
-       P9_DPRINTK(P9_DEBUG_VFS, "%s\n", dentry->d_name.name);
+       p9_debug(P9_DEBUG_VFS, "%s\n", dentry->d_name.name);
 
        if (!link) {
                link = ERR_PTR(-ENOMEM);