1003
1113
EXPORT_SYMBOL(p9_client_fcreate);
1115
int p9_client_symlink(struct p9_fid *dfid, char *name, char *symtgt, gid_t gid,
1119
struct p9_client *clnt;
1120
struct p9_req_t *req;
1122
P9_DPRINTK(P9_DEBUG_9P, ">>> TSYMLINK dfid %d name %s symtgt %s\n",
1123
dfid->fid, name, symtgt);
1126
req = p9_client_rpc(clnt, P9_TSYMLINK, "dssd", dfid->fid, name, symtgt,
1133
err = p9pdu_readf(req->rc, clnt->proto_version, "Q", qid);
1135
p9pdu_dump(1, req->rc);
1136
goto free_and_error;
1139
P9_DPRINTK(P9_DEBUG_9P, "<<< RSYMLINK qid %x.%llx.%x\n",
1140
qid->type, (unsigned long long)qid->path, qid->version);
1143
p9_free_req(clnt, req);
1147
EXPORT_SYMBOL(p9_client_symlink);
1149
int p9_client_link(struct p9_fid *dfid, struct p9_fid *oldfid, char *newname)
1151
struct p9_client *clnt;
1152
struct p9_req_t *req;
1154
P9_DPRINTK(P9_DEBUG_9P, ">>> TLINK dfid %d oldfid %d newname %s\n",
1155
dfid->fid, oldfid->fid, newname);
1157
req = p9_client_rpc(clnt, P9_TLINK, "dds", dfid->fid, oldfid->fid,
1160
return PTR_ERR(req);
1162
P9_DPRINTK(P9_DEBUG_9P, "<<< RLINK\n");
1163
p9_free_req(clnt, req);
1166
EXPORT_SYMBOL(p9_client_link);
1168
int p9_client_fsync(struct p9_fid *fid, int datasync)
1171
struct p9_client *clnt;
1172
struct p9_req_t *req;
1174
P9_DPRINTK(P9_DEBUG_9P, ">>> TFSYNC fid %d datasync:%d\n",
1175
fid->fid, datasync);
1179
req = p9_client_rpc(clnt, P9_TFSYNC, "dd", fid->fid, datasync);
1185
P9_DPRINTK(P9_DEBUG_9P, "<<< RFSYNC fid %d\n", fid->fid);
1187
p9_free_req(clnt, req);
1192
EXPORT_SYMBOL(p9_client_fsync);
1005
1194
int p9_client_clunk(struct p9_fid *fid)
1008
1197
struct p9_client *clnt;
1009
1198
struct p9_req_t *req;
1201
P9_EPRINTK(KERN_WARNING, "Trying to clunk with NULL fid\n");
1011
1206
P9_DPRINTK(P9_DEBUG_9P, ">>> TCLUNK fid %d\n", fid->fid);
1013
1208
clnt = fid->clnt;
1211
1402
EXPORT_SYMBOL(p9_client_stat);
1213
static int p9_client_statsize(struct p9_wstat *wst, int optional)
1404
struct p9_stat_dotl *p9_client_getattr_dotl(struct p9_fid *fid,
1408
struct p9_client *clnt;
1409
struct p9_stat_dotl *ret = kmalloc(sizeof(struct p9_stat_dotl),
1411
struct p9_req_t *req;
1413
P9_DPRINTK(P9_DEBUG_9P, ">>> TGETATTR fid %d, request_mask %lld\n",
1414
fid->fid, request_mask);
1417
return ERR_PTR(-ENOMEM);
1422
req = p9_client_rpc(clnt, P9_TGETATTR, "dq", fid->fid, request_mask);
1428
err = p9pdu_readf(req->rc, clnt->proto_version, "A", ret);
1430
p9pdu_dump(1, req->rc);
1431
p9_free_req(clnt, req);
1435
P9_DPRINTK(P9_DEBUG_9P,
1436
"<<< RGETATTR st_result_mask=%lld\n"
1437
"<<< qid=%x.%llx.%x\n"
1438
"<<< st_mode=%8.8x st_nlink=%llu\n"
1439
"<<< st_uid=%d st_gid=%d\n"
1440
"<<< st_rdev=%llx st_size=%llx st_blksize=%llu st_blocks=%llu\n"
1441
"<<< st_atime_sec=%lld st_atime_nsec=%lld\n"
1442
"<<< st_mtime_sec=%lld st_mtime_nsec=%lld\n"
1443
"<<< st_ctime_sec=%lld st_ctime_nsec=%lld\n"
1444
"<<< st_btime_sec=%lld st_btime_nsec=%lld\n"
1445
"<<< st_gen=%lld st_data_version=%lld",
1446
ret->st_result_mask, ret->qid.type, ret->qid.path,
1447
ret->qid.version, ret->st_mode, ret->st_nlink, ret->st_uid,
1448
ret->st_gid, ret->st_rdev, ret->st_size, ret->st_blksize,
1449
ret->st_blocks, ret->st_atime_sec, ret->st_atime_nsec,
1450
ret->st_mtime_sec, ret->st_mtime_nsec, ret->st_ctime_sec,
1451
ret->st_ctime_nsec, ret->st_btime_sec, ret->st_btime_nsec,
1452
ret->st_gen, ret->st_data_version);
1454
p9_free_req(clnt, req);
1459
return ERR_PTR(err);
1461
EXPORT_SYMBOL(p9_client_getattr_dotl);
1463
static int p9_client_statsize(struct p9_wstat *wst, int proto_version)
1467
/* NOTE: size shouldn't include its own length */
1217
1468
/* size[2] type[2] dev[4] qid[13] */
1218
1469
/* mode[4] atime[4] mtime[4] length[8]*/
1219
1470
/* name[s] uid[s] gid[s] muid[s] */
1220
ret = 2+2+4+13+4+4+4+8+2+2+2+2;
1471
ret = 2+4+13+4+4+4+8+2+2+2+2;
1223
1474
ret += strlen(wst->name);
1273
1525
EXPORT_SYMBOL(p9_client_wstat);
1527
int p9_client_setattr(struct p9_fid *fid, struct p9_iattr_dotl *p9attr)
1530
struct p9_req_t *req;
1531
struct p9_client *clnt;
1535
P9_DPRINTK(P9_DEBUG_9P, ">>> TSETATTR fid %d\n", fid->fid);
1536
P9_DPRINTK(P9_DEBUG_9P,
1537
" valid=%x mode=%x uid=%d gid=%d size=%lld\n"
1538
" atime_sec=%lld atime_nsec=%lld\n"
1539
" mtime_sec=%lld mtime_nsec=%lld\n",
1540
p9attr->valid, p9attr->mode, p9attr->uid, p9attr->gid,
1541
p9attr->size, p9attr->atime_sec, p9attr->atime_nsec,
1542
p9attr->mtime_sec, p9attr->mtime_nsec);
1544
req = p9_client_rpc(clnt, P9_TSETATTR, "dI", fid->fid, p9attr);
1550
P9_DPRINTK(P9_DEBUG_9P, "<<< RSETATTR fid %d\n", fid->fid);
1551
p9_free_req(clnt, req);
1555
EXPORT_SYMBOL(p9_client_setattr);
1557
int p9_client_statfs(struct p9_fid *fid, struct p9_rstatfs *sb)
1560
struct p9_req_t *req;
1561
struct p9_client *clnt;
1566
P9_DPRINTK(P9_DEBUG_9P, ">>> TSTATFS fid %d\n", fid->fid);
1568
req = p9_client_rpc(clnt, P9_TSTATFS, "d", fid->fid);
1574
err = p9pdu_readf(req->rc, clnt->proto_version, "ddqqqqqqd", &sb->type,
1575
&sb->bsize, &sb->blocks, &sb->bfree, &sb->bavail,
1576
&sb->files, &sb->ffree, &sb->fsid, &sb->namelen);
1578
p9pdu_dump(1, req->rc);
1579
p9_free_req(clnt, req);
1583
P9_DPRINTK(P9_DEBUG_9P, "<<< RSTATFS fid %d type 0x%lx bsize %ld "
1584
"blocks %llu bfree %llu bavail %llu files %llu ffree %llu "
1585
"fsid %llu namelen %ld\n",
1586
fid->fid, (long unsigned int)sb->type, (long int)sb->bsize,
1587
sb->blocks, sb->bfree, sb->bavail, sb->files, sb->ffree,
1588
sb->fsid, (long int)sb->namelen);
1590
p9_free_req(clnt, req);
1594
EXPORT_SYMBOL(p9_client_statfs);
1596
int p9_client_rename(struct p9_fid *fid, struct p9_fid *newdirfid, char *name)
1599
struct p9_req_t *req;
1600
struct p9_client *clnt;
1605
P9_DPRINTK(P9_DEBUG_9P, ">>> TRENAME fid %d newdirfid %d name %s\n",
1606
fid->fid, newdirfid->fid, name);
1608
req = p9_client_rpc(clnt, P9_TRENAME, "dds", fid->fid,
1609
newdirfid->fid, name);
1615
P9_DPRINTK(P9_DEBUG_9P, "<<< RRENAME fid %d\n", fid->fid);
1617
p9_free_req(clnt, req);
1621
EXPORT_SYMBOL(p9_client_rename);
1624
* An xattrwalk without @attr_name gives the fid for the lisxattr namespace
1626
struct p9_fid *p9_client_xattrwalk(struct p9_fid *file_fid,
1627
const char *attr_name, u64 *attr_size)
1630
struct p9_req_t *req;
1631
struct p9_client *clnt;
1632
struct p9_fid *attr_fid;
1635
clnt = file_fid->clnt;
1636
attr_fid = p9_fid_create(clnt);
1637
if (IS_ERR(attr_fid)) {
1638
err = PTR_ERR(attr_fid);
1642
P9_DPRINTK(P9_DEBUG_9P,
1643
">>> TXATTRWALK file_fid %d, attr_fid %d name %s\n",
1644
file_fid->fid, attr_fid->fid, attr_name);
1646
req = p9_client_rpc(clnt, P9_TXATTRWALK, "dds",
1647
file_fid->fid, attr_fid->fid, attr_name);
1652
err = p9pdu_readf(req->rc, clnt->proto_version, "q", attr_size);
1654
p9pdu_dump(1, req->rc);
1655
p9_free_req(clnt, req);
1658
p9_free_req(clnt, req);
1659
P9_DPRINTK(P9_DEBUG_9P, "<<< RXATTRWALK fid %d size %llu\n",
1660
attr_fid->fid, *attr_size);
1663
p9_client_clunk(attr_fid);
1666
if (attr_fid && (attr_fid != file_fid))
1667
p9_fid_destroy(attr_fid);
1669
return ERR_PTR(err);
1671
EXPORT_SYMBOL_GPL(p9_client_xattrwalk);
1673
int p9_client_xattrcreate(struct p9_fid *fid, const char *name,
1674
u64 attr_size, int flags)
1677
struct p9_req_t *req;
1678
struct p9_client *clnt;
1680
P9_DPRINTK(P9_DEBUG_9P,
1681
">>> TXATTRCREATE fid %d name %s size %lld flag %d\n",
1682
fid->fid, name, (long long)attr_size, flags);
1685
req = p9_client_rpc(clnt, P9_TXATTRCREATE, "dsqd",
1686
fid->fid, name, attr_size, flags);
1691
P9_DPRINTK(P9_DEBUG_9P, "<<< RXATTRCREATE fid %d\n", fid->fid);
1692
p9_free_req(clnt, req);
1696
EXPORT_SYMBOL_GPL(p9_client_xattrcreate);
1698
int p9_client_readdir(struct p9_fid *fid, char *data, u32 count, u64 offset)
1700
int err, rsize, total;
1701
struct p9_client *clnt;
1702
struct p9_req_t *req;
1705
P9_DPRINTK(P9_DEBUG_9P, ">>> TREADDIR fid %d offset %llu count %d\n",
1706
fid->fid, (long long unsigned) offset, count);
1712
rsize = fid->iounit;
1713
if (!rsize || rsize > clnt->msize-P9_READDIRHDRSZ)
1714
rsize = clnt->msize - P9_READDIRHDRSZ;
1719
req = p9_client_rpc(clnt, P9_TREADDIR, "dqd", fid->fid, offset, rsize);
1725
err = p9pdu_readf(req->rc, clnt->proto_version, "D", &count, &dataptr);
1727
p9pdu_dump(1, req->rc);
1728
goto free_and_error;
1731
P9_DPRINTK(P9_DEBUG_9P, "<<< RREADDIR count %d\n", count);
1734
memmove(data, dataptr, count);
1736
p9_free_req(clnt, req);
1740
p9_free_req(clnt, req);
1744
EXPORT_SYMBOL(p9_client_readdir);
1746
int p9_client_mknod_dotl(struct p9_fid *fid, char *name, int mode,
1747
dev_t rdev, gid_t gid, struct p9_qid *qid)
1750
struct p9_client *clnt;
1751
struct p9_req_t *req;
1755
P9_DPRINTK(P9_DEBUG_9P, ">>> TMKNOD fid %d name %s mode %d major %d "
1756
"minor %d\n", fid->fid, name, mode, MAJOR(rdev), MINOR(rdev));
1757
req = p9_client_rpc(clnt, P9_TMKNOD, "dsdddd", fid->fid, name, mode,
1758
MAJOR(rdev), MINOR(rdev), gid);
1760
return PTR_ERR(req);
1762
err = p9pdu_readf(req->rc, clnt->proto_version, "Q", qid);
1764
p9pdu_dump(1, req->rc);
1767
P9_DPRINTK(P9_DEBUG_9P, "<<< RMKNOD qid %x.%llx.%x\n", qid->type,
1768
(unsigned long long)qid->path, qid->version);
1771
p9_free_req(clnt, req);
1775
EXPORT_SYMBOL(p9_client_mknod_dotl);
1777
int p9_client_mkdir_dotl(struct p9_fid *fid, char *name, int mode,
1778
gid_t gid, struct p9_qid *qid)
1781
struct p9_client *clnt;
1782
struct p9_req_t *req;
1786
P9_DPRINTK(P9_DEBUG_9P, ">>> TMKDIR fid %d name %s mode %d gid %d\n",
1787
fid->fid, name, mode, gid);
1788
req = p9_client_rpc(clnt, P9_TMKDIR, "dsdd", fid->fid, name, mode,
1791
return PTR_ERR(req);
1793
err = p9pdu_readf(req->rc, clnt->proto_version, "Q", qid);
1795
p9pdu_dump(1, req->rc);
1798
P9_DPRINTK(P9_DEBUG_9P, "<<< RMKDIR qid %x.%llx.%x\n", qid->type,
1799
(unsigned long long)qid->path, qid->version);
1802
p9_free_req(clnt, req);
1806
EXPORT_SYMBOL(p9_client_mkdir_dotl);
1808
int p9_client_lock_dotl(struct p9_fid *fid, struct p9_flock *flock, u8 *status)
1811
struct p9_client *clnt;
1812
struct p9_req_t *req;
1816
P9_DPRINTK(P9_DEBUG_9P, ">>> TLOCK fid %d type %i flags %d "
1817
"start %lld length %lld proc_id %d client_id %s\n",
1818
fid->fid, flock->type, flock->flags, flock->start,
1819
flock->length, flock->proc_id, flock->client_id);
1821
req = p9_client_rpc(clnt, P9_TLOCK, "dbdqqds", fid->fid, flock->type,
1822
flock->flags, flock->start, flock->length,
1823
flock->proc_id, flock->client_id);
1826
return PTR_ERR(req);
1828
err = p9pdu_readf(req->rc, clnt->proto_version, "b", status);
1830
p9pdu_dump(1, req->rc);
1833
P9_DPRINTK(P9_DEBUG_9P, "<<< RLOCK status %i\n", *status);
1835
p9_free_req(clnt, req);
1839
EXPORT_SYMBOL(p9_client_lock_dotl);
1841
int p9_client_getlock_dotl(struct p9_fid *fid, struct p9_getlock *glock)
1844
struct p9_client *clnt;
1845
struct p9_req_t *req;
1849
P9_DPRINTK(P9_DEBUG_9P, ">>> TGETLOCK fid %d, type %i start %lld "
1850
"length %lld proc_id %d client_id %s\n", fid->fid, glock->type,
1851
glock->start, glock->length, glock->proc_id, glock->client_id);
1853
req = p9_client_rpc(clnt, P9_TGETLOCK, "dbqqds", fid->fid, glock->type,
1854
glock->start, glock->length, glock->proc_id, glock->client_id);
1857
return PTR_ERR(req);
1859
err = p9pdu_readf(req->rc, clnt->proto_version, "bqqds", &glock->type,
1860
&glock->start, &glock->length, &glock->proc_id,
1863
p9pdu_dump(1, req->rc);
1866
P9_DPRINTK(P9_DEBUG_9P, "<<< RGETLOCK type %i start %lld length %lld "
1867
"proc_id %d client_id %s\n", glock->type, glock->start,
1868
glock->length, glock->proc_id, glock->client_id);
1870
p9_free_req(clnt, req);
1873
EXPORT_SYMBOL(p9_client_getlock_dotl);
1875
int p9_client_readlink(struct p9_fid *fid, char **target)
1878
struct p9_client *clnt;
1879
struct p9_req_t *req;
1883
P9_DPRINTK(P9_DEBUG_9P, ">>> TREADLINK fid %d\n", fid->fid);
1885
req = p9_client_rpc(clnt, P9_TREADLINK, "d", fid->fid);
1887
return PTR_ERR(req);
1889
err = p9pdu_readf(req->rc, clnt->proto_version, "s", target);
1891
p9pdu_dump(1, req->rc);
1894
P9_DPRINTK(P9_DEBUG_9P, "<<< RREADLINK target %s\n", *target);
1896
p9_free_req(clnt, req);
1899
EXPORT_SYMBOL(p9_client_readlink);