Skip to content

Commit 1819a90

Browse files
namjaejeonsmfrench
authored andcommitted
ksmbd: reorganize ksmbd_iov_pin_rsp()
If ksmbd_iov_pin_rsp fail, io vertor should be rollback. This patch moves memory allocations to before setting the io vector to avoid rollbacks. Fixes: e2b76ab ("ksmbd: add support for read compound") Signed-off-by: Namjae Jeon <[email protected]> Signed-off-by: Steve French <[email protected]>
1 parent eacc655 commit 1819a90

File tree

1 file changed

+22
-21
lines changed

1 file changed

+22
-21
lines changed

fs/smb/server/ksmbd_work.c

Lines changed: 22 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -95,11 +95,28 @@ bool ksmbd_queue_work(struct ksmbd_work *work)
9595
return queue_work(ksmbd_wq, &work->work);
9696
}
9797

98-
static int ksmbd_realloc_iov_pin(struct ksmbd_work *work, void *ib,
99-
unsigned int ib_len)
98+
static inline void __ksmbd_iov_pin(struct ksmbd_work *work, void *ib,
99+
unsigned int ib_len)
100100
{
101+
work->iov[++work->iov_idx].iov_base = ib;
102+
work->iov[work->iov_idx].iov_len = ib_len;
103+
work->iov_cnt++;
104+
}
105+
106+
static int __ksmbd_iov_pin_rsp(struct ksmbd_work *work, void *ib, int len,
107+
void *aux_buf, unsigned int aux_size)
108+
{
109+
struct aux_read *ar;
110+
int need_iov_cnt = 1;
101111

102-
if (work->iov_alloc_cnt <= work->iov_cnt) {
112+
if (aux_size) {
113+
need_iov_cnt++;
114+
ar = kmalloc(sizeof(struct aux_read), GFP_KERNEL);
115+
if (!ar)
116+
return -ENOMEM;
117+
}
118+
119+
if (work->iov_alloc_cnt < work->iov_cnt + need_iov_cnt) {
103120
struct kvec *new;
104121

105122
work->iov_alloc_cnt += 4;
@@ -111,16 +128,6 @@ static int ksmbd_realloc_iov_pin(struct ksmbd_work *work, void *ib,
111128
work->iov = new;
112129
}
113130

114-
work->iov[++work->iov_idx].iov_base = ib;
115-
work->iov[work->iov_idx].iov_len = ib_len;
116-
work->iov_cnt++;
117-
118-
return 0;
119-
}
120-
121-
static int __ksmbd_iov_pin_rsp(struct ksmbd_work *work, void *ib, int len,
122-
void *aux_buf, unsigned int aux_size)
123-
{
124131
/* Plus rfc_length size on first iov */
125132
if (!work->iov_idx) {
126133
work->iov[work->iov_idx].iov_base = work->response_buf;
@@ -129,19 +136,13 @@ static int __ksmbd_iov_pin_rsp(struct ksmbd_work *work, void *ib, int len,
129136
work->iov_cnt++;
130137
}
131138

132-
ksmbd_realloc_iov_pin(work, ib, len);
139+
__ksmbd_iov_pin(work, ib, len);
133140
inc_rfc1001_len(work->iov[0].iov_base, len);
134141

135142
if (aux_size) {
136-
struct aux_read *ar;
137-
138-
ksmbd_realloc_iov_pin(work, aux_buf, aux_size);
143+
__ksmbd_iov_pin(work, aux_buf, aux_size);
139144
inc_rfc1001_len(work->iov[0].iov_base, aux_size);
140145

141-
ar = kmalloc(sizeof(struct aux_read), GFP_KERNEL);
142-
if (!ar)
143-
return -ENOMEM;
144-
145146
ar->buf = aux_buf;
146147
list_add(&ar->entry, &work->aux_read_list);
147148
}

0 commit comments

Comments
 (0)