1 // SPDX-License-Identifier: GPL-2.0-only 2 /* 3 * This file contains vfs inode ops for the 9P2000.L protocol. 4 * 5 * Copyright (C) 2004 by Eric Van Hensbergen <ericvh@gmail.com> 6 * Copyright (C) 2002 by Ron Minnich <rminnich@lanl.gov> 7 */ 8 9 #include <linux/module.h> 10 #include <linux/errno.h> 11 #include <linux/fs.h> 12 #include <linux/file.h> 13 #include <linux/pagemap.h> 14 #include <linux/stat.h> 15 #include <linux/string.h> 16 #include <linux/inet.h> 17 #include <linux/namei.h> 18 #include <linux/idr.h> 19 #include <linux/sched.h> 20 #include <linux/slab.h> 21 #include <linux/xattr.h> 22 #include <linux/posix_acl.h> 23 #include <net/9p/9p.h> 24 #include <net/9p/client.h> 25 26 #include "v9fs.h" 27 #include "v9fs_vfs.h" 28 #include "fid.h" 29 #include "cache.h" 30 #include "xattr.h" 31 #include "acl.h" 32 33 static int 34 v9fs_vfs_mknod_dotl(struct user_namespace *mnt_userns, struct inode *dir, 35 struct dentry *dentry, umode_t omode, dev_t rdev); 36 37 /** 38 * v9fs_get_fsgid_for_create - Helper function to get the gid for a new object 39 * @dir_inode: The directory inode 40 * 41 * Helper function to get the gid for creating a 42 * new file system object. This checks the S_ISGID to determine the owning 43 * group of the new file system object. 44 */ 45 46 static kgid_t v9fs_get_fsgid_for_create(struct inode *dir_inode) 47 { 48 BUG_ON(dir_inode == NULL); 49 50 if (dir_inode->i_mode & S_ISGID) { 51 /* set_gid bit is set.*/ 52 return dir_inode->i_gid; 53 } 54 return current_fsgid(); 55 } 56 57 static int v9fs_test_inode_dotl(struct inode *inode, void *data) 58 { 59 struct v9fs_inode *v9inode = V9FS_I(inode); 60 struct p9_stat_dotl *st = (struct p9_stat_dotl *)data; 61 62 /* don't match inode of different type */ 63 if (inode_wrong_type(inode, st->st_mode)) 64 return 0; 65 66 if (inode->i_generation != st->st_gen) 67 return 0; 68 69 /* compare qid details */ 70 if (memcmp(&v9inode->qid.version, 71 &st->qid.version, sizeof(v9inode->qid.version))) 72 return 0; 73 74 if (v9inode->qid.type != st->qid.type) 75 return 0; 76 77 if (v9inode->qid.path != st->qid.path) 78 return 0; 79 return 1; 80 } 81 82 /* Always get a new inode */ 83 static int v9fs_test_new_inode_dotl(struct inode *inode, void *data) 84 { 85 return 0; 86 } 87 88 static int v9fs_set_inode_dotl(struct inode *inode, void *data) 89 { 90 struct v9fs_inode *v9inode = V9FS_I(inode); 91 struct p9_stat_dotl *st = (struct p9_stat_dotl *)data; 92 93 memcpy(&v9inode->qid, &st->qid, sizeof(st->qid)); 94 inode->i_generation = st->st_gen; 95 return 0; 96 } 97 98 static struct inode *v9fs_qid_iget_dotl(struct super_block *sb, 99 struct p9_qid *qid, 100 struct p9_fid *fid, 101 struct p9_stat_dotl *st, 102 int new) 103 { 104 int retval; 105 unsigned long i_ino; 106 struct inode *inode; 107 struct v9fs_session_info *v9ses = sb->s_fs_info; 108 int (*test)(struct inode *inode, void *data); 109 110 if (new) 111 test = v9fs_test_new_inode_dotl; 112 else 113 test = v9fs_test_inode_dotl; 114 115 i_ino = v9fs_qid2ino(qid); 116 inode = iget5_locked(sb, i_ino, test, v9fs_set_inode_dotl, st); 117 if (!inode) 118 return ERR_PTR(-ENOMEM); 119 if (!(inode->i_state & I_NEW)) 120 return inode; 121 /* 122 * initialize the inode with the stat info 123 * FIXME!! we may need support for stale inodes 124 * later. 125 */ 126 inode->i_ino = i_ino; 127 retval = v9fs_init_inode(v9ses, inode, 128 st->st_mode, new_decode_dev(st->st_rdev)); 129 if (retval) 130 goto error; 131 132 v9fs_stat2inode_dotl(st, inode, 0); 133 v9fs_cache_inode_get_cookie(inode); 134 retval = v9fs_get_acl(inode, fid); 135 if (retval) 136 goto error; 137 138 unlock_new_inode(inode); 139 return inode; 140 error: 141 iget_failed(inode); 142 return ERR_PTR(retval); 143 144 } 145 146 struct inode * 147 v9fs_inode_from_fid_dotl(struct v9fs_session_info *v9ses, struct p9_fid *fid, 148 struct super_block *sb, int new) 149 { 150 struct p9_stat_dotl *st; 151 struct inode *inode = NULL; 152 153 st = p9_client_getattr_dotl(fid, P9_STATS_BASIC | P9_STATS_GEN); 154 if (IS_ERR(st)) 155 return ERR_CAST(st); 156 157 inode = v9fs_qid_iget_dotl(sb, &st->qid, fid, st, new); 158 kfree(st); 159 return inode; 160 } 161 162 struct dotl_openflag_map { 163 int open_flag; 164 int dotl_flag; 165 }; 166 167 static int v9fs_mapped_dotl_flags(int flags) 168 { 169 int i; 170 int rflags = 0; 171 struct dotl_openflag_map dotl_oflag_map[] = { 172 { O_CREAT, P9_DOTL_CREATE }, 173 { O_EXCL, P9_DOTL_EXCL }, 174 { O_NOCTTY, P9_DOTL_NOCTTY }, 175 { O_APPEND, P9_DOTL_APPEND }, 176 { O_NONBLOCK, P9_DOTL_NONBLOCK }, 177 { O_DSYNC, P9_DOTL_DSYNC }, 178 { FASYNC, P9_DOTL_FASYNC }, 179 { O_DIRECT, P9_DOTL_DIRECT }, 180 { O_LARGEFILE, P9_DOTL_LARGEFILE }, 181 { O_DIRECTORY, P9_DOTL_DIRECTORY }, 182 { O_NOFOLLOW, P9_DOTL_NOFOLLOW }, 183 { O_NOATIME, P9_DOTL_NOATIME }, 184 { O_CLOEXEC, P9_DOTL_CLOEXEC }, 185 { O_SYNC, P9_DOTL_SYNC}, 186 }; 187 for (i = 0; i < ARRAY_SIZE(dotl_oflag_map); i++) { 188 if (flags & dotl_oflag_map[i].open_flag) 189 rflags |= dotl_oflag_map[i].dotl_flag; 190 } 191 return rflags; 192 } 193 194 /** 195 * v9fs_open_to_dotl_flags- convert Linux specific open flags to 196 * plan 9 open flag. 197 * @flags: flags to convert 198 */ 199 int v9fs_open_to_dotl_flags(int flags) 200 { 201 int rflags = 0; 202 203 /* 204 * We have same bits for P9_DOTL_READONLY, P9_DOTL_WRONLY 205 * and P9_DOTL_NOACCESS 206 */ 207 rflags |= flags & O_ACCMODE; 208 rflags |= v9fs_mapped_dotl_flags(flags); 209 210 return rflags; 211 } 212 213 /** 214 * v9fs_vfs_create_dotl - VFS hook to create files for 9P2000.L protocol. 215 * @mnt_userns: The user namespace of the mount 216 * @dir: directory inode that is being created 217 * @dentry: dentry that is being deleted 218 * @omode: create permissions 219 * @excl: True if the file must not yet exist 220 * 221 */ 222 static int 223 v9fs_vfs_create_dotl(struct user_namespace *mnt_userns, struct inode *dir, 224 struct dentry *dentry, umode_t omode, bool excl) 225 { 226 return v9fs_vfs_mknod_dotl(mnt_userns, dir, dentry, omode, 0); 227 } 228 229 static int 230 v9fs_vfs_atomic_open_dotl(struct inode *dir, struct dentry *dentry, 231 struct file *file, unsigned int flags, umode_t omode) 232 { 233 int err = 0; 234 kgid_t gid; 235 umode_t mode; 236 const unsigned char *name = NULL; 237 struct p9_qid qid; 238 struct inode *inode; 239 struct p9_fid *fid = NULL; 240 struct v9fs_inode *v9inode; 241 struct p9_fid *dfid, *ofid, *inode_fid; 242 struct v9fs_session_info *v9ses; 243 struct posix_acl *pacl = NULL, *dacl = NULL; 244 struct dentry *res = NULL; 245 246 if (d_in_lookup(dentry)) { 247 res = v9fs_vfs_lookup(dir, dentry, 0); 248 if (IS_ERR(res)) 249 return PTR_ERR(res); 250 251 if (res) 252 dentry = res; 253 } 254 255 /* Only creates */ 256 if (!(flags & O_CREAT) || d_really_is_positive(dentry)) 257 return finish_no_open(file, res); 258 259 v9ses = v9fs_inode2v9ses(dir); 260 261 name = dentry->d_name.name; 262 p9_debug(P9_DEBUG_VFS, "name:%s flags:0x%x mode:0x%x\n", 263 name, flags, omode); 264 265 dfid = v9fs_parent_fid(dentry); 266 if (IS_ERR(dfid)) { 267 err = PTR_ERR(dfid); 268 p9_debug(P9_DEBUG_VFS, "fid lookup failed %d\n", err); 269 goto out; 270 } 271 272 /* clone a fid to use for creation */ 273 ofid = clone_fid(dfid); 274 if (IS_ERR(ofid)) { 275 err = PTR_ERR(ofid); 276 p9_debug(P9_DEBUG_VFS, "p9_client_walk failed %d\n", err); 277 goto out; 278 } 279 280 gid = v9fs_get_fsgid_for_create(dir); 281 282 mode = omode; 283 /* Update mode based on ACL value */ 284 err = v9fs_acl_mode(dir, &mode, &dacl, &pacl); 285 if (err) { 286 p9_debug(P9_DEBUG_VFS, "Failed to get acl values in creat %d\n", 287 err); 288 goto error; 289 } 290 err = p9_client_create_dotl(ofid, name, v9fs_open_to_dotl_flags(flags), 291 mode, gid, &qid); 292 if (err < 0) { 293 p9_debug(P9_DEBUG_VFS, "p9_client_open_dotl failed in creat %d\n", 294 err); 295 goto error; 296 } 297 v9fs_invalidate_inode_attr(dir); 298 299 /* instantiate inode and assign the unopened fid to the dentry */ 300 fid = p9_client_walk(dfid, 1, &name, 1); 301 p9_client_clunk(dfid); 302 if (IS_ERR(fid)) { 303 err = PTR_ERR(fid); 304 p9_debug(P9_DEBUG_VFS, "p9_client_walk failed %d\n", err); 305 fid = NULL; 306 goto error; 307 } 308 inode = v9fs_get_new_inode_from_fid(v9ses, fid, dir->i_sb); 309 if (IS_ERR(inode)) { 310 err = PTR_ERR(inode); 311 p9_debug(P9_DEBUG_VFS, "inode creation failed %d\n", err); 312 goto error; 313 } 314 /* Now set the ACL based on the default value */ 315 v9fs_set_create_acl(inode, fid, dacl, pacl); 316 317 v9fs_fid_add(dentry, fid); 318 d_instantiate(dentry, inode); 319 320 v9inode = V9FS_I(inode); 321 mutex_lock(&v9inode->v_mutex); 322 if ((v9ses->cache == CACHE_LOOSE || v9ses->cache == CACHE_FSCACHE) && 323 !v9inode->writeback_fid && 324 ((flags & O_ACCMODE) != O_RDONLY)) { 325 /* 326 * clone a fid and add it to writeback_fid 327 * we do it during open time instead of 328 * page dirty time via write_begin/page_mkwrite 329 * because we want write after unlink usecase 330 * to work. 331 */ 332 inode_fid = v9fs_writeback_fid(dentry); 333 if (IS_ERR(inode_fid)) { 334 err = PTR_ERR(inode_fid); 335 mutex_unlock(&v9inode->v_mutex); 336 goto err_clunk_old_fid; 337 } 338 v9inode->writeback_fid = (void *) inode_fid; 339 } 340 mutex_unlock(&v9inode->v_mutex); 341 /* Since we are opening a file, assign the open fid to the file */ 342 err = finish_open(file, dentry, generic_file_open); 343 if (err) 344 goto err_clunk_old_fid; 345 file->private_data = ofid; 346 if (v9ses->cache == CACHE_LOOSE || v9ses->cache == CACHE_FSCACHE) 347 v9fs_cache_inode_set_cookie(inode, file); 348 v9fs_open_fid_add(inode, ofid); 349 file->f_mode |= FMODE_CREATED; 350 out: 351 v9fs_put_acl(dacl, pacl); 352 dput(res); 353 return err; 354 355 error: 356 if (fid) 357 p9_client_clunk(fid); 358 err_clunk_old_fid: 359 if (ofid) 360 p9_client_clunk(ofid); 361 goto out; 362 } 363 364 /** 365 * v9fs_vfs_mkdir_dotl - VFS mkdir hook to create a directory 366 * @mnt_userns: The user namespace of the mount 367 * @dir: inode that is being unlinked 368 * @dentry: dentry that is being unlinked 369 * @omode: mode for new directory 370 * 371 */ 372 373 static int v9fs_vfs_mkdir_dotl(struct user_namespace *mnt_userns, 374 struct inode *dir, struct dentry *dentry, 375 umode_t omode) 376 { 377 int err; 378 struct v9fs_session_info *v9ses; 379 struct p9_fid *fid = NULL, *dfid = NULL; 380 kgid_t gid; 381 const unsigned char *name; 382 umode_t mode; 383 struct inode *inode; 384 struct p9_qid qid; 385 struct posix_acl *dacl = NULL, *pacl = NULL; 386 387 p9_debug(P9_DEBUG_VFS, "name %pd\n", dentry); 388 err = 0; 389 v9ses = v9fs_inode2v9ses(dir); 390 391 omode |= S_IFDIR; 392 if (dir->i_mode & S_ISGID) 393 omode |= S_ISGID; 394 395 dfid = v9fs_parent_fid(dentry); 396 if (IS_ERR(dfid)) { 397 err = PTR_ERR(dfid); 398 p9_debug(P9_DEBUG_VFS, "fid lookup failed %d\n", err); 399 dfid = NULL; 400 goto error; 401 } 402 403 gid = v9fs_get_fsgid_for_create(dir); 404 mode = omode; 405 /* Update mode based on ACL value */ 406 err = v9fs_acl_mode(dir, &mode, &dacl, &pacl); 407 if (err) { 408 p9_debug(P9_DEBUG_VFS, "Failed to get acl values in mkdir %d\n", 409 err); 410 goto error; 411 } 412 name = dentry->d_name.name; 413 err = p9_client_mkdir_dotl(dfid, name, mode, gid, &qid); 414 if (err < 0) 415 goto error; 416 fid = p9_client_walk(dfid, 1, &name, 1); 417 if (IS_ERR(fid)) { 418 err = PTR_ERR(fid); 419 p9_debug(P9_DEBUG_VFS, "p9_client_walk failed %d\n", 420 err); 421 fid = NULL; 422 goto error; 423 } 424 425 /* instantiate inode and assign the unopened fid to the dentry */ 426 if (v9ses->cache == CACHE_LOOSE || v9ses->cache == CACHE_FSCACHE) { 427 inode = v9fs_get_new_inode_from_fid(v9ses, fid, dir->i_sb); 428 if (IS_ERR(inode)) { 429 err = PTR_ERR(inode); 430 p9_debug(P9_DEBUG_VFS, "inode creation failed %d\n", 431 err); 432 goto error; 433 } 434 v9fs_fid_add(dentry, fid); 435 v9fs_set_create_acl(inode, fid, dacl, pacl); 436 d_instantiate(dentry, inode); 437 fid = NULL; 438 err = 0; 439 } else { 440 /* 441 * Not in cached mode. No need to populate 442 * inode with stat. We need to get an inode 443 * so that we can set the acl with dentry 444 */ 445 inode = v9fs_get_inode(dir->i_sb, mode, 0); 446 if (IS_ERR(inode)) { 447 err = PTR_ERR(inode); 448 goto error; 449 } 450 v9fs_set_create_acl(inode, fid, dacl, pacl); 451 d_instantiate(dentry, inode); 452 } 453 inc_nlink(dir); 454 v9fs_invalidate_inode_attr(dir); 455 error: 456 if (fid) 457 p9_client_clunk(fid); 458 v9fs_put_acl(dacl, pacl); 459 p9_client_clunk(dfid); 460 return err; 461 } 462 463 static int 464 v9fs_vfs_getattr_dotl(struct user_namespace *mnt_userns, 465 const struct path *path, struct kstat *stat, 466 u32 request_mask, unsigned int flags) 467 { 468 struct dentry *dentry = path->dentry; 469 struct v9fs_session_info *v9ses; 470 struct p9_fid *fid; 471 struct p9_stat_dotl *st; 472 473 p9_debug(P9_DEBUG_VFS, "dentry: %p\n", dentry); 474 v9ses = v9fs_dentry2v9ses(dentry); 475 if (v9ses->cache == CACHE_LOOSE || v9ses->cache == CACHE_FSCACHE) { 476 generic_fillattr(&init_user_ns, d_inode(dentry), stat); 477 return 0; 478 } 479 fid = v9fs_fid_lookup(dentry); 480 if (IS_ERR(fid)) 481 return PTR_ERR(fid); 482 483 /* Ask for all the fields in stat structure. Server will return 484 * whatever it supports 485 */ 486 487 st = p9_client_getattr_dotl(fid, P9_STATS_ALL); 488 p9_client_clunk(fid); 489 if (IS_ERR(st)) 490 return PTR_ERR(st); 491 492 v9fs_stat2inode_dotl(st, d_inode(dentry), 0); 493 generic_fillattr(&init_user_ns, d_inode(dentry), stat); 494 /* Change block size to what the server returned */ 495 stat->blksize = st->st_blksize; 496 497 kfree(st); 498 return 0; 499 } 500 501 /* 502 * Attribute flags. 503 */ 504 #define P9_ATTR_MODE (1 << 0) 505 #define P9_ATTR_UID (1 << 1) 506 #define P9_ATTR_GID (1 << 2) 507 #define P9_ATTR_SIZE (1 << 3) 508 #define P9_ATTR_ATIME (1 << 4) 509 #define P9_ATTR_MTIME (1 << 5) 510 #define P9_ATTR_CTIME (1 << 6) 511 #define P9_ATTR_ATIME_SET (1 << 7) 512 #define P9_ATTR_MTIME_SET (1 << 8) 513 514 struct dotl_iattr_map { 515 int iattr_valid; 516 int p9_iattr_valid; 517 }; 518 519 static int v9fs_mapped_iattr_valid(int iattr_valid) 520 { 521 int i; 522 int p9_iattr_valid = 0; 523 struct dotl_iattr_map dotl_iattr_map[] = { 524 { ATTR_MODE, P9_ATTR_MODE }, 525 { ATTR_UID, P9_ATTR_UID }, 526 { ATTR_GID, P9_ATTR_GID }, 527 { ATTR_SIZE, P9_ATTR_SIZE }, 528 { ATTR_ATIME, P9_ATTR_ATIME }, 529 { ATTR_MTIME, P9_ATTR_MTIME }, 530 { ATTR_CTIME, P9_ATTR_CTIME }, 531 { ATTR_ATIME_SET, P9_ATTR_ATIME_SET }, 532 { ATTR_MTIME_SET, P9_ATTR_MTIME_SET }, 533 }; 534 for (i = 0; i < ARRAY_SIZE(dotl_iattr_map); i++) { 535 if (iattr_valid & dotl_iattr_map[i].iattr_valid) 536 p9_iattr_valid |= dotl_iattr_map[i].p9_iattr_valid; 537 } 538 return p9_iattr_valid; 539 } 540 541 /** 542 * v9fs_vfs_setattr_dotl - set file metadata 543 * @mnt_userns: The user namespace of the mount 544 * @dentry: file whose metadata to set 545 * @iattr: metadata assignment structure 546 * 547 */ 548 549 int v9fs_vfs_setattr_dotl(struct user_namespace *mnt_userns, 550 struct dentry *dentry, struct iattr *iattr) 551 { 552 int retval, use_dentry = 0; 553 struct p9_fid *fid = NULL; 554 struct p9_iattr_dotl p9attr; 555 struct inode *inode = d_inode(dentry); 556 557 p9_debug(P9_DEBUG_VFS, "\n"); 558 559 retval = setattr_prepare(&init_user_ns, dentry, iattr); 560 if (retval) 561 return retval; 562 563 p9attr.valid = v9fs_mapped_iattr_valid(iattr->ia_valid); 564 p9attr.mode = iattr->ia_mode; 565 p9attr.uid = iattr->ia_uid; 566 p9attr.gid = iattr->ia_gid; 567 p9attr.size = iattr->ia_size; 568 p9attr.atime_sec = iattr->ia_atime.tv_sec; 569 p9attr.atime_nsec = iattr->ia_atime.tv_nsec; 570 p9attr.mtime_sec = iattr->ia_mtime.tv_sec; 571 p9attr.mtime_nsec = iattr->ia_mtime.tv_nsec; 572 573 if (iattr->ia_valid & ATTR_FILE) { 574 fid = iattr->ia_file->private_data; 575 WARN_ON(!fid); 576 } 577 if (!fid) { 578 fid = v9fs_fid_lookup(dentry); 579 use_dentry = 1; 580 } 581 if (IS_ERR(fid)) 582 return PTR_ERR(fid); 583 584 /* Write all dirty data */ 585 if (S_ISREG(inode->i_mode)) 586 filemap_write_and_wait(inode->i_mapping); 587 588 retval = p9_client_setattr(fid, &p9attr); 589 if (retval < 0) { 590 if (use_dentry) 591 p9_client_clunk(fid); 592 return retval; 593 } 594 595 if ((iattr->ia_valid & ATTR_SIZE) && 596 iattr->ia_size != i_size_read(inode)) 597 truncate_setsize(inode, iattr->ia_size); 598 599 v9fs_invalidate_inode_attr(inode); 600 setattr_copy(&init_user_ns, inode, iattr); 601 mark_inode_dirty(inode); 602 if (iattr->ia_valid & ATTR_MODE) { 603 /* We also want to update ACL when we update mode bits */ 604 retval = v9fs_acl_chmod(inode, fid); 605 if (retval < 0) { 606 if (use_dentry) 607 p9_client_clunk(fid); 608 return retval; 609 } 610 } 611 if (use_dentry) 612 p9_client_clunk(fid); 613 614 return 0; 615 } 616 617 /** 618 * v9fs_stat2inode_dotl - populate an inode structure with stat info 619 * @stat: stat structure 620 * @inode: inode to populate 621 * @flags: ctrl flags (e.g. V9FS_STAT2INODE_KEEP_ISIZE) 622 * 623 */ 624 625 void 626 v9fs_stat2inode_dotl(struct p9_stat_dotl *stat, struct inode *inode, 627 unsigned int flags) 628 { 629 umode_t mode; 630 struct v9fs_inode *v9inode = V9FS_I(inode); 631 632 if ((stat->st_result_mask & P9_STATS_BASIC) == P9_STATS_BASIC) { 633 inode->i_atime.tv_sec = stat->st_atime_sec; 634 inode->i_atime.tv_nsec = stat->st_atime_nsec; 635 inode->i_mtime.tv_sec = stat->st_mtime_sec; 636 inode->i_mtime.tv_nsec = stat->st_mtime_nsec; 637 inode->i_ctime.tv_sec = stat->st_ctime_sec; 638 inode->i_ctime.tv_nsec = stat->st_ctime_nsec; 639 inode->i_uid = stat->st_uid; 640 inode->i_gid = stat->st_gid; 641 set_nlink(inode, stat->st_nlink); 642 643 mode = stat->st_mode & S_IALLUGO; 644 mode |= inode->i_mode & ~S_IALLUGO; 645 inode->i_mode = mode; 646 647 if (!(flags & V9FS_STAT2INODE_KEEP_ISIZE)) 648 v9fs_i_size_write(inode, stat->st_size); 649 inode->i_blocks = stat->st_blocks; 650 } else { 651 if (stat->st_result_mask & P9_STATS_ATIME) { 652 inode->i_atime.tv_sec = stat->st_atime_sec; 653 inode->i_atime.tv_nsec = stat->st_atime_nsec; 654 } 655 if (stat->st_result_mask & P9_STATS_MTIME) { 656 inode->i_mtime.tv_sec = stat->st_mtime_sec; 657 inode->i_mtime.tv_nsec = stat->st_mtime_nsec; 658 } 659 if (stat->st_result_mask & P9_STATS_CTIME) { 660 inode->i_ctime.tv_sec = stat->st_ctime_sec; 661 inode->i_ctime.tv_nsec = stat->st_ctime_nsec; 662 } 663 if (stat->st_result_mask & P9_STATS_UID) 664 inode->i_uid = stat->st_uid; 665 if (stat->st_result_mask & P9_STATS_GID) 666 inode->i_gid = stat->st_gid; 667 if (stat->st_result_mask & P9_STATS_NLINK) 668 set_nlink(inode, stat->st_nlink); 669 if (stat->st_result_mask & P9_STATS_MODE) { 670 mode = stat->st_mode & S_IALLUGO; 671 mode |= inode->i_mode & ~S_IALLUGO; 672 inode->i_mode = mode; 673 } 674 if (!(flags & V9FS_STAT2INODE_KEEP_ISIZE) && 675 stat->st_result_mask & P9_STATS_SIZE) 676 v9fs_i_size_write(inode, stat->st_size); 677 if (stat->st_result_mask & P9_STATS_BLOCKS) 678 inode->i_blocks = stat->st_blocks; 679 } 680 if (stat->st_result_mask & P9_STATS_GEN) 681 inode->i_generation = stat->st_gen; 682 683 /* Currently we don't support P9_STATS_BTIME and P9_STATS_DATA_VERSION 684 * because the inode structure does not have fields for them. 685 */ 686 v9inode->cache_validity &= ~V9FS_INO_INVALID_ATTR; 687 } 688 689 static int 690 v9fs_vfs_symlink_dotl(struct user_namespace *mnt_userns, struct inode *dir, 691 struct dentry *dentry, const char *symname) 692 { 693 int err; 694 kgid_t gid; 695 const unsigned char *name; 696 struct p9_qid qid; 697 struct inode *inode; 698 struct p9_fid *dfid; 699 struct p9_fid *fid = NULL; 700 struct v9fs_session_info *v9ses; 701 702 name = dentry->d_name.name; 703 p9_debug(P9_DEBUG_VFS, "%lu,%s,%s\n", dir->i_ino, name, symname); 704 v9ses = v9fs_inode2v9ses(dir); 705 706 dfid = v9fs_parent_fid(dentry); 707 if (IS_ERR(dfid)) { 708 err = PTR_ERR(dfid); 709 p9_debug(P9_DEBUG_VFS, "fid lookup failed %d\n", err); 710 return err; 711 } 712 713 gid = v9fs_get_fsgid_for_create(dir); 714 715 /* Server doesn't alter fid on TSYMLINK. Hence no need to clone it. */ 716 err = p9_client_symlink(dfid, name, symname, gid, &qid); 717 718 if (err < 0) { 719 p9_debug(P9_DEBUG_VFS, "p9_client_symlink failed %d\n", err); 720 goto error; 721 } 722 723 v9fs_invalidate_inode_attr(dir); 724 if (v9ses->cache == CACHE_LOOSE || v9ses->cache == CACHE_FSCACHE) { 725 /* Now walk from the parent so we can get an unopened fid. */ 726 fid = p9_client_walk(dfid, 1, &name, 1); 727 if (IS_ERR(fid)) { 728 err = PTR_ERR(fid); 729 p9_debug(P9_DEBUG_VFS, "p9_client_walk failed %d\n", 730 err); 731 fid = NULL; 732 goto error; 733 } 734 735 /* instantiate inode and assign the unopened fid to dentry */ 736 inode = v9fs_get_new_inode_from_fid(v9ses, fid, dir->i_sb); 737 if (IS_ERR(inode)) { 738 err = PTR_ERR(inode); 739 p9_debug(P9_DEBUG_VFS, "inode creation failed %d\n", 740 err); 741 goto error; 742 } 743 v9fs_fid_add(dentry, fid); 744 d_instantiate(dentry, inode); 745 fid = NULL; 746 err = 0; 747 } else { 748 /* Not in cached mode. No need to populate inode with stat */ 749 inode = v9fs_get_inode(dir->i_sb, S_IFLNK, 0); 750 if (IS_ERR(inode)) { 751 err = PTR_ERR(inode); 752 goto error; 753 } 754 d_instantiate(dentry, inode); 755 } 756 757 error: 758 if (fid) 759 p9_client_clunk(fid); 760 761 p9_client_clunk(dfid); 762 return err; 763 } 764 765 /** 766 * v9fs_vfs_link_dotl - create a hardlink for dotl 767 * @old_dentry: dentry for file to link to 768 * @dir: inode destination for new link 769 * @dentry: dentry for link 770 * 771 */ 772 773 static int 774 v9fs_vfs_link_dotl(struct dentry *old_dentry, struct inode *dir, 775 struct dentry *dentry) 776 { 777 int err; 778 struct p9_fid *dfid, *oldfid; 779 struct v9fs_session_info *v9ses; 780 781 p9_debug(P9_DEBUG_VFS, "dir ino: %lu, old_name: %pd, new_name: %pd\n", 782 dir->i_ino, old_dentry, dentry); 783 784 v9ses = v9fs_inode2v9ses(dir); 785 dfid = v9fs_parent_fid(dentry); 786 if (IS_ERR(dfid)) 787 return PTR_ERR(dfid); 788 789 oldfid = v9fs_fid_lookup(old_dentry); 790 if (IS_ERR(oldfid)) { 791 p9_client_clunk(dfid); 792 return PTR_ERR(oldfid); 793 } 794 795 err = p9_client_link(dfid, oldfid, dentry->d_name.name); 796 797 p9_client_clunk(dfid); 798 p9_client_clunk(oldfid); 799 if (err < 0) { 800 p9_debug(P9_DEBUG_VFS, "p9_client_link failed %d\n", err); 801 return err; 802 } 803 804 v9fs_invalidate_inode_attr(dir); 805 if (v9ses->cache == CACHE_LOOSE || v9ses->cache == CACHE_FSCACHE) { 806 /* Get the latest stat info from server. */ 807 struct p9_fid *fid; 808 809 fid = v9fs_fid_lookup(old_dentry); 810 if (IS_ERR(fid)) 811 return PTR_ERR(fid); 812 813 v9fs_refresh_inode_dotl(fid, d_inode(old_dentry)); 814 p9_client_clunk(fid); 815 } 816 ihold(d_inode(old_dentry)); 817 d_instantiate(dentry, d_inode(old_dentry)); 818 819 return err; 820 } 821 822 /** 823 * v9fs_vfs_mknod_dotl - create a special file 824 * @mnt_userns: The user namespace of the mount 825 * @dir: inode destination for new link 826 * @dentry: dentry for file 827 * @omode: mode for creation 828 * @rdev: device associated with special file 829 * 830 */ 831 static int 832 v9fs_vfs_mknod_dotl(struct user_namespace *mnt_userns, struct inode *dir, 833 struct dentry *dentry, umode_t omode, dev_t rdev) 834 { 835 int err; 836 kgid_t gid; 837 const unsigned char *name; 838 umode_t mode; 839 struct v9fs_session_info *v9ses; 840 struct p9_fid *fid = NULL, *dfid = NULL; 841 struct inode *inode; 842 struct p9_qid qid; 843 struct posix_acl *dacl = NULL, *pacl = NULL; 844 845 p9_debug(P9_DEBUG_VFS, " %lu,%pd mode: %x MAJOR: %u MINOR: %u\n", 846 dir->i_ino, dentry, omode, 847 MAJOR(rdev), MINOR(rdev)); 848 849 v9ses = v9fs_inode2v9ses(dir); 850 dfid = v9fs_parent_fid(dentry); 851 if (IS_ERR(dfid)) { 852 err = PTR_ERR(dfid); 853 p9_debug(P9_DEBUG_VFS, "fid lookup failed %d\n", err); 854 dfid = NULL; 855 goto error; 856 } 857 858 gid = v9fs_get_fsgid_for_create(dir); 859 mode = omode; 860 /* Update mode based on ACL value */ 861 err = v9fs_acl_mode(dir, &mode, &dacl, &pacl); 862 if (err) { 863 p9_debug(P9_DEBUG_VFS, "Failed to get acl values in mknod %d\n", 864 err); 865 goto error; 866 } 867 name = dentry->d_name.name; 868 869 err = p9_client_mknod_dotl(dfid, name, mode, rdev, gid, &qid); 870 if (err < 0) 871 goto error; 872 873 v9fs_invalidate_inode_attr(dir); 874 fid = p9_client_walk(dfid, 1, &name, 1); 875 if (IS_ERR(fid)) { 876 err = PTR_ERR(fid); 877 p9_debug(P9_DEBUG_VFS, "p9_client_walk failed %d\n", 878 err); 879 fid = NULL; 880 goto error; 881 } 882 883 /* instantiate inode and assign the unopened fid to the dentry */ 884 if (v9ses->cache == CACHE_LOOSE || v9ses->cache == CACHE_FSCACHE) { 885 inode = v9fs_get_new_inode_from_fid(v9ses, fid, dir->i_sb); 886 if (IS_ERR(inode)) { 887 err = PTR_ERR(inode); 888 p9_debug(P9_DEBUG_VFS, "inode creation failed %d\n", 889 err); 890 goto error; 891 } 892 v9fs_set_create_acl(inode, fid, dacl, pacl); 893 v9fs_fid_add(dentry, fid); 894 d_instantiate(dentry, inode); 895 fid = NULL; 896 err = 0; 897 } else { 898 /* 899 * Not in cached mode. No need to populate inode with stat. 900 * socket syscall returns a fd, so we need instantiate 901 */ 902 inode = v9fs_get_inode(dir->i_sb, mode, rdev); 903 if (IS_ERR(inode)) { 904 err = PTR_ERR(inode); 905 goto error; 906 } 907 v9fs_set_create_acl(inode, fid, dacl, pacl); 908 d_instantiate(dentry, inode); 909 } 910 error: 911 if (fid) 912 p9_client_clunk(fid); 913 v9fs_put_acl(dacl, pacl); 914 p9_client_clunk(dfid); 915 916 return err; 917 } 918 919 /** 920 * v9fs_vfs_get_link_dotl - follow a symlink path 921 * @dentry: dentry for symlink 922 * @inode: inode for symlink 923 * @done: destructor for return value 924 */ 925 926 static const char * 927 v9fs_vfs_get_link_dotl(struct dentry *dentry, 928 struct inode *inode, 929 struct delayed_call *done) 930 { 931 struct p9_fid *fid; 932 char *target; 933 int retval; 934 935 if (!dentry) 936 return ERR_PTR(-ECHILD); 937 938 p9_debug(P9_DEBUG_VFS, "%pd\n", dentry); 939 940 fid = v9fs_fid_lookup(dentry); 941 if (IS_ERR(fid)) 942 return ERR_CAST(fid); 943 retval = p9_client_readlink(fid, &target); 944 p9_client_clunk(fid); 945 if (retval) 946 return ERR_PTR(retval); 947 set_delayed_call(done, kfree_link, target); 948 return target; 949 } 950 951 int v9fs_refresh_inode_dotl(struct p9_fid *fid, struct inode *inode) 952 { 953 struct p9_stat_dotl *st; 954 struct v9fs_session_info *v9ses; 955 unsigned int flags; 956 957 v9ses = v9fs_inode2v9ses(inode); 958 st = p9_client_getattr_dotl(fid, P9_STATS_ALL); 959 if (IS_ERR(st)) 960 return PTR_ERR(st); 961 /* 962 * Don't update inode if the file type is different 963 */ 964 if (inode_wrong_type(inode, st->st_mode)) 965 goto out; 966 967 /* 968 * We don't want to refresh inode->i_size, 969 * because we may have cached data 970 */ 971 flags = (v9ses->cache == CACHE_LOOSE || v9ses->cache == CACHE_FSCACHE) ? 972 V9FS_STAT2INODE_KEEP_ISIZE : 0; 973 v9fs_stat2inode_dotl(st, inode, flags); 974 out: 975 kfree(st); 976 return 0; 977 } 978 979 const struct inode_operations v9fs_dir_inode_operations_dotl = { 980 .create = v9fs_vfs_create_dotl, 981 .atomic_open = v9fs_vfs_atomic_open_dotl, 982 .lookup = v9fs_vfs_lookup, 983 .link = v9fs_vfs_link_dotl, 984 .symlink = v9fs_vfs_symlink_dotl, 985 .unlink = v9fs_vfs_unlink, 986 .mkdir = v9fs_vfs_mkdir_dotl, 987 .rmdir = v9fs_vfs_rmdir, 988 .mknod = v9fs_vfs_mknod_dotl, 989 .rename = v9fs_vfs_rename, 990 .getattr = v9fs_vfs_getattr_dotl, 991 .setattr = v9fs_vfs_setattr_dotl, 992 .listxattr = v9fs_listxattr, 993 .get_acl = v9fs_iop_get_acl, 994 }; 995 996 const struct inode_operations v9fs_file_inode_operations_dotl = { 997 .getattr = v9fs_vfs_getattr_dotl, 998 .setattr = v9fs_vfs_setattr_dotl, 999 .listxattr = v9fs_listxattr, 1000 .get_acl = v9fs_iop_get_acl, 1001 }; 1002 1003 const struct inode_operations v9fs_symlink_inode_operations_dotl = { 1004 .get_link = v9fs_vfs_get_link_dotl, 1005 .getattr = v9fs_vfs_getattr_dotl, 1006 .setattr = v9fs_vfs_setattr_dotl, 1007 .listxattr = v9fs_listxattr, 1008 }; 1009