return ret;
  }
  
 -      sock = sock_from_file(req->file, &ret);
+ static int io_renameat_prep(struct io_kiocb *req,
+                           const struct io_uring_sqe *sqe)
+ {
+       struct io_rename *ren = &req->rename;
+       const char __user *oldf, *newf;
+ 
+       if (unlikely(req->flags & REQ_F_FIXED_FILE))
+               return -EBADF;
+ 
+       ren->old_dfd = READ_ONCE(sqe->fd);
+       oldf = u64_to_user_ptr(READ_ONCE(sqe->addr));
+       newf = u64_to_user_ptr(READ_ONCE(sqe->addr2));
+       ren->new_dfd = READ_ONCE(sqe->len);
+       ren->flags = READ_ONCE(sqe->rename_flags);
+ 
+       ren->oldpath = getname(oldf);
+       if (IS_ERR(ren->oldpath))
+               return PTR_ERR(ren->oldpath);
+ 
+       ren->newpath = getname(newf);
+       if (IS_ERR(ren->newpath)) {
+               putname(ren->oldpath);
+               return PTR_ERR(ren->newpath);
+       }
+ 
+       req->flags |= REQ_F_NEED_CLEANUP;
+       return 0;
+ }
+ 
+ static int io_renameat(struct io_kiocb *req, bool force_nonblock)
+ {
+       struct io_rename *ren = &req->rename;
+       int ret;
+ 
+       if (force_nonblock)
+               return -EAGAIN;
+ 
+       ret = do_renameat2(ren->old_dfd, ren->oldpath, ren->new_dfd,
+                               ren->newpath, ren->flags);
+ 
+       req->flags &= ~REQ_F_NEED_CLEANUP;
+       if (ret < 0)
+               req_set_fail_links(req);
+       io_req_complete(req, ret);
+       return 0;
+ }
+ 
+ static int io_unlinkat_prep(struct io_kiocb *req,
+                           const struct io_uring_sqe *sqe)
+ {
+       struct io_unlink *un = &req->unlink;
+       const char __user *fname;
+ 
+       if (unlikely(req->flags & REQ_F_FIXED_FILE))
+               return -EBADF;
+ 
+       un->dfd = READ_ONCE(sqe->fd);
+ 
+       un->flags = READ_ONCE(sqe->unlink_flags);
+       if (un->flags & ~AT_REMOVEDIR)
+               return -EINVAL;
+ 
+       fname = u64_to_user_ptr(READ_ONCE(sqe->addr));
+       un->filename = getname(fname);
+       if (IS_ERR(un->filename))
+               return PTR_ERR(un->filename);
+ 
+       req->flags |= REQ_F_NEED_CLEANUP;
+       return 0;
+ }
+ 
+ static int io_unlinkat(struct io_kiocb *req, bool force_nonblock)
+ {
+       struct io_unlink *un = &req->unlink;
+       int ret;
+ 
+       if (force_nonblock)
+               return -EAGAIN;
+ 
+       if (un->flags & AT_REMOVEDIR)
+               ret = do_rmdir(un->dfd, un->filename);
+       else
+               ret = do_unlinkat(un->dfd, un->filename);
+ 
+       req->flags &= ~REQ_F_NEED_CLEANUP;
+       if (ret < 0)
+               req_set_fail_links(req);
+       io_req_complete(req, ret);
+       return 0;
+ }
+ 
+ static int io_shutdown_prep(struct io_kiocb *req,
+                           const struct io_uring_sqe *sqe)
+ {
+ #if defined(CONFIG_NET)
+       if (unlikely(req->ctx->flags & IORING_SETUP_IOPOLL))
+               return -EINVAL;
+       if (sqe->ioprio || sqe->off || sqe->addr || sqe->rw_flags ||
+           sqe->buf_index)
+               return -EINVAL;
+ 
+       req->shutdown.how = READ_ONCE(sqe->len);
+       return 0;
+ #else
+       return -EOPNOTSUPP;
+ #endif
+ }
+ 
+ static int io_shutdown(struct io_kiocb *req, bool force_nonblock)
+ {
+ #if defined(CONFIG_NET)
+       struct socket *sock;
+       int ret;
+ 
+       if (force_nonblock)
+               return -EAGAIN;
+ 
 -              return ret;
++      sock = sock_from_file(req->file);
+       if (unlikely(!sock))
++              return -ENOTSOCK;
+ 
+       ret = __sys_shutdown_sock(sock, req->shutdown.how);
+       io_req_complete(req, ret);
+       return 0;
+ #else
+       return -EOPNOTSUPP;
+ #endif
+ }
+ 
  static int __io_splice_prep(struct io_kiocb *req,
                            const struct io_uring_sqe *sqe)
  {