Commit f88657ce3f9713a0c62101dffb0e972a979e77b9

Authored by Aneesh Kumar K.V
Committed by Eric Van Hensbergen
1 parent b49d8b5d70

fs/9p: Add OS dependent open flags in 9p protocol

Some of the flags are OS/arch dependent we add a 9p
protocol value which maps to asm-generic/fcntl.h values in Linux
Based on the original patch from Venkateswararao Jujjuri <jvrao@linux.vnet.ibm.com>

Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>

Showing 5 changed files with 96 additions and 3 deletions Side-by-side Diff

... ... @@ -83,5 +83,7 @@
83 83 v9inode->cache_validity |= V9FS_INO_INVALID_ATTR;
84 84 return;
85 85 }
  86 +
  87 +int v9fs_open_to_dotl_flags(int flags);
86 88 #endif
... ... @@ -65,7 +65,7 @@
65 65 v9inode = V9FS_I(inode);
66 66 v9ses = v9fs_inode2v9ses(inode);
67 67 if (v9fs_proto_dotl(v9ses))
68   - omode = file->f_flags;
  68 + omode = v9fs_open_to_dotl_flags(file->f_flags);
69 69 else
70 70 omode = v9fs_uflags2omode(file->f_flags,
71 71 v9fs_proto_dotu(v9ses));
... ... @@ -553,6 +553,19 @@
553 553 }
554 554  
555 555 /**
  556 + * v9fs_at_to_dotl_flags- convert Linux specific AT flags to
  557 + * plan 9 AT flag.
  558 + * @flags: flags to convert
  559 + */
  560 +static int v9fs_at_to_dotl_flags(int flags)
  561 +{
  562 + int rflags = 0;
  563 + if (flags & AT_REMOVEDIR)
  564 + rflags |= P9_DOTL_AT_REMOVEDIR;
  565 + return rflags;
  566 +}
  567 +
  568 +/**
556 569 * v9fs_remove - helper function to remove files and directories
557 570 * @dir: directory inode that is being deleted
558 571 * @dentry: dentry that is being deleted
... ... @@ -579,7 +592,8 @@
579 592 return retval;
580 593 }
581 594 if (v9fs_proto_dotl(v9ses))
582   - retval = p9_client_unlinkat(dfid, dentry->d_name.name, flags);
  595 + retval = p9_client_unlinkat(dfid, dentry->d_name.name,
  596 + v9fs_at_to_dotl_flags(flags));
583 597 if (retval == -EOPNOTSUPP) {
584 598 /* Try the one based on path */
585 599 v9fid = v9fs_fid_clone(dentry);
fs/9p/vfs_inode_dotl.c
... ... @@ -191,7 +191,59 @@
191 191 return inode;
192 192 }
193 193  
  194 +struct dotl_openflag_map {
  195 + int open_flag;
  196 + int dotl_flag;
  197 +};
  198 +
  199 +static int v9fs_mapped_dotl_flags(int flags)
  200 +{
  201 + int i;
  202 + int rflags = 0;
  203 + struct dotl_openflag_map dotl_oflag_map[] = {
  204 + { O_CREAT, P9_DOTL_CREATE },
  205 + { O_EXCL, P9_DOTL_EXCL },
  206 + { O_NOCTTY, P9_DOTL_NOCTTY },
  207 + { O_TRUNC, P9_DOTL_TRUNC },
  208 + { O_APPEND, P9_DOTL_APPEND },
  209 + { O_NONBLOCK, P9_DOTL_NONBLOCK },
  210 + { O_DSYNC, P9_DOTL_DSYNC },
  211 + { FASYNC, P9_DOTL_FASYNC },
  212 + { O_DIRECT, P9_DOTL_DIRECT },
  213 + { O_LARGEFILE, P9_DOTL_LARGEFILE },
  214 + { O_DIRECTORY, P9_DOTL_DIRECTORY },
  215 + { O_NOFOLLOW, P9_DOTL_NOFOLLOW },
  216 + { O_NOATIME, P9_DOTL_NOATIME },
  217 + { O_CLOEXEC, P9_DOTL_CLOEXEC },
  218 + { O_SYNC, P9_DOTL_SYNC},
  219 + };
  220 + for (i = 0; i < ARRAY_SIZE(dotl_oflag_map); i++) {
  221 + if (flags & dotl_oflag_map[i].open_flag)
  222 + rflags |= dotl_oflag_map[i].dotl_flag;
  223 + }
  224 + return rflags;
  225 +}
  226 +
194 227 /**
  228 + * v9fs_open_to_dotl_flags- convert Linux specific open flags to
  229 + * plan 9 open flag.
  230 + * @flags: flags to convert
  231 + */
  232 +int v9fs_open_to_dotl_flags(int flags)
  233 +{
  234 + int rflags = 0;
  235 +
  236 + /*
  237 + * We have same bits for P9_DOTL_READONLY, P9_DOTL_WRONLY
  238 + * and P9_DOTL_NOACCESS
  239 + */
  240 + rflags |= flags & O_ACCMODE;
  241 + rflags |= v9fs_mapped_dotl_flags(flags);
  242 +
  243 + return rflags;
  244 +}
  245 +
  246 +/**
195 247 * v9fs_vfs_create_dotl - VFS hook to create files for 9P2000.L protocol.
196 248 * @dir: directory inode that is being created
197 249 * @dentry: dentry that is being deleted
... ... @@ -259,7 +311,8 @@
259 311 "Failed to get acl values in creat %d\n", err);
260 312 goto error;
261 313 }
262   - err = p9_client_create_dotl(ofid, name, flags, mode, gid, &qid);
  314 + err = p9_client_create_dotl(ofid, name, v9fs_open_to_dotl_flags(flags),
  315 + mode, gid, &qid);
263 316 if (err < 0) {
264 317 P9_DPRINTK(P9_DEBUG_VFS,
265 318 "p9_client_open_dotl failed in creat %d\n",
... ... @@ -288,6 +288,30 @@
288 288 P9_DMSETVTX = 0x00010000,
289 289 };
290 290  
  291 +/* 9p2000.L open flags */
  292 +#define P9_DOTL_RDONLY 00000000
  293 +#define P9_DOTL_WRONLY 00000001
  294 +#define P9_DOTL_RDWR 00000002
  295 +#define P9_DOTL_NOACCESS 00000003
  296 +#define P9_DOTL_CREATE 00000100
  297 +#define P9_DOTL_EXCL 00000200
  298 +#define P9_DOTL_NOCTTY 00000400
  299 +#define P9_DOTL_TRUNC 00001000
  300 +#define P9_DOTL_APPEND 00002000
  301 +#define P9_DOTL_NONBLOCK 00004000
  302 +#define P9_DOTL_DSYNC 00010000
  303 +#define P9_DOTL_FASYNC 00020000
  304 +#define P9_DOTL_DIRECT 00040000
  305 +#define P9_DOTL_LARGEFILE 00100000
  306 +#define P9_DOTL_DIRECTORY 00200000
  307 +#define P9_DOTL_NOFOLLOW 00400000
  308 +#define P9_DOTL_NOATIME 01000000
  309 +#define P9_DOTL_CLOEXEC 02000000
  310 +#define P9_DOTL_SYNC 04000000
  311 +
  312 +/* 9p2000.L at flags */
  313 +#define P9_DOTL_AT_REMOVEDIR 0x200
  314 +
291 315 /**
292 316 * enum p9_qid_t - QID types
293 317 * @P9_QTDIR: directory