253{
254 int ret = 0;
255 struct mnt_writer *cpu_writer;
256
257 cpu_writer = &get_cpu_var(mnt_writers);
258 spin_lock(&cpu_writer->lock);
259 if (__mnt_is_readonly(mnt)) {
260 ret = -EROFS;
261 goto out;
262 }
263 use_cpu_writer_for_mount(cpu_writer, mnt);
264 cpu_writer->count++;
265out:
266 spin_unlock(&cpu_writer->lock);
267 put_cpu_var(mnt_writers);
268 return ret;
269}
270EXPORT_SYMBOL_GPL(mnt_want_write);
271
272static void lock_mnt_writers(void)
273{
274 int cpu;
275 struct mnt_writer *cpu_writer;
276
277 for_each_possible_cpu(cpu) {
278 cpu_writer = &per_cpu(mnt_writers, cpu);
279 spin_lock(&cpu_writer->lock);
280 __clear_mnt_count(cpu_writer);
281 cpu_writer->mnt = NULL;
282 }
283}
284
285
286
287
288
289
290
291
292static void handle_write_count_underflow(struct vfsmount *mnt)
293{